CAN 协议具有一下特点
- 多主控制
1.在总线空闲时,所有单元都可以发送消息(多主控制),
2.两个以上的单元同时开始发送消息时,根据标识符(Identifier以下称为ID)决定优先级。
3.ID并不是表示发送的目的地址,而是表示访问总线的消息的优先级。
4.两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
- 通信速度较快,通信距离远。 最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)
- 具有错误检测、错误通知和错误恢复功能。
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)
- 故障封闭功能。
CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
5.系统的柔软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变
电平
显性电平对应逻辑 0, CAN_H 和 CAN_L 之差为 2V 左右。
隐性电平对应逻辑 1, CAN_H 和 CAN_L 之差为 0V。
注:总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。
CAN 协议
CAN 协议是通过以下 5 种类型的帧进行的:
- 数据帧
- 遥控帧
- 错误帧
- 过载帧
- 间隔帧
数据帧和遥控帧有标准格式和扩展格式两种格式
标准格式有 11 个位的标识符(ID)
扩展格式有 29 个位的 ID。
帧类型 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧 |
遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧 |
错误帧 | 用于当检测出错误时向其它单元通知错误的帧 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧 |
间隔帧 | 用于将数据帧及遥控帧与前面的帧分离开来的帧 |
数据帧
数据帧一般由 7 个段构成
帧起始。表示数据帧开始的段。
仲裁段。表示该帧优先级的段。
控制段。表示数据的字节数及保留位的段。
数据段。数据的内容,一帧可发送 0~8 个字节的数据。
CRC 段。检查帧的传输错误的段。
ACK 段。表示确认正常接收的段。
帧结束。表示数据帧结束的段。
数据帧格式
帧起始(1bit):
标准帧和扩展帧都是由 1 个位的显性电平表示帧起始
仲裁段(即ID):
标准帧:基本ID(7bit)+RTR(1bit)—> 一共8bit
扩展帧:基本ID (7bit)+ SRR (1bit) + IDE (1bit) + 扩展ID (18bit) +RTR(1bit)—>28bit
基本ID禁止高 7 位都为隐性(即禁止设定: ID=1111111XXXX)
RTR标识是否是远程帧(0,数据帧; 1,远程帧)
IDE 位为标识符选择位(0,使用标准标识符; 1,使用扩展标识符)
SRR 位为代替远程请求位
控制段(6bit)
标准帧:IDE (1bit) +r0 (1bit) +DLC(4bit)
扩展帧:r1 (1bit) + r0(1bit) +DLC(4bit)
DLC 段为数据长度表示段,高位在前, DLC 段有效值为 0~8 代表数据段长度为0~8字节
r0 和 r1 为保留位,必须全部以显性电平发送
数据段(64bit)
CRC 段 (16bit)
15 个位的 CRC 顺序和 1 个位的 CRC 界定符
ACK 段(2bit)
ACK 槽(1bit)
ACK 界定符(1bit)
帧结束(7bit)
由 7 个位的隐性位组成
位速率
1.由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。
2.一个位可分为 4 段。
同步段(SS)
传播时间段(PTS)
相位缓冲段 1(PBS1)
相位缓冲段 2(PBS2)
3.这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成,每个段由若干个 Tq 构成,这称为位时序
段作用和Tq数
参考
https://blog.csdn.net/weixin_42653531/article/details/81024740
关于采样点和波特率的计算公式
CAN波特率 = CAN时钟/( (1 + CAN_BS1 + CAN_BS2) * CAN_Prescaler)
sample = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)
CAN 过滤器
参考
https://blog.csdn.net/qq_35480173/article/details/98878309
can 中断
参考
https://blog.csdn.net/xiaoluyusj/article/details/135692380
CAN 邮箱
CAN发送邮箱
CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文
CAN接受邮箱
CAN外设一共有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文。
当接收到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,
通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的RFLM位,可设置锁定模式,
锁定模式下FIFO溢出时会丢弃新报文,非锁定模式下FIFO溢出时新报文会覆盖旧报文。
参考
https://jishuzhan.net/article/1782412269842337793