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

news/2024/11/25 13:29:15/

       使用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很感兴趣!不断充实自我技能提升,我也想拿高工资啊(手动捂脸)!


http://www.ppmy.cn/news/287007.html

相关文章

STM32+W5500网络通信

这里写目录标题 1. W5500模块实现数据通信1. 基本原理2. 程序实现 2. DHCP自动获取IP1. 基本原理2. 程序实现 3. modbus协议1. 基本原理2. 实现过程 4. STM32W5500实现web服务1. 基本原理2. 程序实现 5. 总结参考 1. W5500模块实现数据通信 引脚初始化&#xff0c;此连线方式用…

蓝牙低功耗CC2640R2F+W5500SPI通信

CC2640R2FW5500SPI通信&#xff08;1&#xff09; 使用的开发板是TI公司的蓝牙BLE CC2640R2F&#xff0c;主要研究的是CC2640R2F与以太网模块W5500的spi通信&#xff0c;使用的代码调试软件为CCS&#xff0c; 将原本在51单片机上运行的W5500例程&#xff0c;移植到CC2640R2F的…

W5500作为服务器突然断线

大家是否遇到过这样的问题&#xff0c;W5500作为服务器已经建立连接&#xff0c;突然网线掉了&#xff0c;然后再去连接W5500&#xff0c;就连不上了。为什么&#xff1f;下面对这个问题进行解释说明&#xff0c;并提出解决办法。 图1中的上位机程序作为客户端&#xff0c;连接…

STM32/TMS320F2812+W5500硬软件调试总结

使用STM32W5500方案是一种比较节省CPU开支的方案&#xff0c;无需多余的CPU资源管理Lwip协议。 调试的时候很多情况下无法通信&#xff0c;现结合笔者近10年的调试经验&#xff08;每次用W5500做板子&#xff0c;不会说是一帆风顺的- -&#xff09;&#xff0c;总结一下经常出…

基于STM32F407+W5500的freemodbus tcp移植与实现

环境&#xff1a;STM32CUBEMX6.6.1 MDK532 freemodbus1.6 首先是创建能驱动W5500的工程 主要用到硬件为SPI UART SPI速度建议不要太快&#xff0c;SPI1可以设置到40M&#xff0c;但是没必要这么快。 导出工程 添加fputc重定义 找到W5500官方例子 参考例程WIZnet W5500/W…

Stm32F407与W5500用DMA通信

详见 https://javakys.wordpress.com/2014/09/04/upgrade-w5500-throughput-on-nucleo-stm32f401re-using-spi-dma/

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

前段时间布置的任务是弄w5500的驱动&#xff0c;w5500本身硬件就具有tcp/ip协议&#xff0c;这样就省去了再把tcp协议栈移植到Uclinux的麻烦&#xff0c;而且我的存储空间一直是不够用的&#xff0c;所以选择w5500作为一个网卡来使用是再合适不过。 仔细看了一遍w5500的说明pdf…

W5500寄存器描述

4 寄存器描述 4.1 通用寄存器 MR (模式寄存器 - Mode Register) [R/W] [0x0000] [0x00]2 2 注脚符号 : 【可读/写】【内存地址】【默认值】 - [Read/Write] [Address] [Reset value] 该寄存器用于 S/W 复位&#xff0c;ping block模式和PPPoE模式。 表格 6 通用寄存器描述…