支持 I2C 通信
I2C,亦称集成电路,是一种用于集成电路和低速外围设备通信的同步片间互联协议。一些常见的基于 I2C 的设备包括 EEPROM、热传感器和实时时钟。I2C Controller Write 模块和 I2C Controller Read 模块支持与 I2C 设备通信。
设备上的 I2C 总线有一个 I2C 控制器,它连接到两条双向信号线:串行数据线 (SDA) 和串行时钟线 (SCL)。这两条线连接到所连 I2C 外围设备上的一对引脚。I2C 外围设备具有唯一 7 位或 10 位地址,由制造商提供。如果地址不唯一,请参考设备数据手册以重新配置地址。
控制器节点生成一个时钟信号并启动与外围设备的通信。外设节点接收时钟,并向 I2C 控制器确认以作为响应。
I2C 使用以下通信模式:
控制器发送:I2C 控制器将数据写入 I2C 外围设备
控制器接收:I2C 控制器从 I2C 外围设备读取数据
外设发送:I2C 外设将数据写入 I2C 控制器
外设接收:I2C 外设从 I2C 控制器读取数据
开始和停止条件
I2C 消息由起始位、要传输的数据和停止位组成。
当 SCL 仍处于高电平时,SDA 从高电平变为低电平表示开始条件。当 SCL 保持在高电平时,SDA 从低电平变为高电平表示停止条件。所有其他 SDA 转换都在 SCL 处于低电平时发生。
数据应答
I2C 通信将数据字节定义为 8 位长度。I2C 可以传输单字节或多字节的数据。在数据传输期间,每个字节后都有一个应答 ACK 信号。ACK 的时钟由控制器生成,而接收端(控制器或外设)通过在应答时钟脉冲处于高电平时拉低 SDA 并使其保持低电平来生成 ACK。
如果 SDA 在应答期间未被拉低,则表明接收端处于 NACK 状态(未应答)。如果外设未准备好传输或接收下一个数据字节,它会保持 SCL 处于低电平状态,从而使控制器进入等待状态。一旦外设准备就绪并释放 SCL,就会恢复正常的数据传输。
I2C 读/写
I2C 读/写入操作如下进行:
I2C 控制器通过发送开始条件,后跟 7 位外设地址和指示写 (0)/读 (1) 的第 8 位来启动通信。
控制器释放 SDA 并等待来自外围设备的 ACK。
如果外设在总线上,它会回复一个 ACK 作为应答。
控制器继续处于发送或接收模式(根据其发送的读取或写入位),外设继续处于对应模式(分别为接收或发送)。
控制器通过发送停止条件来终止数据传输。
下图显示了 I2C 外围设备上的单字节读写。
I2C 寄存器读/写
I2C 寄存器的读/写入操作如下:
I2C 控制器通过发送开始条件,后跟 7 位外设地址和指示写 (0)/读 (1) 的第 8 位来启动通信。
控制器释放 SDA 并等待来自外围设备的 ACK。
如果外设在总线上,它会回复一个 ACK 作为应答。
然后,控制器写入它要访问的外设的寄存器地址。
一旦外设确认寄存器地址后,控制器就开始发送数据字节,并在每个写/读字节得到 ACK 应答后继续传输。
控制器通过发送停止条件来终止数据传输。
下图显示了对 I2C 外围设备中存在的寄存器的单字节读写过程。