CAN-超时计数器(Timeout Counter)
超时计数器
(Timeout Counter)
概述
本文基于Bosch的《M_CAN Controller Area Network User’s Manual》,超时计数器是 M_CAN(控制器区域网络)中一项关键的硬件监测机制,专门用于实时监测 Rx FIFO 0、Rx FIFO 1 和 Tx Event FIFO 这三类存储结构的数据流处理状态。其核心功能是在 FIFO 中的数据长时间未被主机读取(Rx FIFO)或事件未被响应(Tx Event FIFO)时,通过硬件级触发提醒,确保数据处理的实时性,同时减少软件轮询带来的系统开销。
作用
-
超时计数器是 M_CAN 为这三个关键存储结构设计的 “超时监测工具”
-
Rx FIFO 0
-
Rx FIFO 1
-
Tx Event FIFO
-
-
会在 FIFO 数据长时间未被主机处理时触发提醒
-
Rx FIFO 的数据未读取
-
Tx Event FIFO 的事件未响应
-
-
核心目标
- 通过硬件级监测,确保 FIFO 数据处理的实时性,减少软件轮询的开销
超时计数器的硬件特性与基础规则
硬件参数
-
16-bit 宽度
-
计数范围为 0x0000 ~ 0xFFFF(共 65536 个数值)
-
可覆盖从 “微秒级” 到 “秒级” 的超时周期(取决于 CAN 位时间配置)
-
-
递减计数器(down-counter)
- 计数器从 “预设值” 开始逐次减 1,减到0x0000时触发超时
-
共享预分频器(TSCC.TCP)
-
与 “时间戳计数器” 共用预分频器。
- 确保两者的 “时间单位一致”
-
决定 “计数器每递减 1 所需的时间”
-
计数周期 = (TSCC.TCP + 1) × CAN 位时间
- 例如:CAN 位时间 = 2μs,TSCC.TCP=3 → 计数周期 = 4×2μs=8μs,即每 8μs 计数器减 1
-
配置与读取寄存器
-
配置寄存器:
-
TOCC(Timeout Counter Configuration):
-
负责设置超时计数器的:
-
超时周期
-
工作模式
-
使能状态
-
-
-
读取寄存器:
-
TOCV(Timeout Counter Value)
-
通过TOCV.TOC[15:0]读取计数器当前的递减值
-
例如:TOCV.TOC=0x0080,表示计数器还剩 128 个计数周期才超时
-
-
启动与停止条件
-
启动条件:
- 仅当CCCR.INIT = 0(M_CAN 初始化完成,进入正常工作模式)时,超时计数器才能启动
-
停止条件:
-
当CCCR.INIT = 1(M_CAN 进入初始化状态)时,计数器强制停止
-
典型场景是 M_CAN 进入Bus_Off 状态(总线离线,因错误计数器超限)
-
此时 CAN 通信中断,超时监测无意义
-
-
TOCC 寄存器的关键位
-
ETOC
-
TOCC.0
-
超时计数器使能位
-
0 = 禁用
-
1 = 启用(必须置 1,计数器才会工作)
-
-
-
TOS[1:0]
-
TOCC.2:1
-
操作模式选择
-
00 = 连续模式
-
01 = 由 Tx Event FIFO 控制
-
10 = 由 Rx FIFO 0 控制
-
11 = 由 Rx FIFO 1 控制
-
-
-
TOP[15:0]
-
TOCC.31:16
-
超时周期(预设值)
-
计数器启动时的初始值,决定 “从启动到超时的总时间”
-
(总时间 = TOP × 计数周期)
-
-
工作模式
-
连续模式(Continuous Mode,TOS=00)
-
启动时机
- 当CCCR.INIT从 1(初始化)复位为 0(正常工作)
-
手动预设逻辑
-
向TOCV寄存器写入任意值时,计数器会立即被 “预设为 TOCC.TOP”,且继续递减
-
非停止计数
-
例如:计数器当前值 = 0x0050,TOCC.TOP=0x0100,写 TOCV 后,计数器变为 0x0100,下一个计数周期减为 0x00FF
-
-
-
循环特性
-
无间断监测
-
超时(计数器到 0)后,计数器会立即重新加载 TOCC.TOP,继续下一轮递减
-
-
应用场景
-
适用于 “全局超时监测”
-
例如系统需要定期检查 FIFO 状态,无论 FIFO 是否有数据,都持续监测超时
-
如防止系统死机导致 FIFO 长期未处理
-
-
-
-
FIFO 控制模式(TOS=01/10/11)
-
空 FIFO 状态
-
仅待命
-
当受控的 FIFO(如 Rx FIFO 0)为空时,计数器会被 “预设为 TOCC.TOP”,但不开始递减
-
-
启动计数时机
-
监测 “数据存入后到处理的时间”
-
当第一个数据元素存入 FIFO 时,计数器才开始从 TOCC.TOP 递减
-
-
写 TOCV 无效
-
向 TOCV 写入值不会改变计数器状态
-
避免软件误操作干扰 FIFO 专属监测
-
-
重置逻辑
-
若 FIFO 中的数据被主机处理(如 Rx FIFO 数据被读取、FIFO 清空)
-
计数器会重新被预设为 TOCC.TOP,等待下一个 FIFO 元素存入
-
-
应用场景
-
适用于 “FIFO 数据专属监测”
-
例如监测 Rx FIFO 0 中的数据是否在预设时间内被 CPU 读取
-
若超过时间未读取,触发超时中断,提示 CPU 处理
-
-
-
超时触发与中断反馈
-
超时触发动作
-
无论哪种模式,当计数器递减到0x0000时,中断标志 IR.TOO(Timeout Occurred,位 18)会置 1
-
若需触发硬件中断,需额外配置IE.TOOE(位 18)为 1
-
并通过ILS.TOOL配置中断线(m_can_int0/m_can_int1)
-
-
-
模式差异处理
-
连续模式
- 超时后立即重新加载 TOCC.TOP,继续下一轮计数
-
FIFO 控制模式
-
超时后仅置位 IR.TOO,计数器状态随 FIFO 变化
- 空 FIFO 时保持 TOCC.TOP,新元素存入时重新启动递减
-
-
注意事项
时钟来源导致的计数偏差
-
超时计数器时钟来源:CAN Core 的采样点信号
-
CAN Core 机制:
-
通过同步 / 重同步机制调整采样点位置
-
如总线信号延迟时
-
-
结果:
- 计数器每次递减精确时间有微小偏差
-
宏观情况:
- 超时周期仍符合 TOCC.TOP 配置
CAN FD 位速率切换的影响
-
CAN FD 位速率切换(BRS=1)时仲裁段(低速)和数据段 (高速)CAN 位时间不同
- 由 NBTP/DBTP 分别配置
-
由于超时计数器的计数周期 = (TSCC.TCP + 1) × CAN 位时间
- 因此计数器在仲裁段和数据段的递减间隔会不同
-
示例:若 TSCC.TCP=3(计数周期系数为 4),仲裁段位时间 = 2μs(对应 500kbit/s)、数据段位时间 = 0.5μs(对应 2Mbit/s)
- 则仲裁段计数周期 = 4×2μs=8μs,数据段计数周期 = 4×0.5μs=2μs
-
注意:
- 该差异是 CAN 位时间变化导致,计数器本身仍按 “计数周期递减” 的基础逻辑工作”
工作流程
以 Rx FIFO 0 控制模式为例:
配置阶段
-
写TOCC
-
ETOC=1(使能)
-
TOS=10(Rx FIFO 0 控制)
-
TOP=0x0400(预设值 1024)
-
-
写TSCC.TCP=3
- 计数周期 = 4×CAN 位时间 = 4×2μs=8μs
-
写IE.TOOE=1
- 使能超时中断
待命阶段
- Rx FIFO 0 为空,计数器被预设为0x0400,不递减
计数阶段
- 第一个数据存入 Rx FIFO 0,计数器开始从0x0400递减(每 8μs 减 1)
超时触发
- 若 1024×8μs=8.192ms 内数据未被读取,计数器减到0x0000,IR.TOO=1,触发中断
重置阶段
- PU 读取 Rx FIFO 0 数据,FIFO 清空,计数器重新预设为0x0400,等待下一个数据存入
总结
硬件基础
- 16 位递减计数器 + 共享预分频器(TSCC.TCP)→ 统一时间单位
配置核心
- TOCC 寄存器(使能、模式、超时周期)+ TOCV 寄存器(读当前值)
工作模式
-
连续模式(初始化后持续计数,超时循环)
-
FIFO 模式(数据存入才计数,空 FIFO 待命)
超时反馈
- 计数器到 0 置位 IR.TOO,需配合 IE 寄存器使能中断
特殊场景
- CAN FD 位速率切换会改变计数间隔,需注意超时周期偏差