USER GUIDE / PERIPHERALS / I2C / MASTER MODE OPERATION
主机模式操作
本节包括以下过程:
- “初始配置”
- “动态I2C_TAR or I2C10BITADDR_MASTER 更新”
- “主机发送或主机接收”
初始配置
使用 I2C 作为主机,请执行以下步骤:
- 通过将 0 写入 I2C_ENABLE 寄存器的 0 位来禁用 I2C,然后等待 I2C_ENBST.I2CEN = 0。
- 写入 I2C_CON 寄存器,设置支持的速度模式(2:1 位)。请注意 MATP(第 4 位)是不可写的。寻址模式由寄存器 I2C_TAR 控制。
- 设置预期 SCL 频率。I2C_CON.SPEED = 2’b01,只需要配置 I2C_SHCNT 和 I2C_SLCNT;I2C_CON.SPEED = 2’b10,只需要配置 I2C_FHCNT 和 I2C_FLCNT;I2C_CON.SPEED = 2’b11,只需要配置 I2C_HHCNT 和 I2C_HLCNT。
规定:
Tscl :I2C SCL 周期
TI2C_clk :I2C 设备时钟周期
Tmin_scl_l :协议最小 SCL 低电平时间
Tmin_scl_h:协议最小 SCL 高电平时间
然后可以得到等式:
Tscl = TI2C_clk * ((I2C*HCNT + 8) + (I2C*LCNT + 1))
并且下列条件也应该满足:
(I2C*HCNT + 8) * TI2C_clk >= Tmin_scl_h (I2C*LCNT + 1) * TI2C_clk >= Tmin_scl_l I2C*HCNT >= 6 I2C*LCNT >= 8
- 将要寻址的 I2C 设备地址写入到 I2C_TAR 寄存器。该寄存器还指示 I2C 是否要执行广播呼叫或起始字节命令。主机启动的寻址模式,无论是 7 位寻址还是 10 位寻址,都由 I2C10BITADDR_MASTER 位字段(第 12 位)控制。
- 通过将 1 写入 I2C_ENABLE 寄存器的 0 位来启用 I2C,然后等待 I2C_ENBST.I2CEN = 1。
- 现在将传输方向和要发送的数据写入 I2C_DC 寄存器(这可通过 DMA 完成),如果在启用 I2C 之前写入 I2C_DC 寄存器,则当 I2C 被禁用时,由于缓存区保持清除状态,数据和命令会丢失。
对于多个 I2C 传输,对 TX FIFO 执行额外的写入操作,以使 TX FIFO 在 I2C 传输期间不会变空。如果 TX FIFO 在任何阶段完全请空,则进一步写入 TX FIFO 会导致一个独立的 I2C 传输。
高速模式传输协议
- 会以标准/快速模式启动传输;
- 启动后,发送 8-bit 的主码地址(0000_1xxx),然后接收从机发送的 NACK;
- 重新启动传输, 以高速模式传输从设备地址和数据。
如果使用高速模式,在使能 I2C 之前,必须配置 I2C_HS_MADDR 寄存器。
动态I2C_TAR 或I2C10BITADDR_MASTER 更新
I2C 支持 I2C_TAR 寄存器的 I2C_TAR(9:0 位)和 I2C10BITADDR_MASTER(12 位)位字段的动态更新。如果满足以下条件,可以动态写入 I2C_TAR 寄存器:
- I2C 禁用(I2C_ENABLE[0]=0)
或
- I2C 启用(I2C_ENABLE[0]=1)
和
I2C 没有从事任何主机(tx,rx)操作(I2C_ST[5]=0)
和
启用 I2C 以在主机模式下运行(I2C_CON[0]=1)
和
TX FIFO 中没有数据(I2C_ST[2]=0)
主机发送和主机接收
I2C 支持动态的读写之间的来回切换,要发送数据,请将要写入的数据写入 I2C Rx/Tx 数据缓存和命令寄存器(I2C_DC)的低字节。CMD 位(I2C_DC[8])应该写入 0 以进行 I2C 写操作。
随后,可以通过将“不关心”写入 I2C_DC 寄存器的低字节来发出读取命令,且应将 1 写入 CMD 位。