I2C详解(一)

I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。要想了解详细I2C协议,目前最新的I2C标准协议是2014年第6版本,如下:
I2C-Bus Standards Specification


硬件连接

I2C仅需两根线就可以支持一主多从或者多主连接,I2C使用两个双向开漏线,配合上拉电阻进行连接,关于上拉电阻阻值大小有最大值和最小值的限制,具体计算请参考 I2C-上拉电阻计算

  • SDA:串行数据线
  • SCL:串行时钟线

在这里插入图片描述

在这里插入图片描述

  • 硬件拉低(Open-Drain Pulling Low)

下图代表了总线电平拉低过程,当总线要传输低电平’0’时,Logic会控制FET使其导通VBUS总线连接到地,将总线拉低,注意在快速模式下最大的灌电流不超过3mA,这限制了上拉电阻的最小值。

在这里插入图片描述

  • 硬件拉高(Open-Drain Releasing Bus)

下图代表了总线电平高电平过程,当总线要传输高电平’1’时,Logic会控制FET使其关断VBUS总线上拉到电源,将总线拉高。

在这里插入图片描述


软件通讯协议

I2C是串行传输总线,按照下面格式进行一位一位传输。协议如下:
在这里插入图片描述


总线速度

双向传输总线:

  • 标准模式(Standard-mode):速率高达100kbit/s
  • 快速模式(Fast-mode):速率高达400kbit/s
  • 快速模式+(Fast-mode Plus):速率高达1Mbit/s。
  • 高速模式(High-speed mode):速率高达3.4Mbit/s

单向传输总线:

  • 超快速模式(Ultra Fast-mode):速率高达5Mbit/s

起始和停止条件及重复起始条件(START and STOP conditions and Repeated start condition):
起始和终止条件都是由主机(master)发起产生。总线在起始条件之后处于忙碌状态,在停止条件之后又处于空闲状态。

  • 起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。
  • 停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。
  • 重复起始条件:和起始条件相似,重复起始条件发生在停止条件之前。主机想继续给从机发送消息时,一个字节传输完成后可以发送重复起始条件,而不是产生停止条件。
    在这里插入图片描述

字节格式
SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。
在这里插入图片描述
以传输Byte:1010 1010 (0xAAh)为例,SDA SCL传输时序如下所示:
在这里插入图片描述


响应ACK(Acknowledge)和非响应NACK(Not Acknowledge)
每个字节传输必须带响应位,相关的响应时钟也由主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。以上图传输101010101为例,SCL第9位时钟高电平信号期间,SDA拉低其代表了有ACK响应位。
当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK非响应位。这种情况下,主机可以直接产生STOP条件终止以后的传输或者继续重新START开始一个新的传输。以下情况会导致出现NACK位:

  • 接收机没有发送机响应的地址,接收端没有任何ACK发送给发射机
  • 由于接收机正在忙碌处理实时程序导致接无法接收或者发送
  • 传输过程中,接收机识别不了发送机的数据或命令
  • 接收机无法接收
  • 主机接收完成读取数据后,要发送NACK结束告知从机
    以下图例代表NACK时序:
    在这里插入图片描述

7-bit 地址格式和读写位
一个7-bit的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟1-bit(R/W)的操作符,1表示读操作,0表示写操作。 接下来的一个bit是NACK/ACK,当这个帧中前面8 bit发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(stop或repeated start condition)。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sternlycore/article/details/85600668
I2C