ST意法半导体
直播中

高桂清

7年用户 1000经验值
私信 关注
[问答]

如何从STM32WB55上I2C事务的NACK中恢复?

我的 STM32WB55 配置为 I2C 主机并连接到 I2C 从机。
我的 I2C 块配置如下:
I2C->CR1 = 0x01
I2C->CR2 = 0x000A0060(从机地址=0x60 和 NBYTES=0x0A)
要启动 I2C 事务,I2C->CR2.START 设置为 1。
I2C 通信开始,但在某个时候从机发送 NACK,这是预期的。

然后,我的 I2C 块卡住了,我确认 I2C_ICR_NACKCF 标志,然后发送另一个 START 命令。I2C 块在总线上发送 START 命令但永远不会上升 `I2C->ISR.TXIS` 标志,它永远不会在总线上发送更多字节。
在 START 之后立即发送意外的 STOP。
在这里我可以看到一个 START 命令被发送到总线上并被从设备确认:
如何从 NACK 中恢复?
Datasheet 显示了一个图表,如果收到 NACK,状态为“结束”,但这是什么意思?
stm32wb55rg_reference_manual.pdf,第 32.4.9 节 I2C 主模式

我现在唯一的解决方法是重置 I2C 块。我附上了用 Saleae 设备拍摄的照片。
尽管存在这个 NACK 问题,但它运行良好。






回帖(1)

陈军

2022-12-5 14:38:21
根据参考手册RM0434,当收到 NACK 时,会在收到 NACK 后自动发送 STOP 条件,请参见以下摘录:
如果收到 NACK:TXIS 标志未设置,并且在收到 NACK 后自动发送 STOP 条件。I2C_ISR 寄存器中设置了 NACKF 标志,如果设置了 NACKIE 位,则会产生中断。
STOP 后,通常不需要重新启动 I2C,只需再发送一帧即可。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分