You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RISC-V CLIC平台下I2C驱动EOT中断重复触发问题咨询

单次硬件EOT中断触发两次处理函数的常见诱因

1. 中断标志位清理时序错误

  • 最常见的问题是中断标志清除的位置不对:如果在中断处理函数末尾才清EOT标志,处理函数执行过程中如果CLIC已经把该中断的pending状态同步完成,会出现第一次中断处理还没清标志的时候,CLIC已经采样到未清除的标志位,重新触发一次中断。
  • 正确的操作应该是在进入EOT中断处理函数的第一时间就写寄存器清除EOT中断标志,再处理后续业务逻辑。注意检查你的清标志操作是否符合硬件要求:部分I2C外设需要写1清零、或者需要读特定I2C_STATUS状态寄存器才能自动清标志,如果你用了错误的操作(比如写0),标志位会一直处于置起状态。

2. CLIC中断控制器配置问题

  • 检查CLIC的触发模式配置:如果EOT中断被错误配置为电平触发而不是边沿触发,当EOT中断信号的电平持续时间超过第一次中断处理的总时长,第一次处理完开中断后会再次触发电平中断。你观测到的单次脉冲如果电平持续时间过长,就会出现这个问题。
  • 检查CLIC的pending位是否被软件意外置起:部分CLIC实现支持软件写clicintip pending寄存器触发中断,如果代码其他位置误写了EOT中断对应的pending位,也会额外触发一次中断。
  • 确认CLIC的中断向量表配置是否正确:有没有出现EOT中断和其他中断的向量地址重合、或者中断号映射错误的情况,其他中断触发后误跳转到EOT处理函数的情况。

3. I2C外设硬件行为问题

  • 部分I2C外设的EOT中断标志存在置起条件叠加的情况:比如你发送命令触发的EOT是发送端结束标志,同时如果从端返回的ACK触发了另一个同名的EOT标志?检查你读中断状态寄存器的逻辑,是不是没有区分不同触发源的EOT标志,把两个不同触发源的中断当成了同一个EOT中断处理。
  • 如果你在中断处理函数里又发送了新的I2C命令,会再次触发EOT中断,这种情况要检查处理函数里的操作逻辑有没有意外启动新的传输。

4. 临界区保护问题

  • 如果你在关中断的临界区操作了I2C的控制寄存器或者中断标志寄存器,临界区持续过程中EOT中断触发并被pending,退出临界区的时候如果没有正确清理pending位,或者同时有其他操作触发了第二次pending,也会出现两次进入的情况。

内容的提问来源于stack exchange,提问作者Dooraim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:02