ST意法半导体
直播中

YYXIAO

8年用户 1132经验值
擅长:接口/总线/驱动
私信 关注
[问答]

ST25DV读I2C时通信错误怎么解决?

大家好

我用的是ST25DV64K。
如果I2C通信正常,接收到数据后返回ACK,接收到最后一个数据后返回NACK响应并发出Stop Condition。

如果I2C通信异常,master发出停止条件,没有给NFC标签返回NACK响应,NFC标签是否能正常接收到停止条件?

还有,在Stop Condition发出后,NFC标签能正常接受下一个Start Condition吗?

还是在 TCHCL 或 TCLCH 的最大值(25ms)过去之前,它不会接受下一个输入数据?

回帖(1)

陈珂瑾

2022-12-28 14:57:06
在正常的 I2C 读取事务中,主机通过在从从机接收到的最后一个字节的第 9 位发送 NACK 来向从机发送信号,表明它不想读取更多数据。
相反,主机通过发送 ACK 向从机发出信号,表示它想再读取一个字节。

如果从设备正在接收 ACK,则意味着它必须再传送一个字节。因此,在 ACK 条件之后,它将在下一个时钟上升沿开始呈现下一个字节。

因此,如果主机不发送 NACK,而是发送 ACK,然后发送 STOP,则可能会发生以下情况:在 ACK 之后的时钟上升沿,从机将在总线上呈现内存中的下一个字节(MSB 位)
那么,有两种可能的情况:


  • 从存储器中下一个字节的 MSB 位为 1:在 ACK 之后的时钟上升沿,从器件将保持 SDA 线“释放”以发送 1。然后主器件可以自由释放 SDA 线SCL 线变高后发送 STOP。在这种情况下,一切都运行良好。
  • 从机存储器中下一个字节的 MSB 位是 0:在 ACK 之后的时钟上升沿,从机会将 SDA 线驱动为低电平以传输 0 并在 SCL 为高电平时保持低电平。然后主机将 SDA 线释放为 1 以发出停止信号,但它不会工作,因为从机将线驱动为低电平。SDA 线将保持低电平,SCL 线将保持高电平,因为主机在停止后不再驱动它 => 系统将“挂起”,直到触发 25 毫秒超时并且从机释放 SDA 线。


因此,在读取最后一个字节之后和停止之前发送 ACK 绝对不是一个好主意,但无论如何,由于 ST25DV 的内部超时,这种情况将在 25 毫秒后恢复。
举报

更多回帖

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