CAN总线协议(Controller Area Network),控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。
CAN通讯是异步通讯,没有时钟信号线来保持信号接收同步,是半双工通信,无法同时发送与接收,在同一时刻,只能有一个节点发送数据,其余节点都只能接收数据。它有CAN_HIGH与CAN_LOW两条信号线组成。
闭环总线网络
ISO11898标准,闭环、短距离、高速、最高速度可达1Mbps,最长距离40m。
开环总线网络
ISO11519-2标准,开环、传输距离远、最高速度125Kbps,最远距离1km。
CAN总线信号----差分信号
CAN总线上信号表现为电压形式,通过CAN_H和CAN_L线上的电位差来表示CAN信号。
显性电平比隐形电平优先级要高(逻辑0比逻辑1优先级高)
ISO11898(高速)CAN的差分信号
不同标准的CAN信号差
CAN协议的波特率与位同步
由于CAN通讯协议并没有时钟信号线,所以各个节点之间要约定好特定的波特率进行通讯,特别的时候我们还需要使用位同步。
位时序:
位时序就是一个数据位的时序,位时序的大小=1/波特率
位时序分解图
波特率的计算:
CAN协议帧
CAN有5中协议帧类型,分别是数据帧、遥控帧、错误帧、过载帧、间隔帧。
数据帧 |
发送单元想接收单元传输数据的帧 |
遥控帧 |
接收单元向具有相同ID的发送单元 请求数据的帧 |
错误帧 |
当检测到错误时,向其他单元通知错误的帧 |
过载帧 |
通知其他发送端元:本节点没没做好接受准备 |
间隔帧 |
将数据帧及遥控帧与前面的帧分开 |
数据帧分为标准帧和扩展帧,下图是数据帧的类型及结构:
帧起始:有单个显性位组成,总线空闲时,发送节点发送起始帧,其他接收节点同步于该帧起始位。
帧结束:由7个连续的隐性位组成。
仲裁段:
CAN-bus没有规定节点的优先级,但通过仲裁段 帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。标准ID为11位,扩展ID为29位。
标准ID的仲裁段由 11位ID + 1位RTR组成。RTR是远程帧发送标识位,RTR为显性表示此帧为数据帧,为隐性表示此帧为远程帧。
扩展ID的冲裁段由 11位ID + 1位SRR + 1位IDE + 18位ID + 1位RTR 组成。SRR是远程帧请求位。IDE是标识符扩展位,IDE为显性表示该帧为标准数据帧,为隐性表示该帧为扩展数据帧。
仲裁方式:
假设节点A、B、C都发送都发送了标准数据帧,他们竞争总线的过程如下图所示:
仲裁机制
从该过程得出结论:帧ID值越小,优先级越高。
控制段:
控制段共6位。
标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成。
扩展帧控制段则由保留位r1、r0和DLC组成。保留位用隐性电平填充。
数据段:
一个数据帧传输的数据量为0-8个字节。传输时MSB先传输。
CRC段:
由CRC校验值+1位CRC界定符组成。CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。一般情况下,CRC校验由CAN控制器的硬件完成,不需要由mcu的软件代码实现。
ACK段:
由ACK值+1位ACK界定符组成。当一个 接收节点 接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。(所以数据帧里的ACK 是接收节点的)
CNA的过滤模式
列表模式和掩码模式
列表模式:
把你关注的CAN ID填到列表中,接收的时候只关注列表中的CAN ID,如果CAN ID不在列表中则不接收该ID报文。
掩码模式:
只关注CAN ID中的指定位,不符合指定位则不接受该CAN ID报文。掩码模式计算过程,类似下图:
列表模式和掩码模式的对比
模式 |
过滤 |
数量 |
列表模式 |
能精确过滤每个指定的CAN ID |
有数量限制 |
掩码模式 |
取决于屏蔽码,无法精确到每一个CAN ID,部分不期望的ID有时候也会收到 |
取决于屏蔽码,最多无上限 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构