M_CAN整理之m_can_ir_handling

此文为博世官网文档《m_can_an003_v1.2_ir_handling 》的译文。

1 Target

本应用笔记介绍M_CAN 3.1.0 至 3.3.0 版本中的中断处理机制。

2 Interrupt Lines

中断线路数量

M_CAN 具备2 条中断线路,分别为 m_can_int0 和 m_can_int1。

中断类型

M_CAN 采用电平触发式中断线路,具体规则如下:

  • 高电平('1'):中断处于激活状态
  • 低电平('0'):中断未激活

当 M_CAN 需要上报中断时,会将中断线路 1 和 / 或中断线路 2 置为逻辑高电平('1'),并保持该电平状态,直至主机对中断进行服务处理。

3 中断寄存器

概述

用于中断处理的寄存器包含以下四类,各自承担不同功能:

  1. IR:中断寄存器该寄存器存储各类中断标志位,M_CAN 会根据特定条件置位这些标志位。例如,当新报文进入接收 FIFO 0 时,IR 寄存器中的 RF0N 标志位(接收 FIFO 0 新报文)会被置位,且这些标志位会保持置位状态,直至主机将其清零。只要对应触发条件出现,M_CAN 就会置位 IR 寄存器中的相应中断标志位;但只有在 IE 寄存器中被使能的中断标志位,才会通过中断线路向外上报中断信号。

  2. IE:中断使能寄存器 每个中断标志位均可通过 IE 寄存器进行使能或禁用配置。通过 IE 寄存器禁用某一中断,并不会影响 IR 寄存器中对应中断标志位的置位操作,IE 寄存器仅在生成中断线路电平信号前,对 IR 寄存器的标志位进行掩码处理。第 5 页的图 1 展示了 IE 寄存器在中断生成过程中的作用机制,默认状态下所有中断均为禁用状态。

  3. ILS:中断线路选择寄存器通过配置 ILS 寄存器,可将每个中断标志位分配至两条中断线路中的任意一条。默认状态下,所有中断均被分配至 m_can_int0 线路。

  4. ILE:中断线路使能寄存器 ILE 寄存器用于对中断线路进行整体使能或禁用控制,通往 CPU 的两条中断线路可被分别独立使能或禁用。

补充说明

  1. 中断标志位 IR.TCF(发送取消完成) 该标志位的置位由 TXBCIE 寄存器(发送缓冲区取消完成中断使能)的配置决定。M_CAN 最多可配置 32 个发送缓冲区(Tx Buffer),通过对 TXBCIE 寄存器进行配置,可单独使能或禁用每个发送缓冲区触发IR.TCF 中断的功能。例如,若 TXBCIE 寄存器的值为 0x2(二进制为 0000 0010),且发送缓冲区 1 的发送请求取消操作完成(可通过 TXBCF 寄存器确认),那么 IR 寄存器中的 IR.TCF 中断标志位会被置位。

  2. 中断标志位 IR.TC(发送完成) 该标志位的置位由 TXBTIE 寄存器(发送缓冲区发送完成中断使能) 的配置决定。M_CAN 最多支持 32 个发送缓冲区,通过配置 TXBTIE 寄存器,可单独控制每个发送缓冲区是否能触发 IR.TC 中断。例如,若 TXBTIE 寄存器的值为 0x4(二进制为 0000 0100),且发送缓冲区 2 的报文发送操作完成(可通过TXBTO寄存器确认),那么 IR 寄存器中的 IR.TC 中断标志位会被置位。

4 清除中断

每个中断标志位可被单独清除。主机(CPU)需向对应标志位的比特位写入1 来完成清除操作,写入 0 则不会产生任何效果。

5 中断通知

图 1 展示了 M_CAN 如何通过中断线路向主机上报产生的中断,该过程可总结为以下四个步骤:

  1. 当对应的标志触发条件出现时,M_CAN 总会将 IR 寄存器中的相应中断标志位置位。其中,IR.TCF 和 IR.TC 两个中断标志位的置位,分别取决于 TXBCIE、TXBTIE 寄存器的配置,以及 TXBCF、TXBTO 寄存器的状态。
  2. 只有通过 IE 寄存器使能的中断,才会通过中断线路向主机发送中断信号。需注意的是,即便某一中断通过 IE 寄存器被禁用,M_CAN 仍会在对应条件满足时置位 IR 寄存器中的该中断标志位。
  3. 通过配置 ILS 寄存器,可将每个中断分配至两条中断线路中的任意一条。
  4. 若根据 ILE 寄存器中的 ILE.EINT0 和 ILE.EINT1 位,所选的中断线路处于使能状态,M_CAN 就会通过该中断线路向主机发送中断通知。

中断操作

步骤
  1. 主机对中断寄存器进行配置(详见第 3 章和第 5 章)。
  2. M_CAN 通过 2 条中断线路上报中断信号。
  3. 主机执行中断服务程序(ISR)以处理 M_CAN 产生的中断。
  4. 中断服务程序读取 M_CAN 的 IR 寄存器,确定哪些中断标志位已置位。
  5. (可选)主机可屏蔽掉所有不关注的中断标志位。
  6. 主机中断服务程序处理所有中断标志位并将其清除(详见第 4 章)。
  7. 中断服务程序终止。
注意事项

需精心设计中断处理策略,即如何处理单个中断以及如何清除对应标志位。以下两个与接收 FIFO0 相关的示例可说明这一点:

  1. 示例 1:先清除中断标志位 IR.RF0N,再从接收 FIFO0 中读取所有报文

    • 该方法能确保中断服务程序从接收 FIFO0 中读取所有报文。
    • 原因在于:若在读取接收 FIFO0 期间有新报文到达,中断标志位 IR.RF0N 会被再次置位,因此中断服务程序会被再次调用,主机届时将读取接收 FIFO0 中的新报文。
  2. 示例 2:先从接收 FIFO0 中读取所有报文,再清除中断标志位 IR.RF0N

    • 该方法无法确保中断服务程序从接收 FIFO0 中读取所有报文。
    • 试想以下场景:从接收 FIFO0 读取报文后、清除中断标志位 IR.RF0N 前,有新报文到达。此时由于在读取报文前已清除中断标志位 IR.RF0N,中断服务程序不会被再次调用,这意味着该报文会被 "遗忘" 在接收 FIFO0 中。
    • 被遗忘的报文会在下一次有新报文存入接收 FIFO0 且中断服务程序被调用时,才被一并读取出来。

7 Software Examples

表 1 列出了演示中断处理操作的 C 语言函数,这些函数随本应用笔记一同提供。

Table 1: C functions that demonstrate interrupt handling

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Name:m_can_interrupt_init(..) File:../m_can/m_can.c Description:该函数用于配置中断寄存器以处理中断。调用此函数时,M_CAN 应处于配置更改使能模式。 |
| Name:m_can_process_IRQ(..) File:../m_can/m_can_irq_handling.c Description:该函数用作 M_CAN 的中断服务程序(ISR)。 |
| Name:m_can_an001_high_priority_message_handling(..) File:../app_notes/app_note_001_rx_handling.c Description:该示例演示了高优先级报文的处理方式。接收节点的中断寄存器被配置为处理特定中断(如 IR.HPM 和 IR.RF0W)。 |

本应用笔记包含编译示例所需的全部 C 源文件。文件_info.txt 中提供了每个源文件的简短说明。