CAN与CANOpen(一)_maifansnet的博客-CSDN博客_canopen
《CANOpen轻松入门》--周立功
目录
CAN既是一种总线,又是一种协议。
CAN总线协议只定义了物理层和数据链路层,在实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关软件或固件,只要了解如何调用相关的接口和寄存器,即可完成对CAN的控制。简单说,CAN总线就是一层硬件协议,比如:差分信号电平的定义,数据帧的定义等。
CAN网络拓扑结构如下图:
1. CAN组成
一个CAN节点主要包含:MCU应用程序、can控制器、can收发器。
(1)MCU应用程序可分为:
业务逻辑代码:根据项目需求而定,比如读取传感器数据并对其做出响应逻辑处理。
协议层代码:比如CANOpen。
底层驱动代码:配置CAN总线相应参数、控制收发的代码。
(2)CAN控制器:
我们一般说的xx芯片带有CAN,表示CAN控制器集成在芯片内了,只需要操作其中的寄存器即可。
(3)CAN收发器:
将CAN收发引脚(CAN_TX和CAN_RX)的TTL信号转换成CAN总线的差分电平信号。
2. 位填充
当同样的电平持续5位则添加一个位的反型数据。
(1)发送单元的工作:在发送数据帧和遥控帧时,SOF~CRC段间的数据,相同电平如果持续5位,在下一位则要插入1个与前5位反型的电平。
(2)接收单元的工作:在接收数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
3. 优先级
在CAN总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
当单元1仲裁失利后,自动转换为接收,同时控制器将会在下一轮继续发送这次未完成的数据。
数据帧和遥控帧的优先级:
具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
标准格式和扩展格式的优先级:
标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
4. 位时序
为了实现位同步,CAN协议把每一个数据位的时序分解成如下图所示的4个段。分解后的最小时间单位是Tq,而一个完整的位由8~25个Tq组成。
信号的采样点位于PBS1与PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。
CAN总线波特率
CAN总线属于异步通信(异步就是通信设备之间通过约定一样的时间来收发数据),而这个时间就会决定其波特率。
假设上图中的1Tq = 1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1 = 19us,从而每秒可以传输的数据位个数为:1x10^6/19 = 52631.6 (bps),即每秒可传输的数据位的个数称为通讯波特率。
5. 数据帧
帧起始:表示帧开始的段,1个位的显性位。
仲裁段:通过ID来判断总线上哪一个节点具有优先发送的权利。ID越小(显性为0),优先级越高。RTR = 0代表数据帧,RTR = 1代表远程帧。
控制段:4位的DLC,1个IDE(数值为0)位和r0保留位。
数据段:数据从MSB(最高位)开始输出。
CRC段:检查帧的传输错误的段,CAN报文包含一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈错误信息,利用错误帧请求它重新发送。CRC码一般由CAN控制器硬件计算得出,出错时的处理则由软件控制最大重发数。
ACK段:用来确认是否正常接收,由ACK槽和ACK界定符2个位构成。
- A.发送单元在 ACK 段发送 2 个位的隐性位。
- B.接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位, 通知发送单元正常接收结束。这称作“发送 ACK”或者“返回 ACK”。
帧结束:由7个隐性位构成。
版权声明:本文为CSDN博主「woshizuopie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/woshizuopie/article/details/122851934
暂无评论