CAN-bus
约 1467 字大约 5 分钟
2025-03-25
CAN_BUS总线
简述一下

CAN-bus采用两根电缆线进行信号传输,分别命名为CAN_high 和CAN_Loq
利用电压差来判断总线电平,传输方式叫做差分传输。
注
电平信号只有两种,1代表隐形电平(高电平),0代表显性电平(低电平)。
重要
这两根线采用双绞线的方式抵抗共模干扰,原理就是两线相绞,同时应对变化。
隐形电平时开关断开,输出电压高电平,显性时开关闭合,输出电压低电压。

注
当总线上有多个链接的时候,如果有一个开关的线路闭合,线路输出低。这种样子的关系叫做线与,CAN控制器会监听总线上的电平和自己电平是否一致,如果不一致会进行处理,如果不一致发生在仲裁域,会让输出隐形电平的节点退出发送,如果在其他地方就会触发错误。
@ tab 同步以及填充
CAN-bus是异步串行通信,不传输同步信号。接收器按照波特率对总线电平进行分片,按照这个波特率设置的频率对总线进行读取。(异步的方式存在累计误差,所以有定时同步机制,如果有连续5位相同的会设置电平相反)
提示
UART也是串行异步,SPI是同步串行通信。
CAN帧
数据帧、远程帧、错误帧、过载帧、帧间隔。
- 数据帧:
| 帧起始 | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 |
|---|

仲裁段的实现原理:根据与总线相似度来表示优先级,再结合线上的"与"任何一个只要有显性“0”那么整条线就会呈现显性,也就是有0的情况下天然优先级高一些,如果发现电平状态不一致并且这个标志位在仲裁段就会放弃对于总线的使用权。
数据段发送0-8字节的内容。
CRC段的校验由CAN控制器自己完成。
ACK段来检验接受信息是否正常,如果没有任何错误就认为正常。那么就会在ACK的第一位设置显性位,根据ACK可以知道是否传输成功,如果失败了就可以更具自身状态决定是否重传。
- 错误帧
提示
错误一共可以概括位5种:
CRC校验错误
格式错误
应答错误
位发送错误
位填充错误
错误帧由错误标识符和错误界定符组成。
主动错误标识符:6个显性位组成
被动错误标识符:6个隐形位组成
如果在总线传输过程中,有一个节点发现了错误,那么就会给这个总线发送一个错误说明信息,让当前总线传输的数据帧作废,发送节点接受到数据之后,会根据条件进行重传。
同时每个CAN控制器有一个发送错误计数器以及一个接受错误计数器,根据计数不同,CAN节点会处于不同的状态。

- 帧间隔
如果帧间隔之后没有节点要发送帧,那总线处于空闲状态。
帧间隔是3个隐形位,它的存在可以让总线上所有的节点在下一远程帧或者数据帧的第一个位上实现硬同步,即所有电平从隐形变为显性时实现同步。
当发送节点处于被动错误状态的时候,不能再帧间隔之后立即发送,还需要再插入一个8位隐形位的“延迟传送”段,这是正常节点或者主动错误的节点优先使用总线,因为被动错误的节点可能存在硬件故障。
CAN-bus应用层
- 生产者-消费者(ros-topic)
- 客户端-服务端(ros-server)
CAN节点设计

CAN-bus节点电路

目前收发器有两种方案:CAN收发IC,另一种是隔离收发模块(优选)。
CAN控制器
集成了CAN规范里面数据链路层的全部功能,包括位时序逻辑、错误管理逻辑、位流处理器、验收处理器、验收滤波器、接收缓冲区、发送缓冲区及接口管理逻辑。其中位时序逻辑、错误管理逻辑、位流处理器组成了CAN内核。

CANOPEN
协议通常分为用户应用层、对象字典、通信三个部分
对象字典最为重要,定义了CANopen通信以及CAN控制器驱动之间得到回应关系。

重要
对象字典就是一个有序的对象组,每个对象采用一个16位的索引来寻址,又使用一个8位的子索引来寻找数据结构中的单个元素。
通信子协议:1000-1FFF、制造商自定义子协议:2000-5FFF、设备子协议:6000-9FFF
主节点对于从节点的参数配置,服务确认是最大的特点,具有应答机制,通常CANopen从节点作为SDO服务器,CANopen主节点作为客户端。客户端能够通过索引以及子索引访问数据服务器上的对象字典,所以CANopen主节点可以访问从节点的任意对象字典项的参数,并且SDO可以传输任何长度的数据。
