学习知识点整理:
CAN 总线的前世今生:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=104480
wikibai百科CAN总线:
https://en.wikipedia.org/wiki/CAN_bus
瑞萨CAN入门教程:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=14546
Kvaser入门教程
Controller Area Network (CAN BUS) Protocol
MDK的CAN入门教程
KEIL早期制作的超详细STM32F4 CAN总线调试测试文档 - STM32F429 - 硬汉嵌入式论坛 - Powered by Discuz!
CANFD教程:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=104728
博世的CAN2.0和CANFD规格书
https://www.armbbs.cn/forum.php?mod=viewthread&tid=117358
CAN 总线结构
CAN总线结构分为闭环和开环两种模式,其中闭环的CAN总线网络,两端会链接120 欧 电阻
开环的CAN总线网络,两根信号线独立,各自串联 2.2 kΩ 电阻,
CAN 电气特性
CAN、CANFD 是差分通信,总线电平分为显性电平和隐性电平,总线必须处于两种电平之一,总线执行逻辑 与 ,显性电平为 0 隐性电平为 1 ;
帧的类型主要有:数据帧,遥控帧,错误帧,过载帧;帧间隔
数据帧
1、起始段:1位的显性位
2、仲裁段:数据优先级的段,从第一个bit开始仲裁,连续输出显性0最多的单元继续发送,仲裁失败转化为接收状态;
3、控制段:DLC字节数
4、数据段:经典can支持0-8 字节,CANFD支持 0- 64 字节;
5、CRC段: 经典can是15bit+1bit的 CRC 界定符(用于位分隔),CANFD是17 或者 21bit + 1 个界定符。CRC的计算方法包括起始段,仲裁段,控制段,数据段,接收方以相同的方式计算CRC的值并进行比较,不一致的话进行通报错误。
6、ACK段: 发送节点在ACK 段会发送一个 1 bit 的隐形1 ,接收节点在收到正确消息后会发送显性0 表示正确接收。
7、结束段:帧结束由7个bit的隐形1 组成
遥控帧
遥控帧用于接收单元向具有相同ID的发送单元请求数据的帧,CANFD 没有遥控帧,经典 CAN 有遥控帧,遥控帧相比于数据帧没有数据段。
错误帧
接收节点或者发送阶段检测出错误时,通知错误的帧
主动错误标志:6个bit的显性位
被动错误标志:6个bit的隐形位
外加8个bit的隐形位构成的错误界定符
发送过程:
1、设置发送节点的ID,DLC 数据等
2、设置CAN控制器,启动发送帧
3、任何节点在总线空闲时,都可以启动发送帧
4、所有节点都会等待接收数据,除了启动数据发送的节点
5、多个节点同时启动数据发送时,将进行仲裁,ID数值小的优先处理,ID大的停止发送,进入接收状态
6、当仅有一个节点发送数据时,若其他节点继续发送数据会导致数据异常
7、当发送节点的数据送达接收节点时,继续发送帧数据的借宿段,之后发送节点会进入接收状态或者继续发送下一帧数据,接收节点将处理收到的数据(开启过滤器的话,会根据过滤设置接收数据)
8、任何节点都可以发送数据,如果没有节点发送数据,总线将会进入空闲状态
相关问题
1、节点如何知道何时发送数据
CAN控制器持续监控总线,当看到所需的空闲位数(ACK位后大于等于11bit时,)此节点开始传输,其他节点也可以开始传输,仲裁将决定实际传输哪个消息。
2、发送错误怎么办?
所有节点,包括发送节点,都会监视总线是否存在错误,如果出错,一个节点或者多个节点将通过总线保持在逻辑0的方式向其他节点发出错误信号至少6个总线周期,此时,所有节点都注意到此错误事件并采取措施。
3、如何添加一个节点
只需要链接CANH 和 CANL 即可,如果CAN控制器还没有初始化,就什么也不会发送,如果已经初始化,CAN波特率必须与现有网络保持一致,否则会出现总线错误。
4、节点测插拔
任何干扰都会由CAN虚无检测方案处理,主动错误消息将导致总线错误和后续重传,如果 TEC 寄存器(发送错误寄存器)值超过128 (会转换为被动错误)或干扰时间较长,则可能会导致总线关闭错误bus-off。
CAN接收过程
接收过程:
1、所有节点除了发送数据的节点和正处于总线关闭状态得节点,都处于监听状态;
2、CAN 数据将按照前面说的发送过程进行数据发送
3、处于监听状态得节点都会收到数据,如果被认为是没有错误的CAN消息,监听节点会应答;
4、如果接收节点设置了CAN过滤器,将会根据过滤设置过滤掉不需要的消息。
5、收到有效消息,将存到 FIFO 等存储空间,用户会根据 DLC 值处理数据大小
相关问题:
1、接收数据丢失:
应用层做处理;
2、总线高负载情况下,怎么减少CAN控制器压力
(1)、使用过滤器,过滤不需要的消息;
(2)、消息间隔发送
(3)、利用FIFO、消息队列,缓冲等机制;
CAN错误处理:
检测到帧错误处理:
1、所有节点将拉低(显性电平0)总线至少6bit
2、超过5个bit相同极性,将触发位填充,这是由硬件完成
3、TEC等于 0xFF时候,总线关闭(一直错不能让你一直发)
4、所有其他节点放弃读取当前帧,REC接收错误计数器寄存器的值加X