目录
本篇以stm32F103为例。参考STM32F1-HAL库手册,本篇图取自手册里的插图,
一、CAN是什么?
各样的电子控制系统被开发了出来。 CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧
二、CAN通讯协议
CAN协议通过以下五种类型帧进行
-
数据帧
数据帧一般由七个部分组成
1)帧起始:表示数据帧开始的段。标准帧和拓展帧都是由1个位的显性电平表示帧起始
2)仲裁段:表示该帧优先级的段。
1.标准帧
ID有11位。从ID28到ID11被依次发送。禁止高七位都为隐形(ID=1111111XXXX)
2.拓展帧
ID有29位。基本ID从ID28到ID18,拓展ID由ID17到ID0。禁止高七位都为(ID=1111111XXXX)。
RTR:用于标识是否是远程帧(0:数据帧;1:远程帧)
SRR:代替了标准帧中的RTR位,代替远程请求位,为隐形位。
(拓展格式里出现)IDE:标识符选择位(0:使用标准标识符;1:使用扩展标识符)
3)控制段 :由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同
(D、R此处代表高、低电平)
r0,r1:必须全部以显性电平发送,但是接收端可以接收显性、隐性及 任意组合的电平。
DLC:数据长度表示段,高位在前,有效值为0~8,但接收方收到9~15也并不报错。
4)数据段:该段可包含0~8字节数据。标准帧和扩展帧在 这个段的定义都是一样。
5)CRC段:用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。
在CRC中有位填充。是为防止突发错误而设定的功能,当同样电平持续5位时则添加一个位的反型数据。
6)ACK段:此段用来确认是否正常接收。
发送单元 的ACK段:发送单元在 ACK 段发送 2 个位的隐性位。
接收单元的ACK段:接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发 送 ACK”或者“返回 ACK”
发送 ACK 的是 在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元 不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
7)帧结束:由 7 个位的隐性位组成。
位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
有关bxCAN介绍
STM32F1 自带的是 bxCAN,即基本扩展 CAN。它支持 CAN 协议 2.0A 和 2.0B。
CAN发送流程
程序选择一个空置邮箱(TME=1)→设置好ID,DLC与发送的数据→设置 CAN_TIxR 的 TXRQ 位为 1,请求发送→邮箱挂号(等待成为最高优先级)→ 预定发送(等待总线空闲)→发送→邮箱空置。
CAN接收流程
CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO(由硬件控制) 中。应用程序只能通过读取 FIFO 输出邮箱,来读取 FIFO 中最先收到的报文。
CAN 接收流程为:FIFO 空→收到有效报文→挂号_1(存入 FIFO 的一个邮箱,这个由硬件 控制)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→ 溢出。
值得注意的是,我们必须在FIFO溢出之前读出至少1个报文,否则FIFO溢出,报文丢失。每读一个报文,相应挂号就减一,直至FIFO空
总结
本篇写了一些本人觉得CAN里需要部分理解的概念,初学者可能有写地方理解不对,欢迎指正。