面向 Zynq-7000 SoC , I2C 的设计咨询 - 从机接收器模式下的 I2C 事务处理损坏

描述
当 PS I2C 控制器为从机接收器模式而不止一个 I2C 从机连接到相同总线上时,PS I2C 控制器可接收并确认数据发送到不同的 I2C 从机,前提是传输的数据模式包含 0xF0 或 0xF1 以及跟随的 PS I2C 控制器从机地址。

就跟随的从机地址的数据字节而言,PS I2C 控制器设置 i2c.Status_reg0[RXDV] 寄存器字段为 1 并生成 ACK。

如果预期的 I2C 从机不确认数据,那么总线会损坏,因为 I2C 主机会看到错误的 ACK,而不是预期的 I2C 从机发出的 NACK。

影响:
主要影响。

解决方法

在主机软件应用中,针对其它从机的消息拆分到多个事务处理中,这样后面跟随有 Zynq 从机地址的 0xF0 或 0xF1 模式不会出现在相同的事务处理中。

在主机软件应用中,在传输数据到其它从机前写入面向 Zynq 从机的 SYNC 模式。

Zynq I2C 控制器在检测到 SYNC 字后将改变其模式为主接收器,并通过轮询 i2c.Status_reg0 [BA] 位持续监控总线活动状态。

如果 I2C 主机必须传输到 Zynq 从机,那么会在一定时间内让总线闲置,而 Zynq I2C 控制器软件会保持等待直到超时,从而在改变到从机接收器模式前检查总线是否闲置。
I2C 主机持续传输数据到 Zynq 从机。

当 I2C 主机和从机都在 Zynq 中实现且只有一个 I2C 主机连接到相同总线时,主机软件可让 Zynq 从机休眠,方法是在传输数据到另一个从机时将 Zynq 从机保持为复位状态(写入 slcr.I2C_RST_CTRL[I2Cx_CPU1X_RST]=1)。

通过采用软件级的握手机制,Zynq 从机控制器在主机控制器传输数据到 Zynq 从机之前可以脱离复位状态。

用 I2C 多路复用器芯片可将 Zynq 从机与总线上的其它从机隔离。
非 Zynq 从机可连接到单个 I2C 总线,而多路复用器可一次启用 I2C 主机和 Zynq 从机之间,或 I2C 主机和总线上其它从机之间的一个连接。
I2C 主机软件首先选择它要发送给数据的从机,方法是写入 I2C 多路复用器芯片,随后传输实际数据。

在 PL 中(而不是 PS I2C 控制器)采用软 IP。

受影响的器件修订版本:
参考 (Xilinx Answer 47916) - Zynq-7000 SoC 芯片修订版差异

受影响的
配置:
所有在多个从机拓扑中采用 PS I2C 控制器的 Zynq 器件。

分辨率:
这是一个第三方错误,该问题不会修复。