1 CAN 原理
2 CAN 报文的结构。
回看图数据帧的结构 中的数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、IDE 和 SRR 位。
- (1) RTR 位 (Remote Transmission Request Bit),译作
远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。 - (2) IDE 位 (Identifier Extension Bit),译作
标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。 - (3) SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,
它用于替代标准格式中的 RTR 位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。 - (4) 控制段在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是
DLC 段(Data Length Code) - (5) 数据段,数据段为数据帧的核心内容,它是节点要发送的原始信息,由
0~8 个字节组成,MSB 先行。 - (6) CRC 段,为了保证报文的正确传输,CAN 的报文包含了一段
15 位的 CRC 校验码,一旦接收节点算出的 CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。 - (7) ACK 段,ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
- (8) 帧结束,EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送的
7 个隐性位表示结束。
3 STM32 的 CAN 架构剖析
3.1 CAN 测试模式
- 为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR 的 SILM 及 LBKM寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式,见图四种工作模式
3.2 CAN 波特率设置
3.3 CAN 发送FIFO
- 标识符寄存器 CAN_TIxR
3.4 CAN 接收 FIFO
- 跟发送邮箱类似,每个接收 FIFO 中包含有标识符寄存器 CAN_RIxR、数据长度控制寄存器CAN_RDTxR 及 2 个数据寄存器 CAN_RDLxR、CAN_RDHxR,它们的功能见表发送邮箱的寄存器。
3.5 CAN 验收筛选器
4 CAN FD总线控制器
5 CAN 2.0&CAN FD总线控制器对比