通讯协议

CAN 协议

CAN有两种通信标准:高速CAN和低速CAN。高速CAN属于闭环总线,速率可以达到1Mbps,总线长度<40m,适用需要快速数据传输的环境,如汽车内部网络

低速CAN速率只能达到250kbps,属于开环总线,总线长度可达到1000m,适合于工业自动化和远程监控等场景。

CAN总线信号

CAN总线上,信号表现为电压形式,通过CAN_H和CAN_L线上的电位差来表示CAN信号,它们之间的电压差决定了信号的状态。分为显性电平(dominant)和隐性电平(recessive)两种类型。具体表现如下:

  • 显性电平(Dominant):在CAN协议中,显性电平表示为逻辑0。当总线上的电压差满足特定的范围时(例如1.5V至2.5V),则认为总线上的信号是显性电平。

  • 隐性电平(Recessive):隐性电平则表示为逻辑1。如果CAN_H和CAN_L之间的电压差不在显性电平的范围内,则信号被认为是隐性电平。

CAN信号传输

CAN帧结构

帧类型
数据帧:用于传输数据。
遥控帧:用于请求数据。
错误帧:用于错误通知。
过载帧:用于指示节点需要时间来处理收到的信息。

帧组成部分
帧起始:表示帧开始的段,1个位的显性位。
仲裁段:数据的优先级的段
控制段:表述数据段的字节数,由6个位构成
数据段:数据段可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段
CRC段:检查帧传输错误的段
ACK段:用来确认是否正常接收。
帧结束:表示帧的结束的段

CAN机制和特性

CAN协议具有以下错误处理机制:
错误检测:包括位错误检测、帧错误检测和CRC错误检测。
错误标志:当检测到错误时,节点会发送错误帧。
错误计数:每个节点都有发送错误计数器和接收错误计数器,用于监控错误状态。
错误被动模式:当错误计数器超过一定阈值时,节点进入错误被动模式,减少错误传播。
总线关闭:当错误计数器超过更高阈值时,节点将关闭总线通信。

网络管理
总线仲裁:当两个或多个节点同时开始发送帧时,基于仲裁段中的标识符优先级进行仲裁。
消息过滤:节点可以配置滤波器,只接收特定标识符的消息。
时间戳:节点可以给接收到的帧添加时间戳,用于时间敏感的应用。

CAN调试

CAN调试

安装工具

1
sudo apt-get install can-utils 

can0 和can1 互联

1
2
3
4
5
6
7
8
9
10
11
12
#在收发端关闭can0设备
ip link set can0 down
#在收发端设置比特率 为250Kbps
ip link set can0 type can bitrate 250000
# 报错的话得用以下指令设置fd参数
ip link set can0 type can bitrate 500000 dbitrate 500000 fd on
#在收发端打开can0设备
ip link set can0 up
#在接收端执行candump,阻塞等待报文
candump can0
#在发送端执行cansend,发送报文
cansend can0 123#1122334455667788

可以使用can转串口通过查看串口获取信息,或者两路CAN自联用candump查看信息(最好使用网络更新到最新can调试工具)
编译后的工具cansend会有链接文件错误