基于stm32f407下的W5500网卡驱动(下)

       使用w5500的目的是领导要求能从下位机通过tcp或者udp的形式把数据发到服务器上面去,进而把数据显示在服务器的网页上和传到手机的app上面显示。

       继上文添加好Uclinux的spidev驱动后,spi1的miso、mosi、clk、cs等接口已经能正常输出数据,确保了这些以后,我们就可以使用W5500这个网络模块来进行udp、tcp通信连接了。
       w5500模块类似于一个网卡,它里面用硬件集成有tcp/ip协议这样就不需要在Uclinux内核里再添加tcp协议栈(占用空间很大,现在使用的板子内存吃不消),而且操作方便,只需设置好w5500的ip地址、子网掩码、网关等,设置好它里面的socket(共有八个socket),无需繁杂的socket编程,设置好即可进行tcp、udp通信连接,而要设置好上面所说的这些玩意,一定是要用spi来设置,上一篇文章的spi驱动就为了这个目的。
       经过上文的步骤后,我们可以放心的编写一个应用程序来实现w5500的相关设置与tcp或者udp连接。
       这个应用程序最关键的就是spi的读写函数的实现,在参照了官方的spi读写应用程序,自己稍加修改后写的spi读写函数:
1、写函数:

void IINCHIP_WRITE( uint32 addrbsb,  uint8 data,int fd)
{

    struct spi_ioc_transfer xfer[2];
    unsigned char buf[2048], *bp;
    int len, status;

    memset(xfer, 0, sizeof xfer);
    memset(buf, 0, sizeof buf);
    len = sizeof buf;

   buf[0] = (addrbsb & 0x00FF0000)>>16;
   buf[1] = (addrbsb & 0x0000FF00)>> 8;
   buf[2] = (addrbsb & 0x000000F8) + 4;
   buf[3] =  data;

   xfer[0].tx_buf = (unsigned long)buf;
   xfer[0].len = 4;

   status = ioctl(fd, SPI_IOC_MESSAGE(1), xfer);

if (status < 0) {
perror("SPI_IOC_MESSAGE");
return;
}   

}

2、读函数:

uint8 IINCHIP_READ(uint32 addrbsb,int fd)
{
   uint8 data = 0;
   struct spi_ioc_transfer xfer[2];
    unsigned char buf[2048], *bp;
    int len, status;

    memset(xfer, 0, sizeof xfer);
    memset(buf, 0, sizeof buf);
    len = sizeof buf;


      buf[0] = (addrbsb & 0x00FF0000)>>16;
      buf[1] = (addrbsb & 0x0000FF00)>> 8;
      buf[2] = (addrbsb & 0x000000F8) ;

            len = 3;
            xfer[0].tx_buf = (unsigned long)buf;
            xfer[0].len = 3;


            xfer[1].rx_buf = (unsigned long) buf;
            xfer[1].len = 3;

            status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
            if (status < 0) {
            perror("SPI_IOC_MESSAGE");
            return;
            }


}

       关键的读写函数解决了,然后就可以利用读写函数来读写w5500里面的寄存器,进而设置w5500的ip地址、子网掩码、网关、端口号等,设置好它里面的socket(这些设置繁多程序不便列出,建议参照w5500的官方pdf来进行相关设置,我是从某网站下载了stm32f4的w5500 tcp/udp的keil工程文件,然后参照pdf来编写修改代码),从而实现tcp或者udp的通信连接。
       编写好应用程序后,编译无错误后生成可执行文件,把这个文件拷到Uclinux内核里面去,将w5500的miso、mosi、cs、clk与stm32的spi1的miso、mosi、cs、clk接口用杜邦线相连,用网线将w5500和电脑直连,此时stm32是客户端,电脑是服务器。


基于stm32f407下的W5500网卡驱动(下)_第1张图片


基于stm32f407下的W5500网卡驱动(下)_第2张图片

       最后的效果如下图,服务器与客户端成功进行tcp连接,打开用网络调试助手发送数据出去,stm32客户端的w5500应用程序是写接收到服务器的数据后,再打包发送到服务器,于是我们就可以看到在电脑网络调试助手上显示出接收到stm32客户端的数据,这样就实现服务器与客户端之间正常接收和发送数据,在Uclinux里也打印出所接收到的数据。

基于stm32f407下的W5500网卡驱动(下)_第3张图片


基于stm32f407下的W5500网卡驱动(下)_第4张图片


基于stm32f407下的W5500网卡驱动(下)_第5张图片

————————————————————————————————————
       这是采用tcp的连接,用udp连接需要另外写程序设置(其实更简单),这样就通过w5500开出了一条沟通stm32到服务器的道理,由linux到服务器,但是这只是其中一种比较简易的应用,没投入到真正的应用之前也不敢说稳定较好。

       上头吩咐下来要再移植继电保护103协议到其中,远的话还要移植104协议、649协议等等,103协议已经看得差不多了,相关一些简易代码也已移植进去,其实无非就是在w5500的应用程序上添砖加瓦,但以后的工作要与服务器主站那边进行协议调试,根据协议传送数据……这还得继续努力,不断学习!最近也在看安卓方面的框架,学习java很感兴趣!不断充实自我技能提升,我也想拿高工资啊(手动捂脸)!

你可能感兴趣的:(stm32,网卡,stm32,服务器,通信,w5500)