平台- ARM9
我有一个通过I2C连接到ARM9的第三方设备。我的问题是I2C的读/写出现了问题。当存在要读取的数据时,IRQ行似乎被断言,但从未被取消断言。当第三方设备对地址分组进行NACKs时,读取失败。因此任何后续写入都会失败。
我想知道我的中断处理是否正常。在为IRQ提供服务的ISR中,我禁用中断,注销中断处理程序,然后向任务发出信号以从I2C总线读取。最后,我重新启用中断。
当任务服务于上面发布的信号时,我尝试从I2C总线读取数据,但失败了。最后,我总是在任何读取尝试之后重新注册ISR。在处理读取信号期间不会发生中断禁用/启用。
我的问题是,在读/写I2C总线时,是否需要禁用中断?
选择的编程语言是使用适当的RTOS的c。
发布于 2009-03-13 12:47:32
重要的是你的RTOS/系统是否准备好支持嵌套异常。除非有充分的理由这样做,否则如果您避免嵌套异常,并在进入ISR时禁用所有中断并在离开时重新启用,则事情会更简单。
如果您希望在为I2C中断提供服务时允许发生其他更高优先级的中断,则仅禁用I2C中断。在进入ISR时注销中断处理程序是相当不寻常的。这可能会导致意外的行为,当没有注册的处理程序时,中断本身被启用并发生中断。因此,不是取消注册处理程序,而是简单地禁用I2C中断(可能您已经在这样做了,但在我看来,注册处理程序和启用中断是两件不同的事情)。
解决问题的一个好策略是尝试不中断地与设备通信。尝试以串行方式对其进行读/写,如果所有内容都阻塞,这并不重要--它只是测试而已。这更容易调试,并且在成功之后,您可以转移到中断版本。
发布于 2009-03-13 23:40:32
大多数中断需要确认或清除。您提到了启用/禁用、注册/注销和处理中断。只需检查中断是否得到确认和/或清除/复位。这通常涉及将中断号或位写回中断挂起寄存器。检查特定的ARM手册或RTOS手册。
发布于 2009-03-13 19:01:28
您是否需要为目标平台启用/禁用中断取决于您特定的硬件/RTOS实现。不幸的是,每个ARM微控制器供应商(STMicro、飞思卡尔、Oki等)都有能力实现不同的I2C硬件,并且在如何清除IRQ方面可能有不同的要求。
我建议您找到一份硬件数据表的副本(和/或在此处张贴特定的硬件部件号,以便我们可以帮助您倾诉供应商文档)。
https://stackoverflow.com/questions/642400
复制相似问题