CAN 技术系列 08 · CAN 控制器寄存器与 IP 架构

📚 CAN总线技术系列 · 持续更新中

本系列从差分电气层一路打到 Linux SocketCAN,把"两根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。

👉 想系统追更,戳这里查看完整专栏:

【CAN 技术系列】

👉 其他技术系列专栏,欢迎关注、交流、共同成长:

【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]


✨ 感谢你的阅读 ✨

技术之路漫漫,分享是为了更好地交流。

如果本文的内容对你有启发,希望能得到你的支持:

👍 点赞 | ⭐ 收藏 | 👀 关注

如果你在调试过程中遇到了其他问题,

欢迎在 评论区 💬 留言,我们一起探讨。

关注我,一起交流底层开发的那些事儿!🚀


相关推荐
微三云 - 廖会灵 (私域系统开发)2 小时前
企业级 SaaS 系统架构设计:单体、微服务还是模块化单体?技术选型实战
微服务·架构·系统架构
硅基手札2 小时前
CAN 技术系列 09 · CAN 传输模式:轮询 / 中断 / DMA
驱动开发·bsp·嵌入式开发·通信协议·can总线
智慧物业老杨3 小时前
包干制小区物业系统:面向成本管控的架构与落地实践
架构
北漂人Java3 小时前
单智能体三:Router-Skill 工业级 Agent 分工解耦架构,解决大模型技能泛滥难题
架构
懿路向前4 小时前
唤醒工作台全实录(六):数据层——5ms 竞态窗口与“查询即引用“
华为·架构·harmonyos
pt10434 小时前
Cisco设备网络安全系列-20:DevSecOps集成
网络·安全·架构
ai_xiaogui5 小时前
PanelAI项目实战:从AI一键生成到企业级AI基础设施操作系统PPT手搓复盘与架构落地
人工智能·架构·一键部署·panelai·企业级ai基础设施操作系统·ai智能底层操作系统·算力变现
Dawson Zhu5 小时前
【Runtime推理引擎①】Runtime架构设计:从Session到Graph Executor的完整骨架
人工智能·语言模型·架构·aigc·agi
郝学胜-神的一滴5 小时前
AI 编程智能体 20:技术栈选型与架构落地全攻略
人工智能·python·架构·langchain·1024程序员节·智能体