基于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是客户端,电脑是服务器。
最后的效果如下图,服务器与客户端成功进行tcp连接,打开用网络调试助手发送数据出去,stm32客户端的w5500应用程序是写接收到服务器的数据后,再打包发送到服务器,于是我们就可以看到在电脑网络调试助手上显示出接收到stm32客户端的数据,这样就实现服务器与客户端之间正常接收和发送数据,在Uclinux里也打印出所接收到的数据。
————————————————————————————————————
这是采用tcp的连接,用udp连接需要另外写程序设置(其实更简单),这样就通过w5500开出了一条沟通stm32到服务器的道理,由linux到服务器,但是这只是其中一种比较简易的应用,没投入到真正的应用之前也不敢说稳定较好。
上头吩咐下来要再移植继电保护103协议到其中,远的话还要移植104协议、649协议等等,103协议已经看得差不多了,相关一些简易代码也已移植进去,其实无非就是在w5500的应用程序上添砖加瓦,但以后的工作要与服务器主站那边进行协议调试,根据协议传送数据……这还得继续努力,不断学习!最近也在看安卓方面的框架,学习java很感兴趣!不断充实自我技能提升,我也想拿高工资啊(手动捂脸)!
上一篇: 杨辉三角形
推荐阅读
-
linux下安装编译网卡驱动的方法
-
装机后电脑没有网络的情况下,驱动人生6教你首先将网卡驱动安装好
-
SylixOS下基于NUC970的NAND驱动
-
[硬件配置]记录Ubuntu 14.04 下安装无线网卡驱动解决无法连接WiFi的过程
-
在Linux下确定网卡所使用驱动程序的方法
-
记录Ubuntu 14.04 下安装无线网卡驱动解决无法连接WiFi的过程
-
记录Ubuntu 14.04 下安装无线网卡驱动解决无法连接WiFi的过程
-
基于mini2440的Linux-3.18.108下LCD驱动移植
-
基于mini2440的Linux-3.18.108下以太网DM9000驱动的移植
-
ubuntu下腾达W541U V2.0 无线网卡驱动的使用