c - I2C ISR 和中断

标签 c embedded arm i2c

平台 - 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/

相关文章:

c++ - unsigned long long 的确切大小应该是多少

c - mknod 是便携的吗?如果没有,还有什么选择?

c - 如何使用 C 在嵌入式系统中发出蜂鸣声?

linux - 如何使用 LTIB 交叉编译 C++ 文件

linux - mprotect 是否刷新 ARM Linux 上的指令缓存?

c - CMake编译的源代码中省略头文件的声明

c - 在gtk中添加垂直滚动条并捕获其事件

c - switch 还是 const table 更好? (嵌入式软件)

c - 从 RAM 而不是闪存运行代码块

c++ - GNU ARM C++ 中未定义 __fp16 类型