[TMS320F28003x用户手册][CAN协议][中断功能]

目录

1.中断概述

2. 中断源识别

3. 消息对象中断

4. 状态变化中断

5. 错误中断 

6. 中断拓扑结构

7. 中断处理流程

8.  中断配置的示例


本人萌新小白,请各位大佬多多指教。

代码未经实践,且主包经验不足,代码请忽略。

手册链接:https://www.ti.com.cn/cn/lit/pdf/spruiw9 本章对应手册的28.5 Interrupt Functionality

1.中断概述

        CAN 模块提供了两种中断线(CAN0INT 和 CAN1INT),这些中断线可以通过设置 CAN 控制寄存器(CAN_CTL)中的 IE0 和 IE1 位来启用。中断可以由以下三组中断源触发:
        a. 消息对象中断:由消息对象的事件触发
        b. 状态变化中断:由 CAN 模块的状态变化触发
        c. 错误中断:由 CAN 总线错误事件触发

2. 中断源识别

        中断寄存器(CAN_INT)中的 Int0ID 和 Int1ID 字段用于指示中断源。每个中断线保持活跃状态,直到相应的中断原因被清除或中断使能位(IE0 和 IE1)被重置。
        中断寄存器(CAN_INT)
                Int0ID:指示 CAN0INT 中断线的中断源。
                Int1ID:指示 CAN1INT 中断线的中断源。     
        中断优先级
                
状态变化中断具有最高优先级。
                消息对象中断的优先级根据消息对象编号递减,消息对象 1 优先级最高。

3. 消息对象中断

        消息对象中断由消息对象的事件触发。每个消息对象可以配置为在发送或接收成功时触发中断。
        触发条件
                发送成功:
如果设置了 TxIE 位,消息对象的 IntPnd 位在成功发送后被设置。
                接收成功:如果设置了 RxIE 位,消息对象的 IntPnd 位在成功接收后被设置。
        中断处理
                
中断服务程序可以通过读取消息对象的 IntPnd 位来确定中断源
                清除 IntPnd 位可以同时读取消息对象的数据,并重置中断请求。

4. 状态变化中断

        状态变化中断由 CAN 模块的状态变化触发。例如,成功接收或发送消息后,状态变化中断可以通知 CPU。
        触发条件:
                接收成功(RxOk):
成功接收消息后,RxOk 位被设置。
                发送成功(TxOk):成功发送消息后,TxOk 位被设置。
                最后错误代码(LEC):指示最后的错误类型。
        中断处理:
                
通过设置 CAN 控制寄存器中的 SIE 位来启用状态变化中断。

5. 错误中断 

        错误中断由 CAN 总线错误事件触发。例如,总线关闭、错误计数器溢出或警告条件。
        触发条件:
                总线关闭(BOff):
CAN 模块进入总线关闭状态。
                错误警告(EWarn):错误计数器达到警告阈值。
                奇偶错误(PER):消息 RAM 数据出现奇偶错误。
        中断处理:
                
通过设置 CAN 控制寄存器中的 EIE 位来启用错误中断。

6. 中断拓扑结构

         CAN 模块支持灵活的中断拓扑结构,允许将不同类型的中断路由到不同的中断线:
                消息对象中断:可以路由到 CAN0INT 或 CAN1INT。
                状态变化中断和错误中断:只能路由到 CAN0INT。
### 图片取自于用户手册

7. 中断处理流程

         i 中断触发:
                当某个中断源的条件满足时,相应的中断线(CAN0INT 或 CAN1INT)被激活。
        ii 中断识别:
                CPU 读取中断寄存器(CAN_INT)中的 Int0ID 或 Int1ID 字段,确定中断源。
        iii 中断服务:
                根据中断源类型,执行相应的中断服务程序。
        iv 中断清除:
                清除中断原因(例如,清除消息对象的 IntPnd 位或读取错误状态寄存器)。
                如果需要,重置中断使能位(IE0 或 IE1)。

8.  中断配置的示例

        i 启用中断线 

CAN_CTL.BIT.IE0 = 1;  // 启用 CAN0INT 中断线
CAN_CTL.BIT.IE1 = 1;  // 启用 CAN1INT 中断线

        ii 配置消息对象中断 

// 配置消息对象 1 为接收中断
CAN_IF1MCTL.BIT.RxIE = 1;
CAN_IF1MCTL.BIT.IntPnd = 1;

// 将消息对象 1 的中断路由到 CAN0INT
CAN_IP_MUX21.BIT.IntMux[0] = 0;

         iii 中断服务程序 

void CAN0_ISR(void) {
    uint16_t intId = CAN_INT.BIT.Int0ID;

    if (intId >= 1 && intId <= 32) {
        // 处理消息对象中断
        CAN_MessageObject *obj = &CAN_MessageObjects[intId - 1];
        if (obj->IntPnd) {
            // 读取消息对象数据
            CAN_ReadMessage(intId);
            // 清除中断
            obj->IntPnd = 0;
        }
    } else if (intId == 0x8000) {
        // 处理状态变化中断
        CAN_ES.BIT.RxOk = 0;  // 清除 RxOk 状态
        CAN_ES.BIT.TxOk = 0;  // 清除 TxOk 状态
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值