I2C协议

昨天笔试问到一些总线协议,都忘得差不多了,重新复习一下I2C协议(第一篇博客I2C协议

转载自http://blog.csdn.net/jscese/article/details/44001185http://blog.csdn.net/black_yu/article/details/51926077

以及一些自己的总结

  • I2C 总线的概念:

I2C (Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线最主要的优点就是简单性和有效性。

I2C总线是由数据线SDA和时钟SCL构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或接收器件(具体由器件的功能决定) 。I2C总线上传输控制情况见下图: 

I2C协议

  • I2C总线的通信特征

串行、同步、非差分、低速率

(1)串行。I2C属于串行通信

(2)同步。同步通信就是通信双方工作在同一个时钟下,同步通信的显著特征就是:通信线中有CLK

(3)非差分。因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信

(4)低速率。I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(一般几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程的时候要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率)

主要用途:SoC和周边外设之间的通信(典型的如EEPROM、电容触摸IC、各种sensor等)

  • I2C总线的几种信号状态:

空闲状态:SDA和SCL都为高电平。

忙状态:当总线被占用,对其他从设备来说属于忙状态……

开始条件(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束条件(P):SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:即认可信号,主机写从机时,每写完一个字节,如果正确从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。在主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出认可信号,告诉从机所发数据已经收妥(注:读从机时主机在最后一个字节数据接收完后,不发应答,直接发停止信号)


注意:任何在时钟线为高电平期间的数据线上的电平改变都被认为是起始和停止信号,所以数据改变必须要在时钟为低电平时改变。

I2C协议

  • I2C总线传输特征
  1. 数据有效:在SCL的高电平期间, SDA保持稳定,数据有效。SDA的改变只能发生在SCL的底电平期间。
  2. 数据传输:发送到 SDA 线上的每个字节必须为 8 位 每次传输可以发送的字节数量不受限制 每个字节后必须跟一个响应位,首先传输的是数据的最高位。
  3. ACK信号: 数据传输的过程中,接收器件每接收一个字节数据要产生一个ACK信号,在第九个SCL时钟脉冲的高电平期间,持续拉低SDA,向发送器件发出特定的低电平脉冲,表示已经收到数据。
  4. 地址字节:在起始条件(S)后,第一个字节中的前7位代表从机地址,第8位代表读写,0 表示发送(写),1 表示接收(读)。
  5. 一次数据传输的完整波形如下: 
I2C协议

  • 数据结构

     I2C协议

I2C支持两种数据格式:

7bit/10bit寻址数据格式

7bit/10bit寻址和重复开始信号的格式

从设备地址:

总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.
系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。

 I2C协议

硬件结构:

每一个I2C总线器件内部的SDASCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这种电路具有两个特点:

(1)由于 SDASCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的线与逻辑; 
2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 时钟同步总线仲裁提供硬件基础。

  • 几个问题?

(1)模拟I2C与硬件I2C有什么区别

     原理上:硬件I2C(提供专门的SDA,SCL)的时钟是系统产生的,一般由晶振分频产生。模拟I2C通过编程模拟时钟线和数据线。

     控制上:硬件I2C过硬件中断实现各种操作。模拟I2C没有中断的概念,通过IO口电平置高置低来实现写入和读取。

     性能上:硬件模式更高效更稳定。

(2)MPU6050MPU9250I2C

     之前对于这两个芯片的通过I2C的操作地址有点乱,如要获取到加速度计的原始值,首先要发送开始信号,然后是发送从机地址(I2C的设备地址),然后发送寄存器的地址(这里很多人会搞乱了,因为要发两次地址,第一次是I2C设备地址,第二次是加速度计的地址),接下来才能获取到原始数据。(也就是从机地址+寄存器地址)