根据 ug1182,zcu102 板卡上 PS 连接 2 个 I2C 接口,分别是 I2C0(MIO 14-15) 和 I2C1(MIO 16-17)。
本试验使用 I2C1 通过 zcu102 板卡的 FMC HPC1 接口连接外设,PS 作为 I2C Master,外设作为 I2C Slave。
I2C 接口说明
由于 PS 程序通过 API 封装函数使用 I2C 接口,因此本文不再详述 I2C 接口时序,仅描述 I2C 通信原理。
I2C 由 SCL 和 SDA 2 条双向接口连接 Master 和 Slave,一般情况下是 1 个 Master 连接多个 Slave,以字节(8 bit)为单位传输数据。
每个 Slave 通过自身配置 (内部寄存器或者外部管脚连接)的 Slave Address(或称片选地址),供 Master 在多个 Slave 中选择 1 个通信对象。
片选地址一般情况下为 7 bit,在其最低位补上 1 bit 的读写标记位,就构成1次读或写传输中 I2C Master 向 Slave 发送的首个字节,在 Master 收到对应片选地址 Slave 的正常响应后,Master 或者 Slave 向对方发送数据。由于 Master 主控传输流程,具体传输数据内容的解析根据 Slave 的内部逻辑决定。
需要特别注意:片选地址在 Xilinx 的相关文档及 PS API 函数中都被定义为前述的 7 bit 数值,而在许多外设的手册中 I2C 片选地址被描述为最低位补 1 bit 0 值的8 bit 字节。例如外设手册中的片选地址 0x20,在 PS API 函数中应当使用 0x20>>1 作为片选地址。
I2C 写流程
字节数据的解析根据 Slave 的内部逻辑决定,一般情况是前几个字节是写入数据的寄存器地址,后几个字节是写入对应寄存器的数据;对于只有单个寄存器的 Slave 外设或者处理流数据的外设,发送的字节数据中没有地址。具体应当参考外设手册。
- Master 发送写标记的片选字节,并得到 Slave 的响应。
- Master 向 Slave 发送若干字节数据。
注意:放多外设手册甚至 Xilinx 文档都容易混淆片选地址和寄存器地址,区分的方法是在描述 I2C 接口时使用的 Address 一般是指片选地址,寄存器地址完全是 Slave 的内部逻辑功能与 Master 无关。
I2C 读流程
读流程由 Slave 内部逻辑决定,以下流程仅针对一般情况下的寄存器数据读取。
- Master 发送写标记的片选字节,并得到 Slave 的响应。
- Master 向 Slave 发送读寄存器地址的字节数据。
- Master 发送读标记的片选字节,并得到 Slave 的响应。
- Master 等待接收 Slave 返回的对应寄存器地址读出的字节数据。
zcu102 I2C1 的路由控制
根据 ug1182 的说明,PS 的 I2C1 接口通过 I2C 路由芯片 TCA9548A 实现单个 Master 接口对多个 Slave 的路由。
路由配置及外设地址如下表所示:
上表中的 Addr 和 Address 全部指片选地址。至于 FMC HPC_0 和 FMC HPC_1 的 0x## 地址,表示片先地址由连接该 FMC 接口的 Slave 外设自身配置决定。
参考路由芯片 TCA9548A 的手册说明,该芯片仅有单个 8 bit 寄存器,由低位至高位的数值 1 分别表示 Table 3-24 中对应 Slave 的连通,比如连接 FMC HPC_1,可以使用下图所示的配置: