首页 文章

I2C ISR和中断

提问于
浏览
2

平台 - ARM9

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

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

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

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

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

3 回答

  • 0

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

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

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

  • 3

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

  • 1

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

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

相关问题