I2C总线的粗浅但实用的理解

 参考链接:I2C通信的详细讲解


概念:

I2C Bus(Inter-Integrated Circuit Bus,即集成电路总线) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。


特征:
1. 物理接口: SCL + SDA

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

(2)SDA(serial data):数据线,通信数据都通过SDA线传输 

2. 通信特征:串行、同步、非差分、低速率

(1)I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输。

(2)同步通信就是通信双方工作在同一个时钟下,一般 通信的A方通过一根CLK信号线传输A自己的时钟给B,B工作在A传输的时钟下。所以同步通信的显著特征就是:通信线中有CLK。

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

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

3. 突出特征1:主设备+从设备

(1)I2C通信的时候,通信双方地位是不对等的,而是分主设备和从设备。通信由主设备发起,由主设备主导,从设备只是按照I2C协议被动的接受主设备的通信,并及时响应。

(2)谁是主设备、谁是从设备是由通信双方来定的(I2C协议并无规定),一般来说一个芯片可以只能做主设备、也可以只能做从设备、也可以既能当主设备又能当从设备(可以根据谁控制了SCL来判定谁是主设备)。(像一些传感器芯片设计的时候只能做从设备,有的芯片本身既可以当主设备又可以当从设备,通过软件来配置是主设备还是从设备)

4. 突出特征2:

(1)I2C通信可以一对一(一个主设备对1个从设备),也可以一对多(一个主设备对多个从设备)

(2)主设备负责调度总线,决定某一时间和哪个从设备通信。注意:同一时间内,I2C的总线上只能传输一对设备的通信信息,所以同一时间只能有一个从设备和主设备通信,其他从设备处于“冬眠”。不能出来捣乱,否则通信就乱套了。

(3)每一个I2C从设备在通信中都有一个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


 停止与起始:

起始和终止信号都是由主机(master)发起产生

起始信号:SCL线是高电平时,SDA线从高电平向低电平切换。

停止信号:SCL线是高电平时,SDA线从低电平向高电平切换。


字节格式:

  SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)

  首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期

  CLK上升沿锁存数据,CLK上升沿到来前SDA要提前准备好数据。


I2C数据传输格式(数据位&ACK):

(1)每一个通信周期的发起和结束都是由主设备来做的,从设备只有被动的响应主设备,没法自己自发的去做任何事情。

(2)主设备在通信周期会先发8位的从设备地址(其实8位中只有7位是从设备地址,还有1位表示主设备下面要写入还是读出)到总线(主设备是以广播的形式发送的,只要是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否相等。如果相等说明主设备本次通信 就和给我说话,如果不相等说明这次通信与我无关,不用听了不管了。

(3)发送方发送一段数据后,接收方需要回应一个ACK。这个响应本身只有1个bit位,不能携带有效信息,只能表示2个意思(要么表示收到数据,即有效响应;要么表示未收到数据,无效响应),需要注意的是,到第九个周期的时候,主设备会释放SDA,即让其变为高电平,从设备会主动来拉低SDA,主设备会读取此时的SDA,若读取此时的SDA为低则表示从设备已经收到刚刚发送的信息,若读取此时的SDA为高则表示从设备没有收到刚刚发送的信息。

(4)在某一个通信时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。如果在某个时间主设备和从设备都试图向总线写那就完蛋了,通信就乱套了。

  I2C通讯的时候每次发送的数据固定为9位,前8位为数据,最后1位为应答位。

  应答信号分类:写应答、读应答和停止读写应答

  写应答

  Master向Slave写完数据的后,Slave向Master发送的位,因此Master写完8个位以后必须等待第9位的应答信号,如果没有应答代表通讯异常。

  其信号格式:在SCL高的时候判断SDA是否为低,是低那么有应答,是高那么通讯异常,必须结束通讯。

  读应答:

  Master读完Slave的8个数据后,Master发送给Slave的位,Master读完8个位数据后必须发送这个位。

  信号格式:继续读写应答是在SCL高的时候Master拉低SDA(发送一个起始信号),停止读写应答是在SCL为高的时候拉高SDA。

参考链接:https://wenku.baidu.com/view/30c7ba1b227916888486d724.html


数据在总线上的传输协议:

(1)I2C通信时的基本数据单位也是以字节为单位的,每次传输的有效数据都是1个字节(8位)。

(2)起始位及其后的8个clk中都是主设备在发送(主设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;然后到了第9个周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动,其实就类似于总线空闲状态),同时从设备试图拉低总线发出ACK。如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没有收到ACK,主设备就认为刚才给从设备发送的8字节不对(接收失败)。

(3)由于I2C的速率很低,完全可以通gpio来模拟

I2C通信的详细讲解

原文地址:https://www.cnblogs.com/GBXL/p/15564507.html