一、TC397 CAN 模块总体资源表(解读)
1.1 表格原文
| 参数 | CAN0 | CAN1 | CAN2 | 说明 |
|---|---|---|---|---|
| Node size in byte | 1024 | 1024 | 1024 | 每个 CAN 模块的私有 RAM 大小 |
| Number of CAN Nodes | 4 | 4 | 4 | 每个模块包含的 CAN 控制器数量 |
| Max Standard ID Filters | 128 | 128 | 128 | 最多 128 个 11 位 ID 滤波器 |
| Max Extended ID Filters | 64 | 64 | 64 | 最多 64 个 29 位 ID 滤波器 |
| Max RxFIFO Structures | 2 | 2 | 2 | 最多 2 个接收 FIFO(FIFO0/1) |
| Max Messages in Rx buffer | 64 | 64 | 64 | 每个 Rx FIFO 最多 64 个元素 |
| Max Tx Event Messages | 32 | 32 | 32 | Tx Event FIFO 最多 32 条记录 |
| Max Tx Messages in Tx Buffer | 32 | 32 | 32 | 整个模块共享的发送缓冲区数量(硬件邮箱) |
| Number of Trigger Messages | 64 | 64 | 64 | 最多 64 个触发消息 |
每个 CAN 模块包含 4 个 CAN 控制器(Node),它们共享模块内的 RAM、滤波器、发送/接收缓冲区等资源。
二、核心概念深度解析
2.1 Node size(CAN 模块 RAM)------ 用户疑问重点
问题回顾:Node size 是什么?RAM 干嘛的?为什么决定硬件对象数量?
定义
-
Node size 是指每个 CAN 模块内部专用的静态 RAM 大小(单位字节),TC397 中为 1024 字节。
-
这块 RAM 不是 CPU 的主内存,而是 CAN 控制器的私有缓存,用于存储所有硬件对象:滤波器表、发送/接收邮箱、FIFO 队列、事件记录等。
RAM 的作用
-
每配置一个硬件对象(如一个滤波器、一个发送邮箱、一个 Rx FIFO 元素)都会固定占用 RAM 中的若干字节。
-
硬件对象的总 RAM 占用必须 ≤ 1024 字节,否则配置失败。
为什么决定硬件对象数量?
每个硬件对象的 RAM 占用量是固定的(由芯片设计决定)。例如:
-
一个标准 ID 滤波器占 4 字节。
-
一个发送邮箱(Tx Buffer)占 ~18 字节。
-
一个 Rx FIFO 元素占 ~18 字节。
因此,1024 字节的 RAM 总量,限制了你能同时使用的最大对象数量。例如:
-
如果用满 128 个标准滤波器 → 512 字节
-
再用满 32 个发送邮箱 → 576 字节
总和 1088 > 1024,配置会失败。必须减少滤波器或邮箱数量。
实际配置中的意义
-
在 AUTOSAR 配置工具(如 EB tresos)中,为 CAN 模块分配滤波器数量、邮箱数量、FIFO 深度时,工具会自动计算 RAM 占用,并提示是否超出。
-
总结:RAM 是硬件对象的"仓库",仓库大小有限,配置时需精打细算。
2.2 滤波器(Filter)的作用
定义
滤波器是 CAN 控制器硬件中的验收过滤条件,用于在硬件层直接判断哪些 ID 的报文可以被接收并存放到指定的接收邮箱或 FIFO。
核心作用
-
减轻 CPU 负载:硬件自动丢弃不感兴趣的报文,无需 CPU 参与。
-
支持白名单/掩码匹配:可精确匹配 ID,也可用掩码匹配一组 ID。
-
与接收对象关联:每个滤波器可指定匹配后的报文存入哪个 Rx Buffer 或 Rx FIFO。
类型与大小(TC397)
| 滤波器类型 | 位宽 | 每个占用 RAM | 最大数量 |
|---|---|---|---|
| 标准 ID 滤波器 | 11 bit | 4 字节 | 128 |
| 扩展 ID 滤波器 | 29 bit | 8 字节 | 64 |
举例
-
某节点只关心 CAN ID = 0x100 和 0x101 的标准帧。
→ 配置 2 个标准滤波器分别匹配这两个 ID。
→ 其他 ID 的报文硬件直接丢弃。
→ 匹配上的报文存入指定的 Rx Buffer 或 FIFO。
2.3 FIFO(先进先出队列)的作用
定义
FIFO 是由多个硬件邮箱(Buffer)串联组成的队列,用于缓存多个报文。TC397 中:
-
Rx FIFO:接收队列,可配置深度(最多 64 个元素)。
-
Tx FIFO/Queue:发送队列(由 Tx Buffer 的一部分组成)。
Rx FIFO 的作用
| 特性 | 说明 |
|---|---|
| 吸收突发流量 | 多个报文连续到达时,先存入 FIFO,CPU 可稍后处理,避免丢帧。 |
| 降低实时性要求 | CPU 不必在每次接收中断中立即读取。 |
| 与滤波配合 | 可将多个 ID 的报文路由到同一个 Rx FIFO,简化软件处理。 |
Tx Queue 的作用
-
CPU 可以一次将多帧待发送报文放入 Tx Queue,硬件自动依次发送(无需 CPU 等待发送完成)。
-
提高发送效率,特别适合突发性事件报文。
FIFO 与专用 Buffer 的选择
| 场景 | 推荐方案 |
|---|---|
| 高频、突发接收 | Rx FIFO |
| 低频、重要报文 | 专用 Rx Buffer(新数据覆盖旧数据,需及时读) |
| 多个发送报文排队 | Tx Queue |
| 周期性、高优先级发送 | 专用 Tx Buffer |
2.4 Buffer(邮箱)与 FIFO 的处理时序
Buffer(单个邮箱)
-
接收:新报文直接覆盖旧内容(若未及时读取)。
-
发送:每次只能放一帧,等待发送完成才能放下一帧(或使用多个专用 Buffer 并行)。
FIFO(多个 Buffer 组成队列)
-
接收:硬件按顺序将报文写入 FIFO 的空槽位,CPU 按顺序读取。只要 FIFO 未满,不会丢帧;满时新报文会溢出(可配置溢出行为)。
-
发送:CPU 将多帧推入 FIFO,硬件从头部取出一帧发送,完成后自动取下一帧。发送 FIFO 空时停止。
时序对比图(ASCII)
text
专用 Rx Buffer:
报文1→ [Buffer] 被覆盖为报文2 → CPU 读取时只能得到最新帧
Rx FIFO (深度3):
报文1→ [1, , ] 写指针++
报文2→ [1,2, ] 写指针++
报文3→ [1,2,3] 写指针++ (满)
CPU读→ [ ,2,3] 读指针++ → 得到报文1
报文4→ [ ,2,3] 若 FIFO 满,则报文4可配置为覆盖或丢弃
三、RAM 需配置的元素汇总(以 TC397 为例)
| 硬件对象 | 英文 | 每个元素大小 | 最大数量 | 用途 |
|---|---|---|---|---|
| 标准滤波器 | Standard ID Filter | 4 字节 | 128 | 接收过滤 11 位 ID |
| 扩展滤波器 | Extended ID Filter | 8 字节 | 64 | 接收过滤 29 位 ID |
| Rx FIFO 元素 | Rx FIFO Element | ~18 字节 | 64 每个 FIFO | 接收队列缓存 |
| Rx 专用缓冲区 | Rx Dedicated Buffer | ~18 字节 | 64 | 固定 ID 接收 |
| Tx 缓冲区(邮箱) | Tx Buffer | 18 字节 | 32 | 发送邮箱(可分专用/队列) |
| Tx Event FIFO 元素 | Tx Event Element | 4~8 字节 | 32 | 发送状态记录 |
| Trigger 消息 | Trigger Message | 2~4 字节 | 64 | 硬件事件触发的发送 |
总 RAM = 1024 字节。配置时需计算占用总和,严禁超标。
四、配置示例与计算公式
4.1 典型配置方案(中等负载)
| 对象 | 数量 | 单个大小 | 总字节 |
|---|---|---|---|
| 标准滤波器 | 20 | 4 | 80 |
| 扩展滤波器 | 5 | 8 | 40 |
| Rx FIFO0(深度) | 16 | 18 | 288 |
| Rx 专用 Buffer | 8 | 18 | 144 |
| Tx Buffer(专用 + 队列) | 24 | 18 | 432 |
| Tx Event FIFO | 16 | 4 | 64 |
| 合计 | 1048(略超,需微调) |
实际应使总和 ≤ 1024。可减少 Rx FIFO 深度或滤波器数量。
4.2 发送邮箱分配原则
-
每个 CAN 模块共有 32 个 Tx Buffer(硬件邮箱)。
-
可划分:
-
Dedicated Tx Buffer:每个 Buffer 固定用于发送一个特定的 CAN ID(适合周期性或高优先级报文)。
-
Tx Queue:多个 Buffer 组成 FIFO,供低优先级或突发报文共享。
-
-
例如:20 Dedicated + 12 Queue → 总 32 个 Buffer。
五、常见问题与解答(来自用户提问)
Q1:Node size 是什么?为什么决定硬件对象数量?
A:Node size 是 CAN 模块内部的私有 RAM 大小。每个硬件对象(滤波器、邮箱等)都占用固定大小的 RAM 空间,因此 RAM 总量直接限制了可配置对象的数量。
Q2:滤波器和 FIFO 分别起什么作用?
A:滤波器是硬件"守门员",只让需要的报文通过;FIFO 是硬件"缓冲池",用于吸收突发流量,缓解 CPU 压力。
Q3:Buffer 和 FIFO 有什么关系?
A:Buffer 是单个邮箱(1 个槽位)。FIFO 是由多个 Buffer 组成的队列(多个槽位),提供先进先出行为。
Q4:发送邮箱只有 32 个,如何满足发送 100 种不同 ID 报文的需求?
A:可以将部分 ID 共享同一个邮箱(即这些 ID 的报文不会同时发送,通过软件队列排队)。或者使用 Tx Queue 模式,由硬件自动排队发送。不能同时拥有超过 32 个并行发送的专用邮箱。