📚 CAN总线技术系列 · 持续更新中
本系列从差分电气层一路打到 Linux SocketCAN,把"两根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。
👉 想系统追更,戳这里查看完整专栏:
👉 其他技术系列专栏,欢迎关注、交流、共同成长:
【SPI 技术系列】 【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】 【操作系统设计思想系列】 【 Android 系统全景专栏】
本篇定位:L3 驱动实现层开篇。前 7 篇讲物理/协议,本篇讲控制器硬件------寄存器怎么操作 CAN。CAN 控制器 IP(Bosch C_CAN/M_CAN)演进,STM32 bxCAN/FDCAN 寄存器(MCR/MSR/BTR/邮箱/FIFO/ESR/过滤器),验收过滤,发送邮箱,接收 FIFO。读完你能读数据手册配置任何 CAN 控制器,写裸机驱动。
控制器寄存器是驱动的根基SPI 控制器寄存器(CR/DR/SR)。I2C 控制器寄存器。CAN 控制器复杂得多------MCR 主控/MSR 状态/BTR 位定时/3 发送邮箱/2-3 级接收 FIFO/验收过滤器/ESR 错误。理解寄存器,才能写驱动、调问题。做BSP用 Bosch M_CAN(FDCAN),寄存器是必须啃的。对照 \[08-SPI控制器寄存器与IP架构] 看,CAN 控制器比 SPI 复杂一个量级。
目录
- [一、Bosch CAN IP 演进](#一、Bosch CAN IP 演进)
-
- [1.1 Bosch CAN IP 家族](#1.1 Bosch CAN IP 家族)
- [1.2 C_CAN](#1.2 C_CAN)
- [1.3 M_CAN(FDCAN)](#1.3 M_CAN(FDCAN))
- [1.4 IP 演进意义](#1.4 IP 演进意义)
- [二、STM32 bxCAN 寄存器](#二、STM32 bxCAN 寄存器)
-
- [2.1 bxCAN 概述](#2.1 bxCAN 概述)
- [2.2 主控寄存器 CAN_MCR](#2.2 主控寄存器 CAN_MCR)
- [2.3 主状态寄存器 CAN_MSR](#2.3 主状态寄存器 CAN_MSR)
- [2.4 位定时寄存器 CAN_BTR](#2.4 位定时寄存器 CAN_BTR)
- [2.5 错误状态寄存器 CAN_ESR](#2.5 错误状态寄存器 CAN_ESR)
- [2.6 发送邮箱寄存器](#2.6 发送邮箱寄存器)
- [2.7 接收 FIFO 寄存器](#2.7 接收 FIFO 寄存器)
- [三、STM32 FDCAN 寄存器](#三、STM32 FDCAN 寄存器)
-
- [3.1 FDCAN 概述](#3.1 FDCAN 概述)
- [3.2 FDCAN 核心寄存器](#3.2 FDCAN 核心寄存器)
- [3.3 FDCAN 发送缓冲](#3.3 FDCAN 发送缓冲)
- [3.4 FDCAN 接收 FIFO](#3.4 FDCAN 接收 FIFO)
- [3.5 FDCAN 消息 RAM](#3.5 FDCAN 消息 RAM)
- 四、发送邮箱
-
- [4.1 邮箱结构](#4.1 邮箱结构)
- [4.2 发送流程](#4.2 发送流程)
- [4.3 发送优先级](#4.3 发送优先级)
- [4.4 发送中止](#4.4 发送中止)
- [4.5 FDCAN 发送](#4.5 FDCAN 发送)
- [五、接收 FIFO](#五、接收 FIFO)
-
- [5.1 FIFO 结构](#5.1 FIFO 结构)
- [5.2 接收流程](#5.2 接收流程)
- [5.3 FIFO 溢出处理](#5.3 FIFO 溢出处理)
- [5.4 FIFO 中断](#5.4 FIFO 中断)
- [5.5 FDCAN 接收](#5.5 FDCAN 接收)
- 六、验收过滤器
-
- [6.1 过滤器作用](#6.1 过滤器作用)
- [6.2 过滤模式](#6.2 过滤模式)
- [6.3 过滤器位宽](#6.3 过滤器位宽)
- [6.4 过滤器示例](#6.4 过滤器示例)
- [6.5 过滤器优先级](#6.5 过滤器优先级)
- [6.6 FDCAN 过滤器](#6.6 FDCAN 过滤器)
- [七、RISC-V N300 M_CAN](#七、RISC-V N300 M_CAN)
-
- [7.1 平台概述](#7.1 平台概述)
- [7.2 寄存器映射](#7.2 寄存器映射)
- [7.3 初始化流程](#7.3 初始化流程)
- [7.4 消息 RAM 分配](#7.4 消息 RAM 分配)
- [八、关键问题 Q&A](#八、关键问题 Q&A)
-
- [Q1:bxCAN 和 FDCAN 有什么区别?](#Q1:bxCAN 和 FDCAN 有什么区别?)
- Q2:发送邮箱怎么用?
- [Q3:接收 FIFO 溢出怎么处理?](#Q3:接收 FIFO 溢出怎么处理?)
- Q4:验收过滤器列表模式和屏蔽模式怎么选?
- [Q5:FDCAN 消息 RAM 怎么分配?](#Q5:FDCAN 消息 RAM 怎么分配?)
- [Q6:N300 M_CAN 和 STM32 FDCAN 寄存器一样吗?](#Q6:N300 M_CAN 和 STM32 FDCAN 寄存器一样吗?)
- 九、实战案例
-
- [案例 1:bxCAN 初始化卡在 INAK](#案例 1:bxCAN 初始化卡在 INAK)
- [案例 2:发送邮箱写不进](#案例 2:发送邮箱写不进)
- [案例 3:接收 FIFO 溢出丢帧](#案例 3:接收 FIFO 溢出丢帧)
- [案例 4:过滤器配错,收到无关帧](#案例 4:过滤器配错,收到无关帧)
- [案例 5:FDCAN 消息 RAM 溢出](#案例 5:FDCAN 消息 RAM 溢出)
- [案例 6:CAN FD 数据段 CRC 错](#案例 6:CAN FD 数据段 CRC 错)
- [案例 7:过滤器索引 FMI 调试](#案例 7:过滤器索引 FMI 调试)
- [案例 8:N300 M_CAN 移植 STM32 驱动](#案例 8:N300 M_CAN 移植 STM32 驱动)
- 十、本篇小结与速查
- 延伸阅读
- 参考资料
一、Bosch CAN IP 演进
1.1 Bosch CAN IP 家族
Bosch 是 CAN 协议发明者,提供 CAN 控制器 IP:
| IP | 特点 | 典型 |
|---|---|---|
| C_CAN | 经典 CAN 2.0A/B,基础 | 低端 MCU |
| BOSCH M_CAN(C_CAN 升级) | CAN FD,高性能 | STM32 FDCAN |
| MCAN | M_CAN 简版 | 部分国产 MCU |
1.2 C_CAN
- 经典 CAN 2.0A/B(11/29bit ID)
- 寄存器简化,16 位访问
- 单发送缓冲/双接收 FIFO
- 验收过滤器 14 组
1.3 M_CAN(FDCAN)
- CAN FD 支持(64B 数据段)
- 32 个发送缓冲(TX Buffer)
- 多个接收 FIFO(FIFO0/FIFO1)
- 28 组验收过滤器
- 高性能,主流 MCU 用(STM32 G0/H7/L5、RISC-V N300)
1.4 IP 演进意义
- C_CAN → M_CAN:经典 → FD,缓冲更深,过滤更强
- 寄存器结构变化(M_CAN 用 TX Buffer/BAR 取代邮箱)
- 软件移植要改驱动(C_CAN 和 M_CAN 寄存器不同)
二、STM32 bxCAN 寄存器
2.1 bxCAN 概述
- STM32 F1/F4 经典 CAN(Basic Extended CAN)
- 双 CAN(CAN1 主 + CAN2 从,共享过滤器)
- 经典 CAN 2.0A/B
2.2 主控寄存器 CAN_MCR
CAN_MCR(Main Control Register):
bit 31 INRQ: 初始化请求(1=进初始化)
bit 30 SLEEP: 睡眠模式
bit 16 RFLM: 接收 FIFO 锁定模式(0溢出丢/1溢出留)
bit 15 TXFP: 发送优先级(0=ID优先/1=请求顺序)
bit 7 NART: 禁止自动重发(0=自动重发/1=单次)
bit 6 AWUM: 自动唤醒
bit 5 ABOM: 自动总线关闭恢复(0=软件/1=自动)
bit 4 TTCM: 时间触发模式
2.3 主状态寄存器 CAN_MSR
CAN_MSR(Main Status Register):
bit 11 INAK: 初始化确认(1=在初始化)
bit 10 SLAK: 睡眠确认
bit 0 ERRIE: 错误中断使能
2.4 位定时寄存器 CAN_BTR
CAN_BTR(Bit Timing Register):
bit 31 SILM: 静默模式(监听不发送)
bit 30 LBKM: 环回模式(自测)
bit 25-24 SJW[1:0]: 同步跳转宽度
bit 22-16 TS2[6:0]: TSEG2
bit 15-0 TS1+BRP: TSEG1 + 分频
2.5 错误状态寄存器 CAN_ESR
CAN_ESR(Error Status Register):
bit 23-16 REC: 接收错误计数
bit 15-8 TEC: 发送错误计数
bit 6 BOFF: 总线关闭(TEC≥128)
bit 5 EPVF: 错误被动(TEC/REC≥96)
bit 4 EWGF: 错误警告(TEC/REC≥96 进被动前警告)
bit 6-4 LEC: 最后错误码(0无/1填充/2格式/3ACK/4位1/5位0/6CRC)
2.6 发送邮箱寄存器
3 个发送邮箱(每个含 TIxR/TDLxR/TDHxR):
CAN_TIxR(发送邮箱标识符):
bit 31 STID[10:0]: 标准ID
bit 21 EXID[17:0]: 扩展ID
bit 2 IDE: ID扩展(0=标准/1=扩展)
bit 1 RTR: 远程请求(0=数据/1=远程)
bit 0 TXRQ: 发送请求(1=请求发送)
CAN_TDLxR: 数据低 4 字节
CAN_TDHxR: 数据高 4 字节
2.7 接收 FIFO 寄存器
2 个接收 FIFO(每个 3 级,含 RIxR/RDLxR/RDHxR):
CAN_RIxR(接收邮箱标识符):
bit 31 STID[10:0]: 标准ID
bit 21 EXID[17:0]: 扩展ID
bit 2 IDE: ID扩展
bit 1 RTR: 远程请求
CAN_RDTxR(接收时间戳/长度):
bit 3-0 DLC: 数据长度
bit 15 FMI: 过滤器匹配索引
CAN_RDLxR: 数据低 4 字节
CAN_RDHxR: 数据高 4 字节
三、STM32 FDCAN 寄存器
3.1 FDCAN 概述
- STM32 G0/H7/L5(基于 Bosch M_CAN)
- CAN FD 支持(64B 数据段)
- 改进的缓冲结构
3.2 FDCAN 核心寄存器
FDCAN_CREL: 核心版本
FDCAN_ENDN: 结束节点
FDCAN_DBTP: 数据位定时(FD 数据段)
FDCAN_NBTP: 标称位定时(仲裁段)
FDCAN_TSCC: 时间戳计数
FDCAN_TSCV: 时间戳值
FDCAN_ECR: 错误计数器(TEC/REC)
FDCAN_PSR: 协议状态(LEC/BO/EP/EW)
FDCAN_IR: 中断标志
FDCAN_IE: 中断使能
FDCAN_ILS: 中断线选择
FDCAN_ILE: 中断线使能
FDCAN_GFC: 全局过滤器配置
FDCAN_SIDFC: 标准 ID 过滤器配置
FDCAN_XIDFC: 扩展 ID 过滤器配置
FDCAN_TXFIE: 发送缓冲
FDCAN_RXFIC: 接收 FIFO 配置
3.3 FDCAN 发送缓冲
- 32 个发送缓冲(TX Buffer)
- 灵活配置:专用发送缓冲 / FIFO
- 通过 TXBAR(发送缓冲请求)触发发送
3.4 FDCAN 接收 FIFO
- 2 个接收 FIFO(FIFO0/FIFO1)
- 每个可配深度(0-64 元素)
- 支持阻塞/覆盖模式
3.5 FDCAN 消息 RAM
- FDCAN 把缓冲/过滤器放在专用 RAM(非寄存器)
- 配置:TX Buffer 起始/数量,FIFO 起始/深度,过滤器起始/数量
- 消息 RAM 大小有限,要合理分配
四、发送邮箱
4.1 邮箱结构
bxCAN 3 个发送邮箱:
邮箱0: TI0R/TDL0R/TDH0R
邮箱1: TI1R/TDL1R/TDH1R
邮箱2: TI2R/TDL2R/TDH2R
4.2 发送流程
1. 查 TSR(T发送状态)找空邮箱
2. 写 ID(TIxR):ID + IDE + RTR
3. 写数据(TDLxR/TDHxR):数据
4. 写长度 + TXRQ(TIxR bit0=1 请求发送)
5. 等发送完成(TSR 的 TXOK 或中断)
4.3 发送优先级
- TXFP=0(ID 优先):多个邮箱待发,ID 小的先发(硬件仲裁)
- TXFP=1(请求顺序):先请求的先发
4.4 发送中止
- TSR 的 ABRQ 位:中止发送请求
- 邮箱取消发送(不发的部分)
4.5 FDCAN 发送
- 写 TX Buffer(消息 RAM)
- 置 TXBAR 对应位(请求发送)
- 等发送完成中断
五、接收 FIFO
5.1 FIFO 结构
bxCAN 2 个接收 FIFO,每个 3 级:
FIFO0: 3 级(3 帧缓冲)
FIFO1: 3 级(3 帧缓冲)
5.2 接收流程
1. CAN 帧到达 → 过滤器匹配 → 进 FIFO
2. FIFO 非空 → RFxR 的 FMP(消息数)>0
3. 读 RIxR(ID)+ RDTxR(长度)+ RDLxR/RDHxR(数据)
4. 释放 FIFO(RFxR 的 RFOM=1)
5.3 FIFO 溢出处理
-
RFLM=0(覆盖):FIFO 满,新帧覆盖最旧
-
RFLM=1(锁定):FIFO 满,新帧丢弃(留旧)
RFLM=0: 覆盖(实时数据,留最新)
RFLM=1: 锁定(关键数据,留最早,防丢)
5.4 FIFO 中断
- FIFO 消息挂起中断(FMP > 0)
- FIFO 满中断(3 级满)
- FIFO 溢出中断(覆盖/丢弃)
5.5 FDCAN 接收
- FIFO0/FIFO1 可配深度
- 消息 RAM 存储
- 水线中断(可配触发阈值)
六、验收过滤器
6.1 过滤器作用
- 硬件过滤不需要的帧(不进 FIFO,省 CPU)
- 减少中断负担
- 14 组(bxCAN)/ 28 组(FDCAN)
6.2 过滤模式
列表模式(List Mode):
- ID 必须精确匹配列表中的 ID
- 每组过滤 1 个标准 ID(或 2 个,看配置)
- 严格,适合固定 ID
屏蔽模式(Mask Mode):
- ID 和屏蔽码 AND,匹配才接收
- 一组过滤一组 ID(掩码 0 的位忽略)
- 灵活,适合 ID 范围
6.3 过滤器位宽
-
32 位:一个 29bit 扩展 ID + 屏蔽
-
16 位:两个 11bit 标准 ID + 屏蔽(或 4 个标准 ID 列表)
32位屏蔽: ID(29bit) + MASK(29bit)
16位屏蔽: ID(11bit) + MASK(11bit) × 2
32位列表: ID1(29bit) + ID2(29bit)
16位列表: ID1+ID2+ID3+ID4(各11bit)
6.4 过滤器示例
接收 0x123 和 0x124:
列表模式(16位):
过滤器0: ID1=0x123, ID2=0x124
接收 0x100~0x1FF(高 7 位 0010000):
屏蔽模式(16位):
ID=0x100, MASK=0xF80(高5位匹配)
0x123 & 0xF80 = 0x100 ✓
0x1FF & 0xF80 = 0x100 ✓
0x200 & 0xF80 = 0x200 ✗
6.5 过滤器优先级
- 过滤器索引小优先
- 匹配的过滤器索引写入 RDTxR 的 FMI(可追溯是哪个过滤器匹配)
6.6 FDCAN 过滤器
- 28 组(标准 ID + 扩展 ID 分开)
- 消息 RAM 存储
- 更灵活(可配范围/双过滤器)
七、RISC-V N300 M_CAN
7.1 平台概述
- RISC-V N300(Andes)+ Bosch M_CAN IP
- 寄存器同 STM32 FDCAN(M_CAN 架构)
- 消息 RAM 在 SoC 内部 SRAM
7.2 寄存器映射
- M_CAN 寄存器基址(SoC 定义)
- 消息 RAM 基址(配置 MRBA 寄存器)
7.3 初始化流程
c
void can_init(void) {
// 1. 进初始化模式
FDCAN->CCCR |= CCCR_INIT;
while (!(FDCAN->CCCR & CCCR_INIT));
// 2. 配置位定时
FDCAN->NBTP = (SJW<<25) | (TSEG2<<16) | (TSEG1<<8) | BRP;
FDCAN->DBTP = (DSJW<<25) | (DTSEG2<<16) | (DTSEG1<<8) | DBRP; // FD
// 3. 配置消息 RAM
FDCAN->RXF0C = (RXF0_SIZE<<16) | RXF0_BASE;
FDCAN->TXBC = (TXBUF_SIZE<<16) | TXBUF_BASE;
FDCAN->SIDFC = (SIDF_SIZE<<16) | SIDF_BASE;
// 4. 配置过滤器
// (写过滤器列表到消息 RAM)
// 5. 退出初始化
FDCAN->CCCR &= ~CCCR_INIT;
while (FDCAN->CCCR & CCCR_INIT);
}
7.4 消息 RAM 分配
消息 RAM 布局(N300 M_CAN):
0x0000-0x00FF: 标准 ID 过滤器(28 组 × 4B)
0x0100-0x01FF: 扩展 ID 过滤器(28 组 × 8B)
0x0200-0x09FF: RX FIFO0(N × 64B)
0x0A00-0x11FF: RX FIFO1(N × 64B)
0x1200-0x19FF: TX Buffer(N × 64B)
八、关键问题 Q&A
Q1:bxCAN 和 FDCAN 有什么区别?
A:
- bxCAN(STM32 F1/F4):经典 CAN,3 邮箱/2 FIFO×3 级/14 过滤器,寄存器直接操作
- FDCAN(STM32 G0/H7,基于 M_CAN):CAN FD,32 TX Buffer/2 FIFO 可配深度/28 过滤器,缓冲在消息 RAM
- 软件驱动不同(寄存器结构变),移植要改驱动
Q2:发送邮箱怎么用?
A :3 个邮箱(bxCAN):① 查 TSR 找空邮箱;② 写 ID(TIxR);③ 写数据(TDLxR/TDHxR);④ 写长度+TXRQ(TIxR bit0=1);⑤ 等发送完成(TSR TXOK 或中断)。多帧可同时写 3 邮箱,硬件按优先级(TXFP=0 ID 小先发)发送。
Q3:接收 FIFO 溢出怎么处理?
A :两种模式:RFLM=0 覆盖 (FIFO 满新帧覆盖最旧,适合实时数据留最新)/ RFLM=1 锁定(FIFO 满新帧丢弃留旧,适合关键数据防丢)。按应用选。实时控制用覆盖,关键报文用锁定。FIFO 满有中断,及时读。
Q4:验收过滤器列表模式和屏蔽模式怎么选?
A:
- 列表模式:精确匹配固定 ID。适合接收少数固定 ID(如诊断 0x7E8)。每组过滤 1-4 个 ID。
- 屏蔽模式:ID 范围匹配。适合接收一组 ID(如 0x100~0x1FF)。ID + 屏蔽码,掩码 0 的位忽略。
- 复杂场景混合用(部分列表部分屏蔽)。
Q5:FDCAN 消息 RAM 怎么分配?
A:FDCAN 缓冲(TX Buffer/FIFO/过滤器)在专用消息 RAM(非寄存器)。按需分配:标准 ID 过滤器(28×4B)+ 扩展 ID 过滤器(28×8B)+ RX FIFO0(N×64B)+ RX FIFO1(N×64B)+ TX Buffer(N×64B)。RAM 大小有限(N300 通常 4KB),合理分配,避免溢出。
Q6:N300 M_CAN 和 STM32 FDCAN 寄存器一样吗?
A :基本一样(都基于 Bosch M_CAN IP)。寄存器名/位定义同(NBTP/DBTP/TXBC/RXF0C/CCCR 等)。差异:基址(SoC 定义)、消息 RAM 基址、中断号、时钟。驱动代码可移植(改基址和中断配置)。
九、实战案例
案例 1:bxCAN 初始化卡在 INAK
现象:写 INRQ=1,等 INAK=1 超时。
分析:① CAN 时钟没开(RCC);② CAN_TX/CAN_RX 引脚没配;③ 总线无终端(收发器没工作)。
解决:开 CAN 时钟,配 CAN 引脚复用,确认收发器和终端电阻。
案例 2:发送邮箱写不进
现象:写 TIxR,TSR 显示邮箱非空(被占用)。
分析:3 邮箱都在发(或前一帧没发完)。bxCAN 只有 3 邮箱。
解决:等邮箱空(中断或轮询),或用 FIFO 模式(FDCAN TX FIFO)。
案例 3:接收 FIFO 溢出丢帧
现象:高频率接收,FIFO 满丢帧(RFLM=0 覆盖)。
分析:CPU 处理慢,FIFO 3 级不够,新帧覆盖旧。
解决:① 提高处理优先级(中断);② 用 DMA(部分控制器支持);③ RFLM=1 锁定保关键;④ 减少总线负载。
案例 4:过滤器配错,收到无关帧
现象:配置过滤器后,仍收到不该收的 ID。
分析:屏蔽码配错(掩码 0 太多),或过滤器模式配错(列表/屏蔽混)。
解决:核对 ID/MASK,屏蔽码 1 的位必须匹配,0 的位忽略。用 FMI 追溯哪个过滤器匹配。
案例 5:FDCAN 消息 RAM 溢出
现象:FDCAN 配置后,初始化失败或收发异常。
分析:消息 RAM 分配超出物理 RAM(4KB),TX Buffer + FIFO + 过滤器总和超。
解决:精简分配,减 FIFO 深度或 TX Buffer 数,总和 < RAM 大小。
案例 6:CAN FD 数据段 CRC 错
现象:FDCAN 仲裁段正常,数据段 5M CRC 错。
分析:DBTP 配错(数据段位定时),采样点偏。
解决:重配 DBTP(采样点 80%,TSEG1/TSEG2 重新算),5M 稳定。
案例 7:过滤器索引 FMI 调试
现象:想知道接收帧被哪个过滤器匹配。
分析:RDTxR 的 FMI 字段记录匹配的过滤器索引。
解决:读 FMI,定位过滤器,调试过滤逻辑(确认 ID 范围)。
案例 8:N300 M_CAN 移植 STM32 驱动
现象:把 STM32 FDCAN 驱动移植到 N300,初始化失败。
分析:基址/中断号/时钟/消息 RAM 基址不同。
解决:改基址宏(N300 SoC 定义),改中断号,改时钟使能(RISC-V 时钟控制),配置消息 RAM 基址(MRBA)。
十、本篇小结与速查
核心要点
- Bosch CAN IP:C_CAN(经典)→ M_CAN(FDCAN,高性能)
- bxCAN(STM32 F1/F4):MCR/MSR/BTR/ESR,3 邮箱/2 FIFO×3级/14 过滤器
- FDCAN(STM32 G0/H7,M_CAN):CAN FD,32 TX Buffer/2 FIFO 可配/28 过滤器,消息 RAM
- 发送邮箱:3 个(bxCAN),TXFP 选 ID 优先/请求顺序
- 接收 FIFO:2 个×3 级(bxCAN),RFLM 选覆盖/锁定
- 验收过滤器:列表模式(精确)/屏蔽模式(范围),14/28 组
- ESR:TEC/REC 错误计数,BOFF/EPVF/EWGF 状态,LEC 错误码
- M_CAN:NBTP(标称)/DBTP(数据),消息 RAM 存缓冲/过滤器
- RISC-V N300:M_CAN IP,寄存器同 STM32 FDCAN,改基址/中断/时钟
bxCAN 寄存器速查
| 寄存器 | 作用 |
|---|---|
| MCR | 主控(INRQ/SLEEP/NART/ABOM/TTCM) |
| MSR | 主状态(INAK/SLAK) |
| BTR | 位定时(SJW/TS2/TS1/BRP + LBKM) |
| ESR | 错误(TEC/REC/BOFF/EPVF/LEC) |
| TIxR | 发送 ID(STID/EXID/IDE/RTR/TXRQ) |
| TDLxR/TDHxR | 发送数据 |
| RIxR | 接收 ID |
| RDTxR | 接收长度/时间戳/FMI |
| RDLxR/RDHxR | 接收数据 |
| FMR/FM1R/FS1R/FFA1R/FA1R | 过滤器配置 |
FDCAN 寄存器速查
| 寄存器 | 作用 |
|---|---|
| CCCR | 主控(INIT/CCE/FDOE/BRSE) |
| NBTP | 标称位定时(仲裁段) |
| DBTP | 数据位定时(FD 数据段) |
| ECR | 错误计数(TEC/REC) |
| PSR | 协议状态(LEC/BO/EP/EW) |
| IR/IE | 中断标志/使能 |
| GFC/SIDFC/XIDFC | 过滤器配置 |
| TXBC/TXBAR | 发送缓冲/请求 |
| RXF0C/RXF1C | 接收 FIFO 配置 |
过滤器模式速查
| 模式 | 位宽 | 匹配 |
|---|---|---|
| 列表 | 16位 | 4 个标准 ID |
| 列表 | 32位 | 2 个扩展 ID |
| 屏蔽 | 16位 | 2 组(ID+MASK)标准 |
| 屏蔽 | 32位 | 1 组(ID+MASK)扩展 |
FIFO 溢出速查
| RFLM | 行为 | 适用 |
|---|---|---|
| 0 | 覆盖(留最新) | 实时数据 |
| 1 | 锁定(留最早) | 关键数据 |
初始化检查清单
- 开 CAN 时钟 + 引脚复用
- 收发器供电 + 终端电阻
- INRQ=1 进初始化,等 INAK=1
- BTR 位定时(全网一致,采样点 87.5%)
- FD:DBTP 数据段位定时
- 消息 RAM 分配(FDCAN,不溢出)
- 过滤器配置(列表/屏蔽)
- 中断使能(发送/接收/错误)
- ABOM 总线关闭恢复(自动/软件)
- 退出初始化(INRQ=0,等 INAK=0)
延伸阅读
- \[03-CAN位定时与同步] ------ BTR 配置深入
- \[06-CAN错误处理与错误帧] ------ ESR 错误状态
- \[09-CAN传输模式-轮询-中断-DMA] ------ 寄存器操作实战
- \[10-CAN错误恢复与总线关闭] ------ Bus-Off 恢复
- \[11-CAN Linux驱动框架] ------ Linux CAN 驱动
- \[08-SPI控制器寄存器与IP架构] ------ 对比 SPI 控制器
- \[08-I2C控制器寄存器与IP架构] ------ 对比 I2C 控制器
参考资料
- Bosch C_CAN User Manual
- Bosch M_CAN User Manual
- STM32 RM0090(bxCAN 章节)
- STM32 RM0433(FDCAN 章节)
- Andes N300 M_CAN 文档
\[00-CAN技术系列总目录] · 上一篇:\[07-CAN高层协议] · 下一篇:\[09-CAN传输模式-轮询-中断-DMA]
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞 | ⭐ 收藏 | 👀 关注
如果你在调试过程中遇到了其他问题,
欢迎在 评论区 💬 留言,我们一起探讨。
关注我,一起交流底层开发的那些事儿!🚀