I2C概念梳理

一、简介

I2C(Inter-integrated Circuit)总线支持设备之间的短距离通信,它需要两根信号线来完成信息交换(一根SDA,串行数据线;一根SCL,串行时钟线)。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz、7-bit标准地址。1992年,I2C的第一个公共规范发行,增加了400kHz的快速模式以及10-bit扩展地址。在I2C的基础上,1995年Intel提出了“System Management Bus” (SMBus),用于低速设备通信,SMBus 把时钟频率限制在10kHz100kHz,但I2C可以支持0kHz5MHz的设备:普通模式(100kHz即100kbps)、快速模式(400kHz)、快速模式+(1MHz)、高速模式。

二、I2c协议

1.开始条件

为了标识传输正式启动,master设备会将SCL置为高电平(当总线空闲时,SDA和SCL都处于高电平状态),然后将SDA拉低,这样,所有slave设备就会知道传输即将开始。如果两个master设备在同一时刻都希望获得总线的所有权,那么谁先将SDA拉低,谁就赢得了总线的控制权。在整个通信期间,可以存在多个start来开启每一次新的通信序列。

2.地址帧

用于master指明消息发往哪个slave。

地址帧总是在一次通信的最开始出现。一个7-bit的地址是从最高位(MSB)开始发送的,这个地址后面会紧跟1-bit的操作符,1表示读操作,0表示写操作。

接下来的一个bit是NACK/ACK,当这个帧中前面8bits发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(stop或repeated start condition)。

3.数据帧

由master发往slave的数据(或由slave发往master),每一帧是8-bit的数据。

在地址帧发送之后,就可以开始传输数据了。Master继续产生时钟脉冲,而数据则由master(写操作)或slave(读操作)放到SDA上。每个数据帧8bits,数据帧的数量可以是任意的,直到产生停止条件。每一帧数据传输(即每8-bit)之后,接收方就需要回复一个ACK或NACK(写数据时由slave发送ACK,读数据时由master发送ACK。当master知道自己读完最后一个byte数据时,可发送NACK然后接stop condition)。

4.停止条件

当所有数据都发送完成时,master将产生一个停止条件。停止条件定义为:在SDA置于低电平时,将SCL拉高并保持高电平,然后将SDA拉高。

注意:在正常传输数据过程中,当SCL处于高电平时,SDA上的值不应该变化,防止意外产生一个停止条件。

5.重复开始条件

SDA在SCL低电平时拉高,然后SCL拉高。接着master就可以产生一个开始条件继续新的消息传输。

6.时钟拉伸,时钟同步,总线仲裁

三、I2C的读写流程

1.写寄存器的标准流程
  • Master发起START
  • Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
  • Slave发送ACK
  • Master发送reg addr(8bit),等待ACK
  • Slave发送ACK
  • Master发送data(8bit),即要写入寄存器中的数据,等待ACK
  • Slave发送ACK
  • 第6步和第7步可以重复多次,即顺序写多个寄存器
  • Master发起STOP
2.读寄存器的标准流程
  • Master发送I2C addr(7bit)和w操作1(1bit),等待ACK
  • Slave发送ACK
  • Master发送reg addr(8bit),等待ACK
  • Slave发送ACK
  • Master发起START
  • Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
  • Slave发送ACK
  • Slave发送data(8bit),即寄存器里的值
  • Master发送ACK
  • 第8步和第9步可以重复多次,即顺序读多个寄存器
发布了81 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/105222375
I2C