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实现支持软件写
clicintippending寄存器触发中断,如果代码其他位置误写了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
相关产品推荐
相关产品推荐

