本帖最后由 hhh电子爱好者 于 2023-4-18 20:02 编辑
#技术资源# #每日话题# #申请原创# 基于cw32实现的多机通信
前言
- 本项目为芯源半导体发起的开发者扶持计划,更多详情:开始报名!CW32开发者扶持计划正式进行
- 感谢来自CW32生态社区的技术支持
- 支持国产芯片!!!
一,设计要求
要求针对于复杂的通信环境,设计一款用于多机互联的通信系统。
本系统采用CW32F030C8T6作为主控芯片
小板独立引出了IIC,SPI,另外接了一个USB转串口的CH340模块,以及一个RS485通信模块。
一个好看的最小系统板
二,整体的电路设计
该小板主要用于通信课程的课程设计,因此对所有管脚做了引出,对于几种常用的通信功能引脚都将该脚的接口按照习惯的顺序单独排列在了板子的周围
1,对于oled
对于板子上方的 IIC 接口可用于通信测试,也可用 OLED 屏幕的接口,该接口共有8ping ,顺序按照商家销售的小屏幕进行了排列
(4接口与8接口)
需要注意的是在使用八接口时需要将板子背面的控制线焊接,在使用4线就能完成时,其他端口均可以当成正常端口输出
2,对于RS485
本次设计采用的MAX1348通信芯片,该款芯片拥有两个版本对于 E 版可实现500kb/s的无差错通信,并且使用这种差分通信方式,在多机互接时只需要两个根线就可以实现消息的收发,更多关于RS485([店长的小西瓜:RS485通信](https://oshwhub.com/article/RS485tong-xin-zi-dong-shou-fa-dian-lu))
**同样对于该接口,在不使用时可不对连接处进行焊接** t1与t2
对于该接口焊接时,温度200最为合适
3,通信方案
基于modbus的思想,将一段信息分为了 起始,地址区,指令区,数据区,校验区,停止符
该段信息表示:起始符为 @,地址是 001,指令为 110,需要接收到的数据位65533,crc校验码 3CFC,并且附带了一个回车符但他是隐藏的,在这段数据中我为每段区域添加了一个 # 用于区分,在实际应用时去掉 # 判断,改为数据位判断一样可以实现
二,代码实现
1,数据处理
在使用串口发送文本数据时,发出的是ascll编码表的十进制数,进入单片机后会存储为十六进制数,我们需要根据各区域数据的用途,在提取数据时做出不同存储类型,如在提取编号时将编号存储为字符型可为我们提供更丰富编号选择 :A001;
2,crc校验
这是一个用于crc校验的计算器用于验证:[crc校验计算机](http://www.ip33.com/crc.html)
这个是部分的通信协议参考的crc模型,其中:
WIDTH:宽度,即生成的CRC数据位宽(0000/0000 0000/0000 0...)
POLY:十六进制多项式(可以看到在各模型中均有对应的多项式;如modbus模型,数据第16 15 2 1 这几个位为‘1’,再转换为十六进制),要注意的是省略了最高位
INIT:CRC初始值,和WIDTH位宽一致
XOROUT:计算结果与此参数进行异或运算后得到最终的CRC值
REFIN:true或false,在进行计算之前,原始数据是否翻转(要注意的是翻转是是按位翻转的,如:0011 == 1100)
REFOUT:true或false,运算完成之后,得到的CRC值是否进行翻转(同上)
POLY十六进制多项式,多项式忽视最高项式是就是POLY
CW32f030自带了crc校验以及相应的模型,因此我们无须具体的去写完一个校验,学会调用即可,且硬件自带的crc校验运行速度是要快于软件实现的,调用方法参考:[cw32官方程序移植参考](https://oshwhub.com/article/CW32-UART)
三,调试
1,点击这个地方可以进入调试模式
2,在这里可以添加一个变量观察窗口
3,将变量复制进串口,就可实时看到crc校验后的结果了
四,串口默认配置
1,需要注意的是在我写的代码里,数据停止位是换行 ,即需要在最后一个 # 后面按一次 enter 键
2,我在cw32里移植了一个RTOS,不使用可以直接删除,只用在了main.c函数中,移植过程:[cw32的RTOS移植](https://blog.csdn.net/qq_4899772 ... 1001.2014.3001.5501)
#### PCB板上方空余了两角空间可放置自己需要的通信模块
#### 背面焊接点按键示意
##### 4.14验证不同电源之间通信
##### 4.15 发送抢占
导图
代码实现
## 更多功能还在完善中
**预计完善 发送抢占 碰撞检测 报文转发**
**下载链接:正在审核**
|