通讯协议--CAN
通讯协议
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信号传输
graph LR A[CPU]--信号-->B[CAN控制器] B--逻辑电平-->C[CAN收发器] C--差分信号-->D[总线CAN_H/CAN_L] C--逻辑电平-->B D--差分信号-->C
CAN帧结构
帧类型
数据帧:用于传输数据。
遥控帧:用于请求数据。
错误帧:用于错误通知。
过载帧:用于指示节点需要时间来处理收到的信息。
帧组成部分
帧起始:表示帧开始的段,1个位的显性位。
仲裁段:数据的优先级的段
控制段:表述数据段的字节数,由6个位构成
数据段:数据段可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段
CRC段:检查帧传输错误的段
ACK段:用来确认是否正常接收。
帧结束:表示帧的结束的段
CAN机制和特性
CAN协议具有以下错误处理机制:
错误检测:包括位错误检测、帧错误检测和CRC错误检测。
错误标志:当检测到错误时,节点会发送错误帧。
错误计数:每个节点都有发送错误计数器和接收错误计数器,用于监控错误状态。
错误被动模式:当错误计数器超过一定阈值时,节点进入错误被动模式,减少错误传播。
总线关闭:当错误计数器超过更高阈值时,节点将关闭总线通信。
网络管理
总线仲裁:当两个或多个节点同时开始发送帧时,基于仲裁段中的标识符优先级进行仲裁。
消息过滤:节点可以配置滤波器,只接收特定标识符的消息。
时间戳:节点可以给接收到的帧添加时间戳,用于时间敏感的应用。
CAN调试
CAN调试
安装工具
1 | sudo apt-get install can-utils |
can0 和can1 互联
1 | #在收发端关闭can0设备 |
可以使用can转串口通过查看串口获取信息,或者两路CAN自联用candump查看信息(最好使用网络更新到最新can调试工具)
编译后的工具cansend会有链接文件错误