I2C总线原理
♦什么是
I2C
总线?
I2C 即 Inter IC ,由 Philips 公司开发,是当今电子设计中应用非常广泛的串行总线之一,主要用于电压、温度监控, EEPROM 数据的读写,光模块的管理等。
I2C 总线只有两根线, SCL 和 SDA , SCL 即 Serial Clock ,串行参考时钟, SDA 即 Serial Data ,串行数据。
♦I2C 总线的速率能达到多少?
标准模式下: 100Kbps
快速模式下: 400Kbps
高速模式下: 3.4Mbps
I2C总线结构如下图所示:
<SPAN lang=EN-US style="FONT-SIZE: 12pt"><FONT face="Times New Roman"> 如上图所示,I2C 是OC 或OD 输出结构,使用时必须在芯片外部进行上拉,上拉电阻R 的取值根据I2C 总线上所挂器件数量及I2C 总线的速率有关,一般是标准模式下R 选择10kohm ,快速模式下R 选取1kohm ,I2C 总线上挂的I2C 器件越多,就要求I2C 的驱动能力越强,R 的取值就要越小,实际设计中,一般是先选取4.7kohm 上拉电阻,然后在调试的时候根据实测的I2C 波形再调整R 的值。
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
♦I2C 总线上最多能挂多少个 I2C 器件?
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> I2C 总线上允许挂接 I2C 器件的数量由两个条件决定:
1).I2C 从设备的地址位数。 I2C 标准中有 7 位地址和 10 位地址两种。如果是 7 位地址,允许挂接的 I2C 器件数量为: 27 = 128 ,如果是 10 位地址,允许挂接的 I2C 器件数量为: 210 = 1024 ,一般 I2C 总线上挂接的 I2C 器件不会太多,所以现在几乎所有的 I2C 器件都使用 7 位地址。
2). 挂在 I2C 总线上所有 I2C 器件的管脚寄生电容之和。 I2C 总线规范要求, I2C 总线容性负载最大不能超过 470pF 。
♦I2C总线是如何工作的?
1).I2C 总线传输的特点。
I2C 总线按字节传输,即每次传输 8bits 二进制数据,传输完毕后等待接收端的应答信号 ACK ,收到应答信号后再传输下一字节。等不到 ACK 信号后,传输终止。空闲情况下, SCL 和 SDA 都处于高电平状态。
2).如何判断一次传输的开始?
如上图所示,I2C总线传输开始的标志是:SCL信号处于高电平期间,SDA信号出现一个由高电平向低电平的跳变。
3).如何判断一次传输的结束?
如上图所示,I2C总线传输结束的标志是:SCL信号处于高电平期间,SDA信号出现一个由低电平向高电平的跳变。跟开始标识正好相反。
4).什么样的I2C数据才是有效的。
在 SCL 处于高电平期间, SDA 保持状态稳定的数据才是有效数据,只有在 SCL 处于低电平状态时, SDA 才允许状态切换。前面已经讲过了, SCL 高电平期间, SDA 状态发生改变,是传输开始 /. 结束的标志。
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> ♦I2C 总线的主要时序参数有哪些?
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> I2C 总线的主要时序参数有:开始建立时间 t SU:STA ,开始保持时间 t HD:STA ,数据建立时间 t SU:DAT ,数据保持时间 t SU:DAT ,结束建立时间 t SU:STO 。如下图所示:
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> 开始建立时间: SCL 上升至幅度的 90% 与 SDA 下降至幅度的 90% 之间的时间间隔;
开始保持时间: SDA 下降至幅度的 10% 与 SCL 下降至幅度的 10% 之间的时间间隔;
数据建立时间: SDA 上升至幅度的 90% 或 SDA 下降至幅度的 10% 与 SCL 上升至幅度的 10% 之间的时间间隔;
数据保持时间: SCL 下降至幅度的 10% 与 SDA 上升至幅度的 10% 或 SDA 下降至幅度的 90% 之间的时间间隔;
结束建立时间: SCL 上升至幅度的 90% 与 SDA 上升至幅度的 90% 之间的时间间隔;
I2C总线的时序参数要求:
♦I2C总线如何进行读写操作?
如上图所示, I2C 开始传输时,第一个字节的前 7bit 是地址信息 (7 位地址器件 ) ,第 8bit 是操作标识,为“ 0 ”时表示写操作,为“ 1 ”时表示读操作,第 9 个时钟周期是应答信号 ACK ,低有效,高电平表示无应答,传输终止。在上图中还可以看出,正常情况下,写操作是 I2C 主设备方发起终止操作的,而读操作时, I2C 主控制器在接收完最后一个数据后,不对从设备进行应答,传输终止。
♦I2C总线案例分析
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'"> 问题描述:
在测试某 I2C 总线时,发现 SDA 数据线上有毛刺,而且出现的位置很有规律,一般在第 9 , 18 , 27----- 时钟周期的后面。如下图所示。
问题分析:
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
如上图所示, t1 是 I2C 总线上的 Slave 设备应答信号 ACK( 第 9 个时钟周期输出 ) 相对与参考时钟 SCL 下降沿的滞后时间。数据方向是 Slave--> Master 。 t 2 是 I2C 总线上的 Master 设备在第 10 个时钟输出相对了参考时钟 SCL 的滞后时间。数据方向是 Master--> Slave 。 ∆t 是 Master 设备与 Slave 设备输出数据延迟的时间差。
Master 设备发出最后一个 bit 数据后,总线的使用权交给 Slave 设备使用,由 Slave 设备发出应答信号 ACK ,该信号在 SCL 下降沿经 t1 延迟后发出,在 SCL 的下一个时钟沿后内经 t1 后结束。而 Master 设备在同一个时钟沿,经常 t2 延迟后发出第 9bit 数据,这样在 ∆t (t2-t1) 时间内, Master 和 Slave 设备都没有使用总线,由于 SDA 是 OC/OD 输出,芯片外面通过电阻 R 上拉到 VCC ,将 SDA 电平拉升,但是由于 ∆t 很短, VCC 还没来的及将 SDA 拉到稳定的高电平, Master 就开始发出数据“
I2C 即 Inter IC ,由 Philips 公司开发,是当今电子设计中应用非常广泛的串行总线之一,主要用于电压、温度监控, EEPROM 数据的读写,光模块的管理等。
I2C 总线只有两根线, SCL 和 SDA , SCL 即 Serial Clock ,串行参考时钟, SDA 即 Serial Data ,串行数据。
♦I2C 总线的速率能达到多少?
标准模式下: 100Kbps
快速模式下: 400Kbps
高速模式下: 3.4Mbps
I2C总线结构如下图所示:
<SPAN lang=EN-US style="FONT-SIZE: 12pt"><FONT face="Times New Roman"> 如上图所示,I2C 是OC 或OD 输出结构,使用时必须在芯片外部进行上拉,上拉电阻R 的取值根据I2C 总线上所挂器件数量及I2C 总线的速率有关,一般是标准模式下R 选择10kohm ,快速模式下R 选取1kohm ,I2C 总线上挂的I2C 器件越多,就要求I2C 的驱动能力越强,R 的取值就要越小,实际设计中,一般是先选取4.7kohm 上拉电阻,然后在调试的时候根据实测的I2C 波形再调整R 的值。
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
♦I2C 总线上最多能挂多少个 I2C 器件?
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> I2C 总线上允许挂接 I2C 器件的数量由两个条件决定:
1).I2C 从设备的地址位数。 I2C 标准中有 7 位地址和 10 位地址两种。如果是 7 位地址,允许挂接的 I2C 器件数量为: 27 = 128 ,如果是 10 位地址,允许挂接的 I2C 器件数量为: 210 = 1024 ,一般 I2C 总线上挂接的 I2C 器件不会太多,所以现在几乎所有的 I2C 器件都使用 7 位地址。
2). 挂在 I2C 总线上所有 I2C 器件的管脚寄生电容之和。 I2C 总线规范要求, I2C 总线容性负载最大不能超过 470pF 。
♦I2C总线是如何工作的?
1).I2C 总线传输的特点。
I2C 总线按字节传输,即每次传输 8bits 二进制数据,传输完毕后等待接收端的应答信号 ACK ,收到应答信号后再传输下一字节。等不到 ACK 信号后,传输终止。空闲情况下, SCL 和 SDA 都处于高电平状态。
2).如何判断一次传输的开始?
如上图所示,I2C总线传输开始的标志是:SCL信号处于高电平期间,SDA信号出现一个由高电平向低电平的跳变。
3).如何判断一次传输的结束?
如上图所示,I2C总线传输结束的标志是:SCL信号处于高电平期间,SDA信号出现一个由低电平向高电平的跳变。跟开始标识正好相反。
4).什么样的I2C数据才是有效的。
在 SCL 处于高电平期间, SDA 保持状态稳定的数据才是有效数据,只有在 SCL 处于低电平状态时, SDA 才允许状态切换。前面已经讲过了, SCL 高电平期间, SDA 状态发生改变,是传输开始 /. 结束的标志。
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> ♦I2C 总线的主要时序参数有哪些?
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> I2C 总线的主要时序参数有:开始建立时间 t SU:STA ,开始保持时间 t HD:STA ,数据建立时间 t SU:DAT ,数据保持时间 t SU:DAT ,结束建立时间 t SU:STO 。如下图所示:
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> 开始建立时间: SCL 上升至幅度的 90% 与 SDA 下降至幅度的 90% 之间的时间间隔;
开始保持时间: SDA 下降至幅度的 10% 与 SCL 下降至幅度的 10% 之间的时间间隔;
数据建立时间: SDA 上升至幅度的 90% 或 SDA 下降至幅度的 10% 与 SCL 上升至幅度的 10% 之间的时间间隔;
数据保持时间: SCL 下降至幅度的 10% 与 SDA 上升至幅度的 10% 或 SDA 下降至幅度的 90% 之间的时间间隔;
结束建立时间: SCL 上升至幅度的 90% 与 SDA 上升至幅度的 90% 之间的时间间隔;
I2C总线的时序参数要求:
♦I2C总线如何进行读写操作?
如上图所示, I2C 开始传输时,第一个字节的前 7bit 是地址信息 (7 位地址器件 ) ,第 8bit 是操作标识,为“ 0 ”时表示写操作,为“ 1 ”时表示读操作,第 9 个时钟周期是应答信号 ACK ,低有效,高电平表示无应答,传输终止。在上图中还可以看出,正常情况下,写操作是 I2C 主设备方发起终止操作的,而读操作时, I2C 主控制器在接收完最后一个数据后,不对从设备进行应答,传输终止。
♦I2C总线案例分析
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'"> 问题描述:
在测试某 I2C 总线时,发现 SDA 数据线上有毛刺,而且出现的位置很有规律,一般在第 9 , 18 , 27----- 时钟周期的后面。如下图所示。
问题分析:
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
如上图所示, t1 是 I2C 总线上的 Slave 设备应答信号 ACK( 第 9 个时钟周期输出 ) 相对与参考时钟 SCL 下降沿的滞后时间。数据方向是 Slave--> Master 。 t 2 是 I2C 总线上的 Master 设备在第 10 个时钟输出相对了参考时钟 SCL 的滞后时间。数据方向是 Master--> Slave 。 ∆t 是 Master 设备与 Slave 设备输出数据延迟的时间差。
Master 设备发出最后一个 bit 数据后,总线的使用权交给 Slave 设备使用,由 Slave 设备发出应答信号 ACK ,该信号在 SCL 下降沿经 t1 延迟后发出,在 SCL 的下一个时钟沿后内经 t1 后结束。而 Master 设备在同一个时钟沿,经常 t2 延迟后发出第 9bit 数据,这样在 ∆t (t2-t1) 时间内, Master 和 Slave 设备都没有使用总线,由于 SDA 是 OC/OD 输出,芯片外面通过电阻 R 上拉到 VCC ,将 SDA 电平拉升,但是由于 ∆t 很短, VCC 还没来的及将 SDA 拉到稳定的高电平, Master 就开始发出数据“