S6E1C3 i2c 读取时挂起/争用条件

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

我在 S6E1C3 上使用示例代码 " i2c_master_poll " ing,我还连接了一个 I2C 分析器来帮助弄清楚发生了什么。 到目前为止,我已经成功执行了完整的写入序列。 但是,当我进入读取功能时,它在等待 INT 位设置时会挂起。 I2C 分析器显示至少 i2c_addr+RD 已成功发送

我添加了一些调试打印语句来帮助确定它走了多远,我注意到发送调试打印语句所花费的额外时间会改变结果:我现在 CAN 读取第一个字节(尽管它再次挂在第二个字节上)。

关于这种竞争条件的原因是什么以及为什么这个示例代码悬而未决有什么想法吗? 目前还不清楚告诉 I2C 主机读取另一个字节的机制是什么(这只是清除 INT 位吗?)

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

我对实际的I2C问题没有太大贡献 CAN,我对S6E MCU没有任何了解。

但是,众所周知,debug printf () 调用会导致运行时问题,这通常会使应用程序的计时完全混乱。 数据必须稍微泄露出来,通常是通过SemiHosting/SWD进行的。 如果您的中断没有更高的优先级,则在这种情况下 printf 不可用。
其次,调试器 总是非侵入性的。它们 CAN 更改代码流,尤其是在涉及中断时。
最明显的情况是读取时会自动清除中断标志。 在这种情况下,无论你的代码是否读取它,还是你正在运行的调试器,都没有关系。

我能提出什么建议 —— 也许可以调查你的调试器使用的半托管代码,尽量将 I2C 中断优先级提高到该优先级以上,以免干扰。 并使消息尽可能简短。
我经常在免费 GPIO 上使用短脉冲进行运行时/实时调试。 尽管你需要一个范围。
但是你甚至可以 CAN 输出脓疱序列来发出多个状态的信号,而不会对时序进行太多更改。
另一种选择是将调试状态/事件存储在私有变量中,然后在以后输出。

尽管使用这两种方法,但您可能需要逐渐接近实际原因,并完善您的检测代码。

在原帖中查看解决方案

0 点赞
1 回复
Translation_Bot
Community Manager
Community Manager
Community Manager

我对实际的I2C问题没有太大贡献 CAN,我对S6E MCU没有任何了解。

但是,众所周知,debug printf () 调用会导致运行时问题,这通常会使应用程序的计时完全混乱。 数据必须稍微泄露出来,通常是通过SemiHosting/SWD进行的。 如果您的中断没有更高的优先级,则在这种情况下 printf 不可用。
其次,调试器 总是非侵入性的。它们 CAN 更改代码流,尤其是在涉及中断时。
最明显的情况是读取时会自动清除中断标志。 在这种情况下,无论你的代码是否读取它,还是你正在运行的调试器,都没有关系。

我能提出什么建议 —— 也许可以调查你的调试器使用的半托管代码,尽量将 I2C 中断优先级提高到该优先级以上,以免干扰。 并使消息尽可能简短。
我经常在免费 GPIO 上使用短脉冲进行运行时/实时调试。 尽管你需要一个范围。
但是你甚至可以 CAN 输出脓疱序列来发出多个状态的信号,而不会对时序进行太多更改。
另一种选择是将调试状态/事件存储在私有变量中,然后在以后输出。

尽管使用这两种方法,但您可能需要逐渐接近实际原因,并完善您的检测代码。

0 点赞