STM32cubemx_W5500_TCP和Modbus/TCP
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相关推荐
- tcp转串口_PROFIBUS DP与Modbus/TCP网络转换操作指南
>>PROFIBUS DP转Modbus/TCP网关操作指南 摘要: 本文以NT100-RE-DP网关为例,实现Modbus/TCP Client与PROFIBUS DP设备间的通讯,从而 ...
- 10通信端口感叹号_S71200 技术篇——MODBUS TCP通信
一.S7-1200 Modbus TCP 通信指令块 图1. Modbus TCP V4.0 版本指令块 二.S7-1200 Modbus TCP 实验环境 下面以两台S7-1200之间进行 Modb ...
- modbus tcp 入门详解
Modbus tcp 格式说明 通讯机制 附C#测试工具用于学习,测试 前言: 之前的博客介绍了如何用C#来读写modbus tcp服务器的数据,文章:http://www.cnblogs.com/d ...
- js实现modbus_nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据
nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据 在nodejs中安装modbus-serial库 本人使用的开发环境是Windows10下的VSCode,安装并配 ...
- DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler
DotNetty 实现 Modbus TCP 系列 (一) 报文类 DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例 DotNetty 作为一个 ...
- DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例
DotNetty 实现 Modbus TCP 系列 (一) 报文类 ModbusFunction 类图如下: 如前文所述,所有请求/相应的 PDU 均继承自 ModbusFunction,其子类传入对 ...
- DotNetty 实现 Modbus TCP 系列 (一) 报文类
Modbus TCP/IP 报文 报文最大长度为 260 byte (ADU = 7 byte MBAP Header + 253 byte PDU) Length = Unit Identifier ...
- 客户机和服务器在s7通信中各有什么作用,哪些通信口可以进行 Modbus TCP 通讯,作为 Modbus 服务器的 SIMATIC S7 CPU 可以...
以下通信端口可用于 Modbus/TCP 协议:在默认情况下,端口号 502 作为 Modbus 服务器的本地端口. 可以在 Modbus 客户机中设置需要的本地端口,通常使用从 2000 开始的端口 ...
- 1200可以读取modbus tcp_S7-1200 作 MODBUS TCP服务器
S7-1200 Modbus TCP 通信指令块 STEP 7 V13 SP1 软件版本中的Modbus TCP库指令目前最新的版本已升至V4.0,该版本的使用需要具备以下两个条件: 1. 软件版本: ...
最新文章
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。...
- leetcode算法题--Can I Win
- 导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃
- tfs 未能在以下位置创建报表文件夹 /TfsReports: 授予的权限不足,无法执行此操作
- net 中web.config一个配置文件解决方法 (其他配置文件引入方式)
- 改进的筛素数法 2014-11-29 16:16 29人阅读 评论(0) 收藏...
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生
- SAP-BW数据仓库增量更新
- python web自动化测试框架搭建(功能接口)——功能测试模块
- ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求
- androidbenchmark和iphonebenchmark这两页面中设备信息爬虫
- 关于图片或者文件在数据库的存储方式归纳
- ROS2与C++入门教程-进程内(intra_process)话题发布和订阅演示
- 【Lesson 3】 小调音阶及小调和弦
- 红木家具之缅甸花梨家具
- 【保姆式教程】用PowerDesigner导出数据库表结构为Word/Excel表格
- python2 x和python3 x_python2.x 和python3.x 哪个比较好?老男孩Python
- 本周大新闻|FDA公布XR认证医疗名单,索尼推数字孪生平台Mapray
- java计算机毕业设计网上宠物商店源程序+mysql+系统+lw文档+远程调试
- SQL84 实习广场投递简历分析(一)
热门文章
- 计算机网络实验报告tcp,TCP 计算机网络实验报告
- 用于3D成像显微镜的双螺旋PSF
- 手机APP查询ERP数据(小程序)
- Win10系统笔记本耳机没有声音而外放却有
- ajax文件流下载文件之避坑指南
- 最强摸鱼神器:开着IDEA看股票,看小说...
- kettle java环境变量,kettle环境变量配置
- Win7资源管理器打开ftp站点自动跳转浏览器解决方法
- 信道编码 ldpc matlab,turbo,polar,LDPC信道编码
- android camera分辨率设置,如何使用OpenCV在Android中设置相机分辨率?