s5pv210——I2C基础详解、I2C时序详解

时间:2024-04-14 14:07:14

以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除 。

参考博客:

http://blog.****.net/oqqhutu12345678/article/details/65445338

http://www.cnblogs.com/biaohc/p/6271335.html

https://blog.****.net/Mr_Lyoko/article/details/79598106

https://blog.****.net/lingfeng5/article/details/73361833(推荐)

 

一、I2C介绍

1、物理接口:SCL+SDA

(1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

(2)SDA(serial data):数据线,通信数据(命令、地址、数据)都通过SDA线传输。

2、通信特征:串行、同步、电平、低速率

(1)串行通信。所有的数据以bit为单位在SDA线上串行传输(但每次传输8bit)。

(2)同步通信。即通信双方工作在同一个时钟。A方通过一根CLK信号线传输A的时钟给B,B工作在A传输的时钟下。

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

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

3、突出特征

(1)主设备+从设备

  • 分主设备和从设备。通信由主设备发起和主导,从设备只是按照I2C时序协议被动的接受主设备的通信。
  • 谁是主从设备,由通信双方来决定(I2C协议并无规定)。

(2)可以多个设备挂在一条总线上(从设备地址)

  • 主设备负责调度总线,决定某一时间和哪个从设备通信。
  • 同一时刻,只能有一个从设备和主设备通信,其他从设备处于“冬眠”状态。
  • 每个I2C从设备在通信中都有一个I2C从设备地址,共7个bit,广播地址全0。
  • 它是从设备本身固有的属性。通信时主设备需要知道从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。这个地址是一个电路板上唯一的,不是全球唯一的。
  • 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。
  • 理论上7位有128位地址,然而除去保留几个保留地址如广播地址0x00等,数量少于128个,且标准协议里预见了地址的局限性,扩充了10位地址的概念。
  • 对于IIC可以挂多少个设备的问题:对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个,对于不同的设备来说,标准协议里面没有限制具体的个数的多少,这个由线路布线情况,软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。

(3)SDA传输数据是大端传输,以字节为单位的,每次传输的有效数据都是1个字节(8位)。

4、应用领域

SoC和周边外设之间的通信,典型的如EEPROM、电容触摸IC、各种sensor等;

 

二、I2C时序

1、I2C通信时序的四个元素

s5pv210——I2C基础详解、I2C时序详解

(1)开始信号、结束信号

SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。   

SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

分析:跳变有两个方向1->0和0->1,因为SDA总线空闲是1(由下图可知),且只有下拉操作,故1->0是开始信号,1->1是结束信号。

s5pv210——I2C基础详解、I2C时序详解

(2)数据bit传输(应答 / “0”、非应答 / “1”)

SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit。

SDA传输完一个字节后,主机会释放SDA线(最后一位若是0,则取消下拉恢复为高电平1,或者最后一位本来就是1),这时SDA处于高电平的状态,从机就可以控制SDA线了。

若从机下拉了SDA线并且主机从SDA读到了这一个低电平,则表示从机发送了一个确认信号(0)

若从机不对SDA下拉,则主机读到SDA依然位高电平,故表示一个非应答信号(1)

 

2、I2C数据传输格式

(1)每一个通信周期的发起和结束都由主设备进行,从设备只有被动的响应主设备。

(2)在每个通信周期,主设备先发送8位的从设备地址

  • 其中7位是从设备地址,1位表示主设备接下来是要写数据到总线,还是从总线读取数据
  • 主设备以广播的形式发送,总线上的所有从设备都能收到这个信息;
  • 从设备收到地址后,与本身的设备地址对比。

(3)发送方发送一段数据后,接收方需要回应一个ACK

  • 这个响应只有1个bit位,只能表示2个意思,表示有无收到数据。

(4)在某个时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。

 

3、数据在总线上的传输协议

s5pv210——I2C基础详解、I2C时序详解

 

a、综述

(1)起始位及其后的8个clk中都是主设备在发送(主设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;

(2)然后到了第9周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动),同时从设备试图拉低总线发出ACK。

(3)如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高。这意味着主设备没有收到ACK,主设备就认为刚才给从设备发送的8字节不对。

b、细述

主设备首先会发送7bit位的slave device地址,和1bit位的rean或者write命令。(这里的读写,讲的是主机对总线的操作。比如写,主机写数据到总线,那么从机是读的;比如读,主机读总线的数据,那么从机是写的。)

(1)write命令

如果为write命令,则主设备释放总线(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA为高位;然后从设备拉低SDA,表示ACK主设备;然后主设备再发送8bit数据,从设备再ACK(A),通信结束(P)。

写寄存器的标准流程:

1.    Master发起START

2.    Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

3.    Slave发送ACK

4.    Master发送reg addr(8bit),等待ACK

5.    Slave发送ACK

6.   Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7.    Slave发送ACK

8.    第6步和第7步可以重复多次,即顺序写多个寄存器

9.    Master发起STOP

(2)read命令

如果为read命令,则从设备先拉低SDA表示ACK主设备,然后再发送8bit数据。主设备拉低SDA表示ACK从设备(我已经读取8bit的数据了),之后结束。

读寄存器的标准流程

1、Master发送I2Caddr(7bit)和 W操作1(1bit),等待ACK

2.    Slave发送ACK

3.    Master发送reg addr(8bit),等待ACK

4.    Slave发送ACK

5.   Master发起START

6.    Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK

7.    Slave发送ACK

8.   Slave发送data(8bit),即寄存器里的值

9.   Master发送ACK

10.    第8步和第9步可以重复多次,即顺序读多个寄存器