平台 - ARM9
我有一个通过 I2C 连接到 ARM9 的第三方设备。我的问题是 I2C 读/写出现问题。看起来 IRQ 线已断言,但当有数据要读取时从未断言。由于第三方设备 NACK 地址数据包,读取失败。因此任何后续写入都会失败。
我想知道我的中断处理是否正常。在为 IRQ 提供服务的 ISR 中,我禁用中断,取消注册中断处理程序,然后向任务发出信号以从 I2C 总线进行读取。最后,我重新启用中断。
当任务服务上面发布的信号时,我尝试从 I2C 总线读取数据,但失败。最后,我总是在尝试读取后重新注册 ISR。在处理读取信号期间不会发生中断禁用/启用。
我的问题是读/写 I2C 总线时是否需要禁用中断?
选择的编程语言是使用专有 RTOS 的 c。
最佳答案
重要的是您的 RTOS/系统是否准备好支持嵌套异常。除非有充分的理由这样做,否则如果您避免嵌套异常并在进入 ISR 时禁用所有中断并在离开时重新启用,事情会更简单。
如果您希望在提供 I2C 中断服务时允许其他优先级较高的中断发生,则仅禁用 I2C 中断。进入 ISR 时注销中断处理程序的情况相当罕见。当没有注册的处理程序时,这可能会导致意外的行为,中断本身被启用并发生中断。因此,不要取消注册处理程序,而是简单地禁用 I2C 中断(也许您已经这样做了,但在我看来,注册处理程序和启用中断是两件不同的事情)。
解决问题的一个好策略是尝试与设备进行不间断的通信。尝试以串行方式读取/写入它,如果一切都阻塞并不重要 - 这只是测试。这更容易调试,成功后您可以转到中断版本。
关于c - I2C ISR 和中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642400/