平台 - ARM9

我有经由I2C连接到ARM9第三方设备。我的问题是I2C读/写在一个越来越扭曲。它出现的IRQ行是断言,但是当有数据读取从未去断言。作为第三方设备发送NACK地址包读取失败。因此,任何后续的写入失败。

我想知道如果我的中断在确定处理。在这种服务的IRQ中断服务程序,我禁用中断,注销中断处理程序,然后打开信号的任务去从I2C总线读取。最后,我重新允许中断。

当信号上面贴的任务的服务,我试图从I2C总线上读取数据但这种失败。最后,我总是重新注册读过尝试后的ISR。没有中断禁用/启用处理的读出信号的过程中发生。

我的问题是我需要禁止中断的读/写I2C总线是什么时候?

选择的编程语言是C使用可否RTOS。

有帮助吗?

解决方案

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

如果要允许其他更高优先级的中断,而你所服务的I2C中断发生,然后只禁用I2C中断。这是相当不寻常的进入一个ISR时注销中断处理程序。这可能会导致意外的行为,在没有注册的处理程序,中断本身已启用,一个中断发生。因此,而不是注销处理程序,禁用简单的I2C中断(也许你已经这样做,但我认为,注册一个处理程序,并允许中断是两回事)。

解决你的问题一个好的策略是尽量不中断与设备进行通信。尝试读/从它以串行方式写的,没关系,如果一切块 - 这只是个测试。这是调试后,你成功了,你可以移动到中断的版本更容易。

其他提示

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

无论您需要启用/禁用中断你的目标平台是依赖于特定的硬件/实时操作系统实现。不幸的是,每一个ARM微控制器供应商(意法半导体,飞思卡尔,冲电气等)有能力执行不同的I2C硬件和可能在如何清除IRQ不同的要求。

我建议你找到硬件数据表的副本(和/或发布的具体硬件部分号码这里,所以我们可以帮助倒在供应商的文档,你)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top