2

平台 - ARM9

我有一个通过 I2C 连接到 ARM9 的第三方设备。我的问题是 I2C 读/写发生了变化。看起来 IRQ 线已被断言,但在有数据要读取时从未被取消断言。由于第三方设备对地址包进行 NACK,读取失败。所以任何后续的写入都会失败。

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

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

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

选择的编程语言是使用专有 RTOS 的 c。

4

3 回答 3

3

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

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

解决问题的一个好策略是尝试在不中断的情况下与设备通信。尝试以串行方式读取/写入它,如果一切都阻塞并不重要 - 它只是测试。这更容易调试,成功后您可以转到中断版本。

于 2009-03-13T12:47:31.693 回答
1

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

于 2009-03-13T23:40:32.123 回答
0

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

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

于 2009-03-13T19:01:27.660 回答