STM32cubemx_W5500_TCP和Modbus/TCP

以STM32f103zet6开发板为平台
使用STM32cubemx进行一些串口,spi等接口的初始化。
使用的是野火的w5500模块,以tcp sever为基础,进行移植。

链接:https://pan.baidu.com/s/17wTbt6QHoRTLKayxPAgt9g
提取码:8z7z

先对一些置位函数进行一些填写
HAL库中没有,自己封装一些

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET);
}void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET);
}

实现SPI读写功能

uint8_t SPI_SendByte(uint8_t byte)
{uint8_t rxbyte=0;uint8_t SPITimeout =200;while(__HAL_SPI_GET_FLAG(&hspi2,SPI_FLAG_TXE)==RESET){if((SPITimeout--)==0)
HAL_SPI_ErrorCallback(&hspi2);return 0;}HAL_SPI_TransmitReceive(&hspi2,&byte,&rxbyte,1,100);return rxbyte;
}

对原来的读写函数进行替换

/**
*@brief        STM32 SPI1读写8位数据
*@param        dat写入的八位数据
*@return   无
*/
uint8  IINCHIP_SpiSendData(uint8 dat)
{return(SPI_SendByte(dat));
}

SPI的读函数其实就是发送空数据,然后读出数据,(发送空数据就是为了给读提供时钟,SPI的时钟由主机发起)

向w5500写数据,w5500写有两种模式
固定数据长度模式FDM(NiRen的驱动)和可变数据长度模式VDM(野火的驱动)

SPI 的数据帧是由地址段(16位)+控制段(8位)+数据段组成
控制段高五位是区域选择位(即是选择通用寄存器还是socket n寄存器)控制段低两位选择VDM还是FDM模式 第三位是读写控制位。
具体的寄存器内容和数据帧格式需要查阅官方参考文档
以上面为基础向W5500写入一个8位数据

/**
*@brief        写入一个8位数据到W5500
*@param        addrbsb: 写入数据的地址
*@param   data写入的8位数据
*@return   无
*/
void IINCHIP_WRITE( uint32 addrbsb,  uint8 data)
{iinchip_csoff();                                   IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);//高八位    IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);//低八位IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);  //写VDM模式IINCHIP_SpiSendData(data);                   iinchip_cson();
}

上面addrbsb 是写入数据的地址
以通用寄存器GAR0为例 官方手册中 GAR0 的Offset为0x0001
先传高八位,后传低八位

#define GAR0                        (0x000100)

所以将GAR0地址代入IINCHIP_WRITE函数中,即是向通用寄存器GAR0写入数据(VDM模式)
同理 可得

/**
*@brief        从W5500读出一个8位数据
*@param        addrbsb: 写入数据的地址
*@param   data从写入的地址处读取到的8位数据
*@return   无
*/
uint8 IINCHIP_READ(uint32 addrbsb)
{uint8 data = 0;iinchip_csoff();                            IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);IINCHIP_SpiSendData( (addrbsb & 0x000000F8))    ;data = IINCHIP_SpiSendData(0x00);            iinchip_cson();                               return data;
}
/**
*@brief        从W5500读取len字节数据
*@param        addrbsb: 读出数据的地址
*@param    buf£存放读取数据
*@param        len£字符串长度
*@return   len£返回字符串长度
*/
uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len)
{uint16 idx = 0;if(len == 0){printf("Unexpected2 length 0\r\n");}iinchip_csoff();                                IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);IINCHIP_SpiSendData( (addrbsb & 0x000000F8));    for(idx = 0; idx < len; idx++)                   {buf[idx] = IINCHIP_SpiSendData(0x00);}iinchip_cson();                                  return len;
}

Sn_CR的地址是0x0001
socket n的寄存器地址 ch<<5 是改变控制字段中的区域选择位,来决定选择那个socket寄存器

#define Sn_CR(ch)                       (0x000108 + (ch<<5))

完成以上步骤 便可对w5500进行复位,设置mac等
设置mac即向SHAR0寄存器写数据

/**
*@brief        This function is to set up MAC address.
*@param        addr: a pointer to a 6 -byte array responsible to set the MAC address.
*@return   None
*/
void setSHAR(uint8 * addr)
{wiz_write_buf(SHAR0, addr, 6);
}

设置ip等 即是向w5500寄存器 写数据,然后读出寄存器内容,通过串口打印,调试等。

w5500还可以配置每个socket的发送接收缓存空间大小,也就是对寄存器 写值。

主程序中去不断查询寄存器n的Sn_SR寄存器,通过判断socket的状态,去执行对应操作
socket关闭状态,便设置socket n的模式为TCP模式,绑定端口号,No_Delay模式,设置socket的状态
init状态表示处于端口打开TCP工作模式,将Sn_CR变为listen状态进行监听
当有连接后变为establish状态,当建立状态后,清除中断标识位,获取接收数据长度,接收来自client的数据,添加字符串结束符
使用send向client发送数据
close wait状态 等待关闭, 便关闭socket

将TCP 调通之后,便可进行modbus tcp的调试
modbus tcp是使用tcp进行传输数据,只不过数据是按照modbus协议的格式,即modbus是应用层的协议,我们只需要通过w5500获取到传输的数据,对传输的数据进行解析,回复即可。

除了w5500以外 还使用过一款CH9121的以太网芯片,自带TCP/IP硬件协议栈,串口通信,更加方便,插上网线,便可使用软件进行配置ip等信息,很方便,也可以传输modbus tcp。

使用CH9121,只需要使用串口空闲中断,去接收不定长的数据,对接收到的数据进行解析或者其他的操作等。

MY_QuinTA的笔记

STM32cubemx_W5500_TCP和Modbus/TCP相关推荐

  1. tcp转串口_PROFIBUS DP与Modbus/TCP网络转换操作指南

    >>PROFIBUS DP转Modbus/TCP网关操作指南 摘要: 本文以NT100-RE-DP网关为例,实现Modbus/TCP Client与PROFIBUS DP设备间的通讯,从而 ...

  2. 10通信端口感叹号_S71200 技术篇——MODBUS TCP通信

    一.S7-1200 Modbus TCP 通信指令块 图1. Modbus TCP V4.0 版本指令块 二.S7-1200 Modbus TCP 实验环境 下面以两台S7-1200之间进行 Modb ...

  3. modbus tcp 入门详解

    Modbus tcp 格式说明 通讯机制 附C#测试工具用于学习,测试 前言: 之前的博客介绍了如何用C#来读写modbus tcp服务器的数据,文章:http://www.cnblogs.com/d ...

  4. js实现modbus_nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据

    nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据 在nodejs中安装modbus-serial库 本人使用的开发环境是Windows10下的VSCode,安装并配 ...

  5. DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

    DotNetty 实现 Modbus TCP 系列 (一) 报文类 DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例 DotNetty 作为一个 ...

  6. DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

    DotNetty 实现 Modbus TCP 系列 (一) 报文类 ModbusFunction 类图如下: 如前文所述,所有请求/相应的 PDU 均继承自 ModbusFunction,其子类传入对 ...

  7. DotNetty 实现 Modbus TCP 系列 (一) 报文类

    Modbus TCP/IP 报文 报文最大长度为 260 byte (ADU = 7 byte MBAP Header + 253 byte PDU) Length = Unit Identifier ...

  8. 客户机和服务器在s7通信中各有什么作用,哪些通信口可以进行 Modbus TCP 通讯,作为 Modbus 服务器的 SIMATIC S7 CPU 可以...

    以下通信端口可用于 Modbus/TCP 协议:在默认情况下,端口号 502 作为 Modbus 服务器的本地端口. 可以在 Modbus 客户机中设置需要的本地端口,通常使用从 2000 开始的端口 ...

  9. 1200可以读取modbus tcp_S7-1200 作 MODBUS TCP服务器

    S7-1200 Modbus TCP 通信指令块 STEP 7 V13 SP1 软件版本中的Modbus TCP库指令目前最新的版本已升至V4.0,该版本的使用需要具备以下两个条件: 1. 软件版本: ...

最新文章

  1. LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。...
  2. leetcode算法题--Can I Win
  3. 导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃
  4. tfs 未能在以下位置创建报表文件夹 /TfsReports: 授予的权限不足,无法执行此操作
  5. net 中web.config一个配置文件解决方法 (其他配置文件引入方式)
  6. 改进的筛素数法 2014-11-29 16:16 29人阅读 评论(0) 收藏...
  7. “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生
  8. SAP-BW数据仓库增量更新
  9. python web自动化测试框架搭建(功能接口)——功能测试模块
  10. ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求
  11. androidbenchmark和iphonebenchmark这两页面中设备信息爬虫
  12. 关于图片或者文件在数据库的存储方式归纳
  13. ROS2与C++入门教程-进程内(intra_process)话题发布和订阅演示
  14. 【Lesson 3】 小调音阶及小调和弦
  15. 红木家具之缅甸花梨家具
  16. 【保姆式教程】用PowerDesigner导出数据库表结构为Word/Excel表格
  17. python2 x和python3 x_python2.x 和python3.x 哪个比较好?老男孩Python
  18. 本周大新闻|FDA公布XR认证医疗名单,索尼推数字孪生平台Mapray
  19. java计算机毕业设计网上宠物商店源程序+mysql+系统+lw文档+远程调试
  20. SQL84 实习广场投递简历分析(一)

热门文章

  1. 计算机网络实验报告tcp,TCP 计算机网络实验报告
  2. 用于3D成像显微镜的双螺旋PSF
  3. 手机APP查询ERP数据(小程序)
  4. Win10系统笔记本耳机没有声音而外放却有
  5. ajax文件流下载文件之避坑指南
  6. 最强摸鱼神器:开着IDEA看股票,看小说...
  7. kettle java环境变量,kettle环境变量配置
  8. Win7资源管理器打开ftp站点自动跳转浏览器解决方法
  9. 信道编码 ldpc matlab,turbo,polar,LDPC信道编码
  10. android camera分辨率设置,如何使用OpenCV在Android中设置相机分辨率?