STM32单片机高级篇-物联网通信之CAN通讯(学习笔记)
1.CAN通讯介绍CANController Area Network控制器局域网简称CAN或CAN bus是一种丰富的车用总线标准。设计用于不需要主机的情况下允许网络上的单片机和仪器相互通信。它基于消息传递协议设计之初在车辆上复用通用线缆以降低铜线使用量后来也被其他行业所使用。CAN拥有良好的弹性调整能力可以在现有网络中增加节点而不用在软硬件中做出调整。2.物理层2.1.CAN网络节点一个CAN控制器核心功能它负责 CAN 报文的发送与接收控制完成总线显性 / 隐性电平解析、帧结构处理、数据校验、位时序控制及总线仲裁等功能并通过 CAN_Tx/CAN_Rx 引脚与外部收发器交互将逻辑电平信号转换为总线差分信号。隐性电平总线无驱动差分电压接近 0对应逻辑 1显性电平总线被主动驱动存在明显差分电压对应逻辑 0位置通常集成在 MCU 内部是 CAN 通信的协议处理核心。一个CAN收发器核心功能实现逻辑电平 ↔ 总线差分电平转换将 CAN 控制器的 TTL 逻辑信号转为 CAN_H/CAN_L 差分信号同时提供总线驱动、抗干扰与隔离保护。位置位于控制器与物理总线之间属于外部接口芯片。我开发用的是PD1050收发器芯片。STM32 特性片内集成 CAN 控制器无需外接协议芯片仅需外接 CAN 收发器。CAN控制器和CAN收发器之间通过CAN_Tx和CAN_Rx信号线相连接。CAN收发器和CAN总线之间使用CAN_High、CAN_Low信号线相连2.2.CAN网络节点发数据流程MCU 内部的 CAN 控制器准备好二进制数据。控制器通过 CAN_Tx 线把逻辑电平信号发给收发器。收发器将逻辑电平转换为差分电平逻辑 0 → 显性电平CAN_H 拉高、CAN_L 拉低差分电压大逻辑 1 → 隐性电平CAN_H 和 CAN_L 电压接近差分电压≈0差分信号通过 CAN_H/CAN_L 输出到 CAN 总线上被其他节点接收。2.3.CAN网络节点接收数据流程通过收发器接收总线上的数据到控制器上时则是与发送数据流程相反。收发器把总线上收到的CAN_High和CAN_Low信号转换成普通的逻辑电平信号。通过CAN_RX输出到控制器中。2.4.CAN总线网络2.4.1.CAN总线网络介绍当CAN线上接入多个设备时就构成了CAN总线网络。根据接法不同总线网络分闭环总线网络、开环总线网络2种。2.4.2.闭环总线网络闭环总线网络: CAN总线上CAN_High和CAN_Low两端通过120欧电阻连接形成闭合回路这样的CAN总线网络就称闭环总线网络。协议标准遵循 ISO11898 高速 CAN 标准最高通信速率 1 Mbps对应最大传输距离约 40 m。不同CAN协议标准对比如下表。协议类型最高速率典型传输距离说明ISO 11898-2高速 CAN1 Mbps约 40 m传统车载、工业主流应用最广泛CAN FD5~10 Mbps数米数据段提速短距离高速场景使用CAN XL20~50 Mbps更短距离新一代超高带宽、大数据负载总线闭环总线网络连接如下图所示。扩展CAN FDISO 11898-1 扩展)CAN FD 协议在数据段可支持 5 Mbps 高速率最高甚至 10 Mbps适合短距离板间或设备间通信传输距离随速率提升而显著缩短5 Mbps 时通常仅数米。CAN XLCAN FD 协议在数据段可支持 20Mbps 高速率最高甚至 50 Mbps2.4.3.开环总线网络开环总线网络 CAN总线上CAN_High和CAN_Low左端分别串联一个2.2K欧的电阻两根总线独立不形成闭环这样的CAN总线网络就称开环总线网络。协议标准遵循 ISO11519-2 标准低速远距离的“开环网络”。最大传输距离1Km通信速率最高125Kbps。2.5.差分信号2.5.1.差分信号介绍CAN_High和CAN_Low走一对差分信号。传统的单端信号传输一根信号线一根地线。差分传输是一种信号传输技术差分传输在这两个根线上都传输信号这两个信号的振幅相同相位相反。信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上差分走线必须是等长、等宽、紧密靠近且在同一层面的两根线。2.5.2.差分信号优缺点优点抗干扰能力强干扰噪声一般会等值、同时的被加载到两根信号线上。而其差值为0即噪声对信号的逻辑意义不产生影响。能有效抑制电磁干扰EMI由于两根信号线靠得很近且信号幅值相等这两根线与地线之间的耦合电磁场也相等同时他们的信号极性相反其电磁将相互抵消。因此对外界和受外界的电磁干扰也小。缺点差分信号一定要走两根等长、等宽、紧密靠近且在同一层面的线。对电路板比较小、走线比较紧张的情况下给布线带来挑战。串口通信协议的演进也体现出差分传输的优势RS232非差分两根线→ RS485半双工差分两根线分时收发→ RS422全双工差分收发各一组差分线共四根。差分信号线具有这些优点在USB协议、485协议、以太网协议及CAN 协议的物理层中都使用了差分信号传输。2.5.3.差分信号原理以 ISO 11898-2 高速 CAN 为例CAN 总线通过 CAN_High 与 CAN_Low 的电压差值 来传输逻辑 0/1逻辑1隐性电平电平状态CAN_High CAN_Low2.5V电压差VH-VL0V物理表现总线无主动驱动两根线电压相等差分电压接近 0。逻辑0显性电平电平状态CAN_High 3.5VCAN_Low1.5V电压差VH-VL2V物理表现总线被主动驱动CAN_High 拉高、CAN_Low 拉低形成明显电压差。CAN 总线之所以是「线与」逻辑是因为它的电平由所有节点共同决定只要有一个节点发送显性电平逻辑 0总线就表现为显性等价于所有节点输出做逻辑与运算。这种机制是 CAN 总线实现高效、可靠仲裁的基础。CAN 线与逻辑的物理本质显性电平为主动驱动隐性电平为被动悬浮。发送逻辑 0 时节点会通过电流主动将 CAN_H 拉高、CAN_L 拉低其驱动力远大于被动悬浮状态因此只要有一个节点输出显性电平总线就会被强制拉为显性。3. 协议层3.1.CAN 总线的广播通信机制CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文无法将报文单独发送给指定节点。但是CAN硬件能够本地过滤功能让每个节点对报文选择性地做出响应。每个节点可以通过设置验收滤波器只对符合 ID 规则的报文进行接收和处理对无关报文直接忽略。这种 “全网广播 本地过滤” 的模式既保证了数据的共享性又避免了节点 CPU 资源的浪费。.3.2.CAN 报文的内容寻址与短帧特性内容寻址而非地址寻址传统串口、以太网等通信方式通常在报文中携带明确的目标地址 / 源地址用于指定收发双方。而 CAN 报文中不包含任何节点地址采用内容寻址方式短报文设计CAN 总线采用短帧结构传输报文长度有限最大实用数据负载为 94 位。短帧带来的优势非常明显3.3.CAN的帧(报文)种类CAN总线上传输的报文有5种类型或帧数据帧、远程帧、错误帧、过载帧和帧间隔。数据帧数据帧是最常用的报文类型用于发送单元向接收单元发送数据。携带报文 ID 与 0~8 字节数据分为标准数据帧11 位 ID和扩展数据帧29 位 ID所有正常的业务通信都依靠数据帧完成。远程帧远程帧用于接收单元向具有同样id的发送单元请求发送数据自身不携带数据段。格式与数据帧类似但无数据域某节点发送对应 ID 的远程帧拥有该 ID 数据的节点会自动回复数据帧实现 “按需请求数据” 的通信方式。错误帧错误帧当检测出错误时向其他单元通知错误的帧。用于通知全网当前总线出现异常触发错误处理机制如报文重发、节点错误计数累加是 CAN 高可靠性的重要保障机制。过载帧过载帧用于节点向总线申请延迟告知其他节点自身暂时无法接收新报文。常见于节点处理速度不足、接收缓冲区满等场景强制总线空闲一段时间避免数据丢失过载帧并不常用因为当今的CAN控制器会非常智能化地避免使用过载帧。帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧。其中错误帧、过载帧、帧间隔都是由硬件自动完成没有办法用软件来控制。对于一般使用者来说只需要掌握数据帧和遥控帧。数据帧和遥控帧有标准格式和扩展格式标准格式有11位标识符扩展格式有29位标识符。3.4.数据帧Data Frame数据帧是CAN总线中最核心的报文类型用于实现总线上各节点间的数据传输其结构具有固定规范可分为标准帧和扩展帧两类。其中标准帧是最常用的类型以下重点介绍其具体结构3.4.1.标准帧结构标准帧结构由帧起始SOF、仲裁段、控制段、数据段、CRC段、ACK段、帧结束EOF 七个大部分组成如下图所示即为标准帧结构。针对上图标准帧结构的各段进行解释说明帧起始Start Of Frame-SOF位长1bit固定为显性信号逻辑0。作用明确表示数据帧或远程帧的传输开始。发送规则仅能在总线处于空闲状态时发送帧起始信号。仲裁段仲裁段Arbitration Field主要用于总线仲裁包含两个核心部分标识符位Identifier field-ID和远程发送请求位Remote Transfer Request-RTR。标识符位长度11位11bit范围为ID10 ~ ID0传输时按照ID10至ID0的顺序进行。作用它属于功能性地址CAN总线的接收节点会通过该标识符对数据帧进行过滤筛选判断是否接收该报文。远程发送请求位RTR长度1位1 bit作用是区分当前帧的类型。其中显性信号逻辑0代表数据帧Data Frame隐性信号逻辑1代表远程帧Remote Frame。控制段控制段Control Field一共6位包括IDE位Identifier Extension、R0位、DLC段Data Length Code。IDE位ID扩展位位长1位作用用于区分标准格式与扩展格式。显性电平逻辑0代表标准格式隐性电平逻辑1代表扩展格式。R0位位长1位。作用保留位方便以后扩展使用。DLC段位长4位对应 DLC3、DLC2、DLC1、DLC0 四个独立位。作用用于表示数据段包含的字节数有效值范围为08是接收方解析数据长度的唯一依据。编码规则4 位 DLC 通过不同的显性 / 隐性信号组合与 0~8 字节数据一一对应具体编码逻辑如下表所示数据段数据段Data Field是数据帧的核心内容它是节点要发送的原始信息。长度范围由 DLC 段决定包含0 ~ 8 个字节即 0~64 位是 CAN 协议中数据承载的唯一区域。传输顺序严格遵循 ** 高位先行MSB first** 规则即每个字节的最高位Bit7优先发送最低位Bit0最后发送。边界约束数据段实际发送的字节数必须与 DLC 声明的长度一致。若有效数据不足 DLC 规定长度剩余字节 / 位需用隐性电平逻辑 1填充保证帧结构完整连续。示例说明假设 DLC 2表示本次数据段长度固定为 2 字节16 位。而当前有效业务数据只有 1 字节0x12不足 2 字节。发送时处理方式先发送有效数据0x12剩余 1 字节用隐性电平填充即0xFF最终数据段为完整 2 字节0x12 0xFF对 CAN 控制器而言这就是合法的 2 字节数据段接收方收到后由上层应用协议决定是使用全部 2 字节还是只取前 1 字节为有效数据。CRC段CRC段CRC Field包含CRC校验码和界定符2个部分。CRC校验码长度CRC校验码长度为15bits。作用用于校验传输是否正确。对帧起始、仲裁段、控制段、数据段的所有数据进行循环冗余校验接收方通过校验结果判断传输过程是否出现位错误。界定符长度1bit。电平固定为 隐性电平逻辑 1作用作为分隔标志表示CRC校验码区域结束固定为逻辑1为后续 ACK 段做准备保证帧结构边界清晰。ACK段ACK段ACK Field是应答包含ACK确认位和界定符。ACK确认位长度1bit隐性位逻辑 1。作用发送端的ACK确认位默认为隐性位接收端接收到正确的CRC校验位后把这ACK确认位的值置为显性位说明接收端接收到了数据。界定符长度1bit。电平固定为 隐性电平逻辑 1。作用作为分隔标志与后面的帧结束隔开。帧结束帧结束段 EOF(End Of Frame)由发送节点发送的7个隐性位表示结束。3.4.2.扩展帧结构扩展帧Extended Frame在标准帧基础上同时修改了仲裁段与控制段其余段结构与标准帧完全一致。核心差异1仲裁段结构11 位基本 ID SRR IDE 18 位扩展 ID RTR共 32 位SRR 位固定为隐性电平1仅为占位位用来替代标准帧中 RTR 所在位置仅用于总线兼容与仲裁不参与帧类型判断。SRR 设为隐性 1目的是让标准帧在总线竞争时优先级更高保证向下兼容。IDE 位固定为隐性电平1标识当前为扩展帧。18 位扩展 ID在 11 位基本 ID 后追加使总 ID 长度达到 29 位极大扩展了 CAN 总线的寻址空间。RTR位唯一用于区分数据帧与远程帧的标志位与标准帧定义完全一致不受 SRR 位影响。核心差异2控制段结构R1 R0 DLCR1扩展帧新增的保留位固定为显性电平0为协议扩展预留。R0保留位固定为显性电平0。R0、R1 设为显性 0只是普通保留位遵循协议默认填充规则无仲裁竞争目的。DLC4 位数据长度码用于表示数据段字节数范围 0~8功能与标准帧一致。其余段结构控制段、数据段、CRC 段、ACK 段、帧结束与标准帧完全相同保证协议兼容性与可移植性。3.5.远程帧Remote Frame远程帧相比数据帧没有数据段其他段一样。3.6.CAN总线仲裁机制CAN 总线采用非破坏性位仲裁机制CAN总线处于空闲状态的时候最先发送消息的单元节点获得发送权。报文 ID 数值越小优先级越高。当多个节点同时开始发送报文时从仲裁段报文 ID的第一位起逐位进行仲裁连续输出显性电平越多的节点越能继续发送一旦某个节点发送隐性电平而总线上出现显性电平CAN 总线为线与逻辑显性电平对应逻辑 0节点主动驱动总线产生差分电压隐性电平对应逻辑 1总线仅为高阻悬浮无差分电压因此显性电平会覆盖隐性电平则该节点竞争失败失去总线占有权并转为接收模式。竞争失败的节点会自动监测总线状态待总线再次空闲时立即重新尝试发送。当某个节点发送数据帧的同时另一节点以远程帧请求数据时数据帧优先级高于远程帧。由此可见报文 ID 与 RTR 位共同参与 CAN 总线仲裁这也是 RTR 位用于区分数据帧与远程帧被设计在仲裁段中的原因。3.7.CAN的位时序3.7.1 位时序的定义CAN 总线的位时序是对每一位数据的时间长度进行划分和定义的规则核心是明确位周期、时间分段及采样点位置为数据可靠采样提供基础。3.7.2 位时序的核心作用规定总线上传输的每一位的时间框架位周期明确采样点的标准位置确保收发双方对“何时读取数据”形成共识是 CAN 总线可靠通信的前提。3.7.3 位时序的核心构成CAN 总线的每一个位周期即单个比特的时间长度通常分为4个核心时间分段各分段协同作用确保采样准确具体细节如下3.7.3.1 基础概念时间量子TQ是 CAN 位时序的最小时间单位由节点内部时钟分频得到位周期的总时长 各分段时长之和通常为8~25个 TQ。位时间Bit Time4个时间分段的总时间即传输一位数据所需的总时间。时间量化器将位时间分为若干等长的时间单元即 TQSync、Pro-seg、Phase 1、Phase 2 四个分段的时间均为 TQ 的整数倍。TQ 长度设置可根据传输速率需求调整在 STM32 的 CAN 外设中通过设置波特率分频器的值来确定 TQ 的大小。每一位周期的时间分段示意图如下3.7.3.2 四个核心时间分段详解结合位同步机制四个时间分段并非独立存在而是与位同步硬同步、重同步深度绑定每一段的设计都直接服务于时钟偏差补偿和采样准确性。核心逻辑通过分段协同配合硬同步、重同步机制抵消时钟偏差累积确保采样点始终稳定在位周期中心区域。同步段为硬同步提供触发与对齐基础相位缓冲段 1/2 为重同步提供动态调整空间传播段为两种同步机制扫清延迟干扰。参考结构图具体解析如下同步段Sync Segment核心作用检测总线帧SOF位或数据段电平跳变为硬同步或重同步提供触发条件是整个位同步机制的基础确保节点与总线时序快速对齐。时间长度长度固定为1个时间量子TQ不可动态调整是整个位周期中唯一长度固定的分段。同步检测与触发机制跳变沿来源判断若跳变沿来自SOF帧起始位触发硬同步强制将节点时序重置到同步段起点完成全局时序对齐不进入 “失步判定” 流程。若跳变沿来自数据段 / 仲裁段等非 SOF 位进入重同步检测流程。重同步检测流程若跳变沿被包含在同步段范围内判定节点与总线时序同步无需调整维持当前位时序。若跳变沿落在传播段或相位缓冲段 1 内判定为时序失步触发重同步机制通过调整相位缓冲段 1/2 的长度将采样点拉回位周期中心。若跳变沿落在相位缓冲段 2 内属于异常时序偏差通常被判定为总线错误触发相应的错误处理。传播段Propagation Segment核心作用补偿总线传输延迟与节点内部电路延迟为硬同步、重同步提供准确、无延迟的电平信号避免延迟干扰同步判断。总线传输延迟信号在CAN总线上传输过程中产生的时间延迟节点内部电路物理延迟包括发送单元的发送延迟和接收单元的接收延迟。时间长度长度至少为1个时间量子TQ实际应用中通常配置为1~8个TQ可根据总线长度、节点数量灵活调整。相位缓冲段1Phase Buffer Segment 1核心作用专为重同步设计可动态调整长度初步补偿收发端的时钟偏差当同步段检测到时序失步时通过调整自身长度实现同步校准。调整规则在重新同步阶段若检测到时序失步其时间长度可自动加长带动同步段后移从而将采样点向位周期中心调整。时间长度初始大小可配置为1~8个TQ重同步时进入重新同步阶段后可根据失步程度自动加长根据失步方向调整灵活补偿时钟偏差。相位缓冲段2Phase Buffer Segment 2核心作用与相位缓冲段 1 配合共同服务于重同步进一步精细调整采样点位置确保采样点始终处于位周期的中心区域——该区域电平最稳定可最大程度避免采样错误。调整规则在重新同步阶段可根据时序失步不同步情况自动缩短自身长度带动同步段前移与相位缓冲段1的“加长”调整形成配合精准校准采样点。时间长度初始大小可配置为2~8个TQ进入重新同步阶段后可自动缩短根据失步方向调整实现采样点的精准校准。3.7.4.位时序面临的核心问题——时钟偏差3.7.4.1 时钟偏差的产生原因CAN 总线无统一时钟线各节点使用独立内部时钟收发双方时钟频率天生存在微小差异即时钟偏差。3.7.4.2 时钟偏差的累积效应对比UARTUART 场景帧长仅10位左右微小时钟偏差来不及累积采样点仍在有效位范围内通信可靠。CAN 场景一帧数据位数远超10位偏差持续累积导致采样点偏离位中心最终引发采样错误。3.7.4.3 采样错误的直观体现附示意图如下图所示是仅靠固定波特率计时、不进行同步调整时CAN 长帧的采样情况图中核心细节接收端时钟偏快位宽更短采样点从第1位开始漂移前10位UART帧长采样正常第14位时采样点超出位范围引发采样错误。3.7.5 位同步解决时钟偏差3.7.5.1 核心目的动态调整采样时刻抵消时钟偏差累积带来的采样偏移确保采样点始终对准位周期中心保障 CAN 长帧通信可靠避免因时序偏差导致的采样错误。3.7.5.2 两种同步方式CAN 总线通过两种同步方式结合位时序的分段设计同步段、相位缓冲段实现时钟偏差的补偿具体如下硬同步触发条件当一个节点检测到数据帧的SOF 起始位时触发硬同步操作。核心作用快速校准时序基准将采样点对准电平跳变沿解决突发的时序偏差对应同步段的跳变检测功能。操作过程执行硬同步时控制器的时间基准会立即调整与检测到的电平跳变沿对齐确保节点内部时间基准与数据帧时间基准一致。重同步在检测到总线上的时序与节点使用的时序有相位差时即总线上的非 SOF 位跳变沿不在节点时序的同步段SS范围内通过**延长相位缓冲段1PBS1段或缩短相位缓冲段2PBS2段**来获得同步即让总线上的非 SOF 位跳变沿重新回到节点时序的同步段SS范围内。所有同步机制都是由CAN控制器硬件自动完成。而开发者只需要设置TQ 时间长度和位时序分段TQ数量就可以确定CAN通讯的波特率。3.7.6 设置CAN波特率CAN 波特率CAN 波特率由通讯节点共同约定单个时间量子 TQ 的时间长度每一位数据包含多少个 TQ满足以上两点即可唯一确定 CAN 波特率。设置方法TQ 时间长度根据目标波特率调整时钟分频在 STM32 CAN 外设中通过配置 BRR波特率预分频器寄存器确定单个时间量子Time Quantum, TQ的时长。位时序分段TQ数量手动为传播段、相位缓冲段 1、相位缓冲段 2分别分配对应的TQ 数量各分段 TQ 数量范围参考 3.7.3.2算同步段固定是 1 TQ不需要配置硬件自动计算。四个分段的 TQ 数量之和构成一个完整位周期的总 TQ 数。计算CAN波特率假设右图中的1Tq1us而每个数据位由20个Tq组成则传输一位数据需要时间为20us 从而每秒可以传输的数据位个数为: 1 *1000000/20 50000这个每秒可以传输的数据位的个数就是CAN通讯的波特率比如上面的波特率就是50kbps。3.6.CAN的位填充3.6.1 位填充的核心作用CAN 总线使用NRZ 非归零编码如果总线长时间保持同一电平连续很多个 1 或 0没有电平跳变沿接收端就无法触发重同步收发时钟偏差会持续累积最终导致采样错误。位填充与位同步配合共同保证总线传输时序的正确性位同步利用跳变沿校准位时序把采样点拉回稳定位置位填充主动制造跳变沿保证重同步能一直有触发条件3.6.2 发送端填充规则发送端在发送帧起始到 CRC 序列这段数据时遵循连续出现 5 个相同电平5 个 1 或 5 个 0自动插入 1 个相反电平5 个 1 后插 05 个 0 后插 1。插入目的强制产生跳变沿让接收端可以触发重同步避免同步丢失。3.6.3 接收端对位填充的处理接收端会完整接收包括填充位在内的所有总线电平并按以下逻辑处理正常采样与同步:接收端依然按照四个时间分段 重同步机制对每一位进行采样插入的填充位产生的跳变沿会正常触发重同步修正时钟偏移保证采样点稳定。检测并删除填充位:接收端同样统计连续相同电平的位数当检测到连续 5 个相同电平 后紧跟的第 6 位相反电平识别为位填充位接收端自动丢弃该填充位不将其送入数据缓冲区后续位继续按原始数据规则解析。填充错误检测若连续 5 个相同电平后第 6 位仍然相同判定为位填充错误Stuff ErrorCAN 控制器会自动识别该错误并进入相应错误处理流程。一句话概括填充位只用于同步不参与实际数据接收端采样时用它同步同步完就扔掉只还原原始有效数据。4 STM32的CAN外设4.1 CAN外设CAN控制器 介绍STM32 芯片集成 bxCANBasic Extended CAN 控制器支持 CAN 2.0A 与 CAN 2.0B Active 协议标准。CAN 2.0A仅支持标准帧11 位 ID无法正确解析扩展数据帧。CAN 2.0B Active可同时处理标准帧与扩展帧支持 29 位扩展 ID。CAN 2.0B Passive仅处理标准帧会直接忽略扩展帧。bxCAN 支持最高 1 Mbit/s 通信速率可自动完成 CAN 报文的发送与接收兼容标准 ID 与扩展 ID 报文。控制器支持自动重发功能不支持通过 DMA 进行数据收发。4.1.2 发送邮箱外设包含3 个发送邮箱用于缓存待发送报文最多可同时缓存 3 条报文发送顺序由发送调度机制决定支持软件配置发送优先级并可记录报文发送时间。4.1.3 接收端接收端提供2 个独立接收 FIFO每个 FIFO 深度为 3 级配合硬件过滤器可灵活筛选指定 ID 的报文只接收需要的数据减轻 CPU 负担。接收滤波器过滤器作用对接到的报文进行过滤。最后放入FIFO 0或FIFO 1。当总线上报文数据量很大时总线上的设备会频繁获取报文占用CPU。过滤器的存在选择性接收有效报文减轻系统负担。有2种过滤模式1标识符列表模式它把要接收报文的ID列成一个表要求报文ID与列表中的某一个标识符完全相同才可以接收可以理解为白名单管理。2掩码模式屏蔽位模式它把可接收报文ID的某几位作为列表这几位被称为掩码可以把它理解成关键字搜索只要掩码关键字相同就符合要求报文就会被保存到接收FIFO。如果使能了筛选器且报文的ID与所有筛选器的配置都不匹配CAN外设会丢弃该报文不存入接收FIFO。每个CAN提供了14个位宽可变的、可配置的过滤器组(13~0)。每个过滤器组x由2个32位寄存器CAN_FxR1和 CAN_FxR2组成。FIFO接收接收流程接收流程如下图所示由上图可知bxCAN 接收遵循先过滤、后入队、再出队的硬件逻辑完整流程为输入方向CAN 总线报文 → 硬件过滤器先过滤路由逻辑过滤器匹配成功后分支流向 FIFO0 或 FIFO1入队方向硬件自动写入 Level 0队尾最新报文出队方向CPU 从 Level 2队头最早报文读取遵循 先进先出 (FIFO)4.2 CAN控制器的3种工作模式CAN控制器有三种工作模式初始化模式、正常模式、睡眠模式模式通过状态位与切换条件实现状态流转完整状态机如下图所示三种工作模式定义睡眠模式状态标识SLAK 1睡眠确认、INAK 0初始化未激活核心特性上电复位后CAN 控制器默认进入睡眠模式核心作用是降低系统功耗。此时控制器不参与总线通信仅维持最低功耗状态 。唤醒方式支持软件主动唤醒或总线活动唤醒检测到总线报文时自动唤醒初始化模式INITIALIZATION状态标识SLAK 0非睡眠、INAK 1初始化激活核心特性需配置波特率、过滤器、工作模式等关键寄存器时必须先进入初始化模式。仅在此模式下可修改核心配置参数正常模式下无法写入。使用场景CAN 控制器初始化配置阶段配置完成后需退出该模式才能通信。正常模式NORMAL状态标识SLAK 0非睡眠、INAK 0初始化未激活核心特性控制器的实际通信运行状态可完整参与 CAN 总线同步、仲裁、应答、报文收发等全部协议流程。状态标识说明SLAK睡眠确认标志1 已进入睡眠0 未睡眠。INAK初始化确认标志1 已进入初始化模式0 未初始化。请求与控制位说明INRQ初始化请求位置 1 时请求进入初始化模式清 0 时请求退出SLEEP睡眠请求位置 1 时请求进入睡眠模式ACK确认应答位硬件对模式切换请求的确认响应SYNC总线同步位控制器与总线完成同步的状态标识上划线如INRQ‾\overline{INRQ}INRQ表示对应位为低电平 / 清 0 状态。工作流程上电复位CAN 控制器默认进入睡眠模式SLAK1, INAK0处于低功耗待机状态。切换至初始化模式软件置 SLEEP0清睡眠请求、INRQ1置初始化请求等待硬件确认位 ACK1对应 INAK1代表切换成功进入初始化模式。寄存器配置在初始化模式下完成波特率、过滤器、工作模式等核心参数的配置。切换至正常模式配置完成后软件置 SLEEP0、INRQ0等待总线同步完成SYNC1控制器自动进入正常模式开始 CAN 总线通信。4.3 CAN控制器的3种测试模式CAN控制器有3种测试模式:静默模式、环回模式、环回静默模式。当控制器进入初始化模式的时候才可以配置测试模式。静默模式可以用于检测总线的数据流量。环回模式可以用于自检影响总线。环回静默也是用于自检不会影响到总线。