I2C通信详解

  1. 什么事I2C通信
    1. 物理接口:SCL+SDA
      1. SCL(serial clock ):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。
      2. SDA(serial data):数据线,通信数据都通过SDA线传输
    2. 通信特征:串行、同步、非差分、低速率
      1. I2C 属于串行通信,所有的数据以位为单位在SDA线上串行传输。
      2. 同步通信就是通信双方工作在同一个时钟下,一般是通信的A方通过一根CLK信号线传输自己的时钟给B,B工作在A传输的时钟下,所以同步通信的显著特征就是:通信线中有CLK
      3. 非差分。因为I2C速率不高且通信双方距离很近,所以使用电平信号通信。
      4. 低速率。 I2C一般是用在板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程的时候要看自己使用的设备允许的I2C通信最高速率,不能超过这个速率)
  1. 突出特征1:主设备+从设备
    1. I2C通信的时候,通信双方地位是不对等的,而是分设备和从设备。通信由主设备发起,由主设备主导,从设备只是按照I2C协议被动的接受主设备的通信,并及时响应
    2. 谁是主设备、谁是从设备是由通信双方来定的(I2C协议并无规定),一般来说一个芯片可以只能做主设备、也可以只能做从设备、也可以既能当主设备又能当从设备(软件配置)。
  2. 突出特征2:可以多个设备挂在一条总线上(从设备地址)
    1. I2C通信可以一对一(1个主设备对1个从设备),也可以一对多(一个主设备对多个从设备)
    2. 主设备来负责调度总线,决定某一时间和那个设从设备通信。注意:同一时间内,I2C的总线上只能传输一对设备的通信信息,所以同一时间只能有一个从设备和主设备通信,其他从设备处于“冬眠”状态,不能出来捣乱,否则通信就乱套了
    3. 每一个I2C从设备在通信中都有一个I2C从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要自己将要通信的那个从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。(这个地址是一个电路板上唯一的,不是全球唯一的)
    4. 主要用途:SoC和周边外设之间的通信(典型的如EEPROM、电容触摸IC、各种sensor等)
  1. 由I2C学通信时序
    1. 什么是时序?
      1. 时序:字面意思就是时间顺序,实际上在通信中时序就是通信线上按照时间顺序发生的电平变化,以及这些变化对通信的意义就叫时序
    2. I2C的总线空闲状态、起始位、结束位
      1. I2C总线上有1个主设备,n个从设备。I2C总线上有两种状态;空闲态(所有从设备未和主设备通信,此时总线空闲)和忙态(其中一个从设备在和主设备通信,此时总线被这一对占用,其他从设备必须歇着)
      2. 整个通信分为一个周期一个周期,两个相邻的通信周期是空闲态。每一个通信周期由一个一个起始位开始,一个结束位结束,中间是本周期的通信数据。
      3. 起始位并不是一个时间点,起始位是一个时间段,在这个时间内总线状态变化情况是:SCL线维持高电平,同时SDA发生一个从高到低的下降沿
      4. 与起始位相似,结束位也是一个时间段。在这段时间内总线变化情况是:SCL线维持高电平,同时发生一个低到高的上升沿。
    3. I2C数据传输格式(数据位&ACK)
      1. 每一个通信周期的发起和结束都是由主设备来做的,从设备只有被动的响应主设备,设法自己自发的去做任何事情
      2. 主设备在每个通信周期会先发8位的从设备地址(其实8位中只有7位从设备地址,还有1位表示主设备下面是要写入还是读出)到总线(主设备是以广播的形式发送的,只要是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个设备从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否相等。如果相等说明主设备本次就是给我说话,如果不想等说明这次通信与我无关,不用听了不管了
      3. 主设备发送一段数据后,从设备需要回应一个ACK。这个相应本身只有一个bit位,不能携带有效信息,只能表示两个意思(要么表示收到数据。即有效响应;要么表示未收到数据,无效相应)
      4. 在某一个通信时刻,主设备和从设备只能有一个在发(占用总线,也就是想总线写),另一个在收(从总线读)。如果在某个时间主设备和从设备都试图向总线写那就完蛋了,通信就乱套了。
  1. 数据在总线上的传输协议
    1. I2C通信时的基本数据单位也是以字节为单位,每次传输的有效数据都是1个字节(8位)
    2. 起始位及其后的8个CLK中都是主设备在发送(主设备掌控主线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息然后到了第9周期,按照协议规定从设备需要ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动,其实就类似与总线空闲状态),同时从设备试图拉低总线发出ACK。如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则从设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没收到ACK,主设备就认为给从设备发送的8字节不对(接收失败)

--------------------- 本文来自 若数 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Karven_/article/details/52202134?utm_source=copy

猜你喜欢

转载自blog.csdn.net/xiaoluoshan/article/details/82937854
今日推荐