CAN知识大全——带你读懂CAN数据手册

张开发
2026/4/14 10:54:32 15 分钟阅读

分享文章

CAN知识大全——带你读懂CAN数据手册
一、CAN的通信特点1.can通信串行、异步、半双工通信2.有一对差分信号CANH和CANL有的也叫CHAN和CHAL3.实际系统中可使用多路独立 CAN 总线分别控制不同功能模块使网络结构更清晰。为统一解析报文含义我们会人为使用.dbc CAN 数据库文件定义 ID 与数据对应的物理意义类似于在串口通信中的数据包格式包头、包尾、校验位、数据位等方便各节点统一解析数据保证每一个节点或者部门都有自己的通信协议不会互相干扰。4.通信速率有低速、高速还有CAN FD三种了解即可。对比维度低速/容错CAN高速CANCAN FD核心定位简单、不关键的设备控制实时性要求高的关键控制大数据量、高效率的升级网络传输速率最高 125 kbps最高 1 Mbps仲裁段 ≤1 Mbps数据段最高 8 Mbps单帧数据量最多 8 字节最多 8 字节最多 64 字节物理层容错收发器 (如 TJA1055)高速收发器 (如 TJA1044)高速收发器物理层与高速CAN基本相同典型应用车窗、座椅、灯光控制发动机、变速箱、ABS等动力系统ADAS、车载诊断与软件升级(OTA)、网关5.CAN 控制器注意是控制器不是收发器控制器在板子内部收发器是我们需要自行购买的联通两边的通信中介根据两根线CANH和CANL有的也叫CHAN和CHAL上的电位差来判断总线电平。总线电平分为显性电平和隐性电平二者必居其一。至于电平定义分为显性电平和隐性电平就是逻辑1和逻辑0但是高速can和低速can的显性电平和隐性电平的定义不同并且他们的硬件电路也有所不同。对比维度高速CAN (ISO 11898-2)低速/容错CAN (ISO 11898-3)显性电平 (逻辑0)CAN_H 3.5V, CAN_L 1.5V电压差2.0VCAN_H 3.6V, CAN_L 1.4V电压差​2.2V隐性电平 (逻辑1)CAN_H 2.5V, CAN_L 2.5V电压差​0VCAN_H 0.3V, CAN_L 4.7V电压差−4.4V差分电压范围显性: 0.9V ~ 2.0V隐性: -1.0V ~ 0.5V显性: 约1.5V ~ 3.0V隐性: 约-5.0V ~ -1.5V二、CAN的数据帧格式及其位时序与位填充数据帧格式CAN的帧类型一共有4种数据帧远程帧错误帧过载帧。实际开发中主要关注的是数据帧的收发。远程帧在某些应用如诊断、轮询式数据采集中也会用到。而错误帧和过载帧完全由CAN控制器硬件处理你只需要通过状态寄存器去判断是否发生过错误即可。你想做的事应该用的帧类型发送一个数据给其他节点数据帧请求其他节点发数据给我远程帧检测到总线通信异常错误帧硬件自动完成无需软件干预接收太慢让对方等一等过载帧硬件自动完成往下我们主要聚焦数据帧的格式一个数据帧有7个段组成| 帧起始 | 仲裁段 | 控制段 | 数据段 | CRC段 | 应答段 | 帧结束 |段名长度关键内容一句话作用帧起始1位逻辑0喊准备开始仲裁段12位11位ID RTRID标识消息内容和优先级数字越小优先级越高数据帧RTR 0远程帧RTR 1控制段6位IDE0 r00 4位DLC告诉对方数据长度IDE0为标准帧反之为扩展帧r0为保留位固定为0DLC为数据长度数据段0-8字节实际数据真正要传的内容CRC段16位15位校验 1位界定符检查传输有无错误有误则发送错误帧应答段2位ACK槽 ACK界定符接收方喊收到了帧结束7位逻辑1说发完了位时序和同步方法位时序CAN总线不使用传统的时钟线每个时钟的所发送的一个数据位通过位时序拼成用于防止因为传输距离过长或者信号干扰导致的信号采集延迟或提前。一个标称位时间Tq被分成4个段段名作用占比同步段SS让总线上的各个节点对齐用于检测边沿固定1Tq传播段PTS补偿信号在总线上的物理传播延迟1~8个Tq相位缓冲段1 PBS1补偿边沿相位误差采样点通常设在此段末尾1~8个Tq相位缓冲段2 PBS2补偿相位误差决定下一个位开始的时间1~8个Tq采样点在PBS1和PBS2中间。关于采样点涉及到CAN控制器的同步方法硬同步和再同步。同步方法用于校准采样点防止采样点偏移PBS1和PBS2中间。同步方法硬同步就是在数据帧的一开始直接强行调整采样点此后不在进行硬同步。再同步就是在数据帧后续中并且再同步只认 隐性 → 显性1→0的跳变也就是下降沿通过动态调整自己的PBS1和上一个的PBS2的Tq持续调整采样点。一般在硬同步之后还会继续调用再同步防止持续发送数据造成的误差起到一个类似于“时钟”的作用对各节点的“时序”进行同步。位填充概念发送端规则从帧起始SOF段到校验位CRC段当can发送节点连续发送5个一样的电平连续5个显性位或者5个隐性位就会强制插入一个相反的电平的填充位接收端规则检测接收到连续5个一样的电平后紧跟着一个相反电平会自动删除这个填充位若检测接收到连续6个一样的电平后判定为位填充错误并由检测到错误的节点节点可以是接收端也可以是发送端这里是接收端发现错误由接收端发送向CAN总线发送错误帧告诉总线上所以节点这一帧数据错误作废。作用1.错误通知机制当节点检测到位填充错误、CRC 错误等任意 CAN 错误时会强制发送一个长度为6位的0信号显性位以此向总线上的其他节点提醒错误当前帧出错了。2.便于同步时钟CAN总线没有单独的时钟线来保证各节点的交流需要靠电平的调变来产生变化然后各节点进行对齐倘若没有位填充数据一直发送1111......时间一长可能就会发生同步丢失导致数据出错3.至于位填充怎么让各节点同步更新结合上面关于位时序再同步的知识CAN 再同步只认 隐性 → 显性1→0的跳变所以在出现位填充这个相反电平的电平调变后必然会出现一个下降沿就会趁此下降沿进行再同步。三、CAN的发送邮箱与接收FIFOCAN 发送邮箱Transmit Mailbox和接收 FIFOReceive FIFO是 CAN 控制器内部核心的硬件缓存与调度机制专门解决 “CPU 速度快、CAN 总线慢” 的矛盾实现异步、可靠、不丢帧的通信。CAN的发送邮箱STM32中CAN有3个发送邮箱可以了简单理解成一个长度为三的数组每一位代表一个邮箱每个邮箱只能存一帧报文用来暂时存储CAN要发送的数据这样就不需要发一帧数据还要重新上传一帧数据而是能实现一次发送3帧数据。CPU能手动发送指令告诉CAN控制器“你可以发送了”此时置位TXRQ发送请求CAN硬件会自己完成仲裁发送错误重发等直到邮箱空闲⚠️邮箱在发送期间会被CAN硬件占用CPU控制不了期间CPU只负责把要发送的数据丢进邮箱不需要等待或者CPU自己发送缓解CPU压力。CAN的接收FIFOSTM32中CAN有2个接收FIFO深度为3帧可以理解成2个长度为3的队列FIFO在经过过滤器下面会讲过滤ID后才能进入FIFO按照先到先读取的顺序处理数据。作用用于缓存突然大量的接收的数据防止数据被覆盖便于接收端的CPU慢慢处理数据并且由于有2个FIFO可以设置一个FIFO为紧急组一个FIFO为普通组实现急缓分流同时FIFO的每一个状态满半满新帧能出发中断不需要一直轮询所以也能缓解CPU压力四、CAN的过滤器概念由于CAN通信是广播式的所有节点都能收到信息为了防止数据传输错误就需要ID来辨别是要发送给哪个节点而辨别的工作就靠过滤器完成在报文进入FIFO之前会现在过滤器筛选IDID不对直接放弃该帧数据。结构组成及其模式STM32F103系列共有14个过滤器互联型系列有28个过滤器。每个过滤器有2个32位的寄存器分别是Filter ID寄存器和Filter Mask寄存器。2种寄存器在不同的模式下有不同的作用。掩码模式掩码用于筛选你不想对比的位比如你想发的ID是11223344掩码是000011意思就是只要发送过来的ID是xxxx44只需要后2位对就行如果掩码是111111就是只有11223344才能通过。所以在掩码模式下c就作为存放“11223344”这个目标ID值的寄存器Filter Mask寄存器作为存放掩码“000011”的寄存器对应0的位不必一样对应1的位必须一模一样。列表模式就是Filter ID寄存器和Filter Mask寄存器作为最基本的寄存器存放你想通过的ID没有掩码传输过来的帧数据的ID必须和寄存器里的一模一样才能进入。宽度在Filter ID寄存器和Filter Mask寄存器中还有宽度的概念我们知道Filter ID寄存器和Filter Mask寄存器本质都是一个位宽32的寄存器而一帧数据中的ID段长度是11位32位远大于11位的存储空间所以为了多存储目标ID就需要把32位空间分成2份每份16位寄存器都是8/16/32 位对齐的16位最合适这样1个32位寄存器就能存储2个目标ID提高效率要是遇到的是29位的扩展ID就是一个32位寄存器存储一个目标ID。在掩码模式和列表模式都适用。五、CAN的工作模式及其测试模式工作模式CAN的工作模式分为初始化模式、正常模式和睡眠模式而正常模式也纳入在测试模式。初始化模式就是CAN总线自己初始化一些参数不会参与发送、接收不理会总线发生什么。正常模式就是我们常用的模式发送接收和仲裁等前面提到的所有都在这个模式完成。睡眠模式睡眠模式就是总线长时间没消息了就会进入睡眠模式等总线有消息了或者代码唤醒了再进入正常模式。测试模式正常模式会把消息发往总线会正常进行接收和发送。静默模式相当于只接受不发送监听者的身份。回环模式相当于正常模式会把消息发往总线会正常进行内部接收、外部接收和发送但是会把数据同样的又向自己发送一遍进行自测。静默回环模式就相当于把数据发给自己不往外发也不接收外部就自测。模式发往总线自收接收外部影响总线典型用途正常✅✅✅✅正常通信静默❌❌✅❌总线监听回环✅✅✅✅自测 总线静默回环❌✅❌❌不干扰在线自测六、CAN的仲裁仲裁的概念CAN 总线是多主总线—— 任何节点想发就发不需要谁批准。如果两个或多个节点同时开始发送就会产生冲突。仲裁就是解决冲突的机制让 ID 优先级更高的帧优先发送低优先级帧主动退让。整个过程完全硬件自动完成不需要 CPU 参与不丢数据不冲突。仲裁的原理⚠️首先我们要搞清楚显性电平是0隐性电平是1显性电平0强会覆盖隐性电平1.其次仲裁只发生在ID段根据ID的值来比较谁优先值高举例每个发送节点都在做同一件事我发一位 → 立刻读总线电平 → 看和我发的一不一样总线只是一根线谁发 0 就拉低谁发 1 就放开总线的最终电平 所有节点发出来的 “与” 结果只要有一个节点发 0 → 总线就是 0所以假设节点ABC的ID分别为1001,0100,0001那么他们的优先级从高到低就是CBA。等C数据发送完成后B和A或者其他新加入的节点再进行仲裁。整个过程非破坏性、硬件自动、无冲突、不丢帧。

更多文章