欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-01 18:33:29
...

       使用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网卡驱动(下)


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

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

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


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


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

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

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