Xilinx I2C协议重点知识介绍

焓居新闻 2026-11-10 chq123 2030

一、协议重点

1、 数据在scl信号高电平时有效,也就是允许sda信号电平翻转的时刻只能是scl信号处于低电平时。

这条跟我们通常理解的数据通过时钟沿进行锁存的机制是不同的,需要注意。

数据的建立时间定义为SDA数据沿(从0到1)与SCL上升沿之间的时间差,保持时间定义为SDA失效沿(1到0)与SCL下降沿之间的时间差。另外,数据的开始和停止也有单独的建立保持时间要求。

Xilinx的IIC IP提供零保持时间,与我们对时序的通常理解不同(建立和保持时间都需要为正才能进行正确的数据采样),可能对于有的接收芯片来说,它采样数据不必等SCL下降沿之后,故保持时间有时可能不太重要。

涉及到协议的截图都来自《THE I2C-BUS SPECIFICATION》。

8b4e19ca-d821-11f1-8a4b-92fbcf53809c.png

2、 start stop

8bfde404-d821-11f1-8a4b-92fbcf53809c.png

3、I2C 传输数据格式

标准I2C帧结构包含8个数据bit加1个ack bit共9个bit,传输时从MSB开始。

Slave地址是7bit,传输时slaveaddr + R/W 标志位(读是1,写是0)

8cafc7c8-d821-11f1-8a4b-92fbcf53809c.png

8d102370-d821-11f1-8a4b-92fbcf53809c.png

二、 XILINX IIC控制器 输出

8d6d68dc-d821-11f1-8a4b-92fbcf53809c.png

8dc6c710-d821-11f1-8a4b-92fbcf53809c.png

Xilinx IIC IP接口提供如下一些接口,由于实际的SDA和SCL都是双向接口,输出时需要加上iobuf。iobuf是一个三态输出buffer和一个输入buffer组合而成的双向IO口,在T口为高电平时,它是一个输入buffer,即将IO口的电平状态传递到O口,再接到IP的scl_i接口上;当T口为低电平时,它是一个输出buffer,即将I口(来自scl_o)的电平传递到IO口上。

8e2267aa-d821-11f1-8a4b-92fbcf53809c.png

8e833896-d821-11f1-8a4b-92fbcf53809c.png

当FPGA做为master时,由FPGA发出时钟, Xilinx 的IIC IP核 通过控制scl_t来实现时钟的高低。当scl_t为高时,iobuffer是三态输入,scl(输出到FPGA引脚外)也为高(由FPGA外部的上拉电阻拉到电源),当scl_t为低时,iobuffer为三态输出,scl_0=>scl(scl_0始终为0电平)。当master需要控制sda信号线时,也是同样的操作。

这是实际抓取的iic ip的接口信号波形。在T触发时刻,已经完成了“start”操作,即sda信号线在scl为高时拉低。从下图标注的第1个scl_t高电平开始传输信号——7bit slaver地址+1bit R/W标志 。然后sda_t信号拉高,表示iobuffer 目前是个输入buffer,信号线电平由slave 控制。scl_t也拉高,scl_i是低电平,说明slave 已控制总线,当IP检测到sda信号被拉低后,发出第9个scl_t高电平,正式读取来自slave的低电平ack。至此,一次传输完成。

8edfa9b4-d821-11f1-8a4b-92fbcf53809c.png

无论scl_t处于高电平还是低电平,scl_i信号线的状态都能反映此刻真实的scl信号线上的电平状态。所以,一次传输,scl信号线上共有9次高脉冲。scl_t 上有10次,第9次前面的那一次是将总线控制权交给slave。