中断管理
13 Dec 2023
Read time: 1 minute(s)
CAN 控制器提供八种中断,具体如下:
- 总线错误中断 ERRB_INT
控制器在总线上检测到错误时触发此中断。错误类型和错误位置都将被捕获记录在状态寄存器 CAN_STAT 的 ERR_TYPE 和 ERR_CODE 中。状态被清除之前(通过 CPU 的读取),将不会再记录新的总线错误信息。
- 仲裁丢失中断 ARBLOST_INT
控制器发送报文并且丢失仲裁时触发此中断。丢失仲裁位置将被捕获记录在状态寄存器 CAN_STAT 的 ARBLOST_CAP 中,状态被清除之前(通过 CPU 读取),将不会再记录新的仲裁丢失位置。
- 被动错误中断
- 唤醒中断
- 数据溢出中断
- 错误报警中断 ERRW_INT
状态寄存器 CAN_STAT 中 ERR_STAT 或 BUS_STAT 的位值发生改变(由 0 变 1 或由 1 变 0)都会触发此中断。触发时状态值可分以下几种:
- ERR_STAT = 0 与 BUS_STAT = 0:
- 如果控制器处于主动错误状态,则表示 TEC 和 REC 的值都返回 ERRWT 所设阈值之下。
- 如果控制器此前处于总线恢复状态,则表示此时总线恢复已成功完成。
- ERR_STAT = 1 与 BUS_STAT = 0:表示 TEC 或 REC 数值已超过 ERRWT 所设阈值。
- ERR_STAT = 1 与 BUS_STAT = 1:表示控制器已进入离线状态(TEC ≥ 255)。
- ERR_STAT = 0 与 BUS_STAT = 1:表示总线恢复期间,控制器 TEC 数值已低于 ERRWT 所设阈值。
- ERR_STAT = 0 与 BUS_STAT = 0:
- 发送中断 TX_INT
当发送缓冲器空闲,将其他报文加载到缓冲器中等待发送时,都会触发此中断。
- 接收中断 RX_INT
当接收 FIFO 中有待读取报文(接收数据计数寄存器 CAN_RXC 中 RXC > 0)时触发此中断。计数的报文数量包括有效报文和溢出报文。直到通过 RXB_REL 指令位清除所有挂起接收报文后,接收中断才会失效。
中断可由中断寄存器 CAN_INTR 定义,设置中断使能寄存器
CAN_INTEN 中相应的使能位,可以单独允许和禁用每个中断源。中断的工作原理和规则如下:
- 当有一个或多个中断触发,控制器 IRQ 有效,当所有中断位都被清除,控制器 IRQ 失效。
- 中断寄存器被读取后,除接收中断外,其中的中断位将自动清除。
- 接收中断直到通过 RXB_REL 指令位清除所有接收报文后,才能被清除,否则会影响接收缓冲状态 RXB_STAT。