I2C ISR和中断

时间:2009-03-13 12:15:55

标签: c embedded arm i2c

平台 - ARM9

我有第三方设备通过I2C连接到ARM9。我的问题是I2C读/写正在扭曲。看来IRQ线被断言,但是当有数据要读时,它永远不会被断言。当第三方设备NACK地址包时,读取失败。因此任何后续写入都会失败。

我想知道我的中断处理是否正常。在为IRQ提供服务的ISR中,我禁用中断,取消注册中断处理程序,然后发信号通知任务从I2C总线读取。最后,我重新启用了中断。

当任务为上面发布的信号提供服务时,我尝试从I2C总线读取数据,但这会失败。最后,我总是在读取尝试后重新注册ISR。在处理读取信号期间不会发生中断禁用/启用。

我的问题是在读取/写入I2C总线时是否需要禁用中断?

选择的编程语言是使用适当的RTOS。

3 个答案:

答案 0 :(得分:3)

重要的是您的RTOS /系统是否已准备好支持嵌套异常。除非有充分理由这样做,否则如果您避免嵌套异常并在进入ISR时禁用所有中断并在离开时重新启用,则事情会更简单。

如果要在服务I2C中断时允许发生其他更高优先级的中断,则仅禁用I2C中断。在进入ISR时取消注册中断处理程序是相当罕见的。这可能会导致意外行为,当没有注册处理程序时,中断本身被启用并发生中断。因此,不是取消注册处理程序,而是简单地禁用I2C中断(也许您已经这样做了,但正如我所看到的,注册处理程序并启用中断是两回事)。

解决问题的一个好策略是尝试与设备通信而不会中断。尝试以串行的方式从中读取/写入,如果所有内容都阻塞 - 这只是测试。这样更容易调试,成功后可以转到中断版本。

答案 1 :(得分:1)

大多数中断需要被确认或清除。您提到启用/禁用,注册/取消注册和处理中断。只需检查中断是否被确认和/或清除/重置。这通常涉及将中断号或位写回中断挂起寄存器。查看特定的ARM手册或RTOS手册。

答案 2 :(得分:0)

是否需要为目标平台启用/禁用中断取决于您的特定硬件/ RTOS实施。不幸的是,每个ARM微控制器供应商(STMicro,Freescale,Oki等)都能够以不同的方式实现其I2C硬件,并且可能对如何清除IRQ有不同的要求。

我建议您找到硬件数据表的副本(和/或在此处发布特定的硬件部件号,以便我们随时帮助您提供供应商文档)。