Fork me on GitHub

I2C通讯协议

1、基本概念

  主机            初始化发送,产生时钟信号和终止发送的器件

      从机             被主机寻址的器件

  发送器          发送数据到总线的器件

      接收器         从总线接收数据的器件

      多主机         同时有多于一个主机尝试控制总线 但不破坏报文

      仲裁           是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程

      同步           两个或多个器件同步时钟信号的过程

2、硬件结构

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

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

3、时钟同步

如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主机,当主机在准备下一次传送发现SCL的电平被拉低时就进行等待,直至从机完成操作并释放SCL线的控制控制权。这样以来,主机实际上受到从机的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步问题。

4、主机发送数据流程

1)主机在检测到总线为空闲状态(即 SDASCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始

2)主机接着发送一个命令字节。该字节由 7 位的外围器件地址(设备地址)和 1 位读写控制位 R/W组成(此时 R/W=0

通常最低一位就是R/W位,,“0”表示写,“1”表示读(通常读写信号中写上面有一横线,表示低电平)

3)相对应的从机收到命令字节后向主机回馈应答信号 ACKACK=0

4)主机收到从机的应答信号后开始发送第一个字节的数据

5)从机收到数据后返回一个应答信号 ACK

6)主机收到应答信号后再发送下一个数据字节

7)当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信。

注意:主机所接收数据的数量是由主机自身决定,当发送非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。

I2C位传输
   数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit
   SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)
   数据改变:SCL为低电平时,SDA线才能改变传输的bit

 

 

I2C开始和结束信号
   开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
   结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

 

 

 另外I2C的通信速率为100Kb,快速为400Kb

 

 5、I2C总线典型问题

 

 

解决方案:

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2017-04-14 17:13  yooooooo  阅读(2571)  评论(3编辑  收藏  举报