I2C通信时序解析

简介

I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行、半双工通信总线,使用多主从架构,是由Philips公司在1980年代初设计的,主要用于近距离、低速的芯片之间的通信。由于其简单性,它被广泛用于微控制器与传感器阵列,显示器,IoT设备,EEPROM等之间的通信。

I²C最重要的功能包括:

  • 只需要两条总线;
  • 没有严格的波特率要求
  • 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
  • I²C是真正的多主设备总线,可提供仲裁和冲突检测;
  • 传输速度;
    • 标准模式:Standard Mode = 100 kbit/s
    • 快速模式:Fast Mode = 400 kbit/s
    • 高速模式: High speed mode = 3.4 Mbit/s
    • 超快速模式: Ultra fast mode = 5 Mbit/s (注意是bit/s不是Byte/s)
  • 最大主设备数:理论上无限制;实际可挂接的设备数量受总线的最大电容400pF限制
  • 最大从机数:理论上是127(按7bit地址计算);
  • 最远通信距离:通常情况下1-10m,通过专用i2c远距离通信芯片驱动可扩展至1km甚至更远的通信距离。

物理层

IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL

SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的

SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的

所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL都接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。

I2C总线物理连接如下图所示,SDA和CLK连接线上连有两个上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) ,为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。当总线空闲时,两根线由于上拉电阻存在因此均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低。只有总线上所有器件输出高阻态,总线才会是高电平。这就是I2C的“线与”机制。

漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻
高阻状态:高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。电路分析时高阻态可做开路理解。

在这里插入图片描述

当总线要传输低电平’0’时,Logic会控制FET使其导通总线SDA/SCL连接到地,将总线拉低,注意在快速模式下最大的灌电流不超过3mA,这限制了上拉电阻的最小值。
在这里插入图片描述
如果I2C设备端口能接受的灌电流最大值为 3 mA;
另外I2C总线规范和用户手册还为低电平输出电压 VOL 设置了最大值为0.4V
在这里插入图片描述
根据上面的式子,对于5V的电源,每个上拉电阻必须至少具有1.53kΩ,而对于3.3V的电源,每个电阻必须至少具有967Ω。如果觉得计算电阻值比较麻烦,也可以使用典型值 4.7kΩ。如果Rp阻值过小,VDD灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值Vol=0.4V);如果灌入端口的电流过大,还可能损坏端口。关于上拉电阻阻值问题可以参考:I2C详解

当总线要传输高电平’1’时,Logic会控制FET使其关断SDA/SCL总线上拉到电源,将总线拉高。
在这里插入图片描述

协议层

起始和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
在这里插入图片描述
重复起始条件:和起始条件相似,重复起始条件发生在停止条件之前。主机想继续给从机发送消息时,一个字节传输完成后可以发送重复起始条件,而不是产生停止条件。

数据位的有效性规定

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。(如果SCL高电平器件,SDA电平变化了,那就变成了起始或停止信号)
SCL处于高电平的时候,如果SDA处于低电平:传输数据0,SDA处于高电平:传输数据1。

应答信号

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。

应答信号:主机SCL拉高,读取从机SDA的电平
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
在这里插入图片描述

字节传送

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。
在这里插入图片描述
以传输Byte:1010 1010 (0xAAh)为例,SDA SCL传输时序如下所示:
在这里插入图片描述

常见数据帧格式

I2C总线上传送的数据信号是广义的,即包括地址信号,又包括真正的数据信号。

在起始信号后必须传送一个从机的地址(7位),第8位数数据的传送方向位(R/W),用“0”表示主机发送数据(W),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。在总线的一次数据传送过程中,可以有以下几种组合方式:

a) 主机向从机发送数据:
在这里插入图片描述
b) 主机向从机中读取数据
在这里插入图片描述
c)主机先向从机中发送数据,后向从机读数据
在这里插入图片描述
注:S:起始信号,A:应答信号,A非 表示非应答,P:终止信号,

阴影部分表示数据由主机向从机传送,无阴影部分表示从机向主机发送数据。

数据传输中间如果想转换发送方向,不用发P停止信号,就不会释放总线,直接再发起始信号。

以读写AT24C02为例看时序

AT24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节。在24C02里面有一个8字节的页写缓冲器。
在这里插入图片描述
A0,A1,A2:硬件地址引脚
WP:写保护引脚,接高电平只读,接地允许读和写
SCL和SDA:IIC总线

向AT24C02中写数据

图片来自AT24C02的数据手册:
【单字节写入时序】
在这里插入图片描述
1.MCU先发送一个开始信号(START)启动总线

2.接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0)

3.等待应答信号(ACK)

4.发送数据的存储地址。24C02一共有256个字节的存储空间,地址从0x00~0xFF,想把数据存储>在哪个位置,此刻写的就是哪个地址。

5.发送要存储的数据第一字节、第二字节、…注意在写数据的过程中,E2PROM每个字节都会>回应一个“应答位0”,如果没有回应答位,说明写入不成功。

6.发送结束信号(STOP)停止总线

向AT24C02中读数据

【任意地址数据读取】
在这里插入图片描述
1.MCU先发送一个开始信号(START)启动总线

2.接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0)
注意:这里写操作是为了要把所要读的数据的存储地址先写进去,告诉E2PROM要读取哪个地址的数据。

3.发送要读取内存的地址(WORD ADDRESS),通知E2PROM读取要哪个地址的信息。

4.重新发送开始信号(START)

5.发送设备读操作地址(DEVICE ADDRESS)对E2PROM进行读操作 (0xA1)

6.E2PROM会自动向主机发送数据,主机读取从器件发回的数据,在读一个字节后,MCU会回应一个应答信号(ACK)后,E2PROM会继续传输下一个地址的数据,MCU不断回应应答信号可以不断读取内存的数据

7.如果不想读了,告诉E2PROM不想要数据了,就发送一个“非应答位NAK(1)”。发送结束信号(STOP)停止总线

参考:
https://blog.csdn.net/as480133937/article/details/105366932

https://blog.csdn.net/sternlycore/article/details/85600668

https://blog.csdn.net/zhangduang_KHKW/article/details/121953275

https://baijiahao.baidu.com/s?id=1732071884578858046&wfr=spider&for=pc

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾爱技术圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值