I2C 简介

关键字 :I2C

1. 目的

         主要介绍 I2C 通信 。

 

2. I2C 简介

         这里的内容参考的是 2014.4.4 的 V.6 版本的官方 I2C-Bus 规格书 ,第三章有给出相应的链接 。

2.1 引脚

         I2C 一般而言是一种同步半双工的通信方式 ,所以除了电源引脚之外 ,I2C 有时钟引脚 SCL 和数据引脚 SDA 。但需要注意 :在 V.6 版本中 ,I2C 在超快模式 (5Mbps)只能是单工通信 。

2.2 数据帧


                                                   图 1 I2C 主机传输数据帧

                                                图 2 I2C 主机读取数据帧

         如图 1 ,在主机写了从机地址 +‘0’(write) 之后 , 从机应答 ,后面可以接着写数据 ,从机再应答 ,最后是停止位 。注意 :理论上数据可以是 0 至无数个 。具体处理如下 :

(1) 空闲 :SCL 和 SDA 都是高电平 。

(2) 启动 :SCL 为高电平 ,SDA 从高到低转换 。

(3) 从机地址 / 数据 :8 位 ,从 MSB 开始传输数据 ;主机控制 SDA 。SDA 在 SCL 高电平期间要保存稳定 ,在 SCL 低电平期间改变状态 。一个数据传输产生一个时钟脉冲 。(注意 :第一个数据是从机地址 + 写即‘0’)

(4) 应答 :在第 9 个时钟脉冲期间 ,主机释放 SDA 线 ,由从机控制 。拉低是正确应答 。

(5) 停止 :SCL 为高电平 ,SDA 从低到高转换 。一段时间 (<5μs) 内不能进行启动 。

注意 :若数据没传输完成 ,则一直通过循环 (3) 、(4) ,数据写完之后 ,进入停止情况 。

如图 2 ,在主机写了从机地址 +‘1’(read) 之后 , 从机应答 ,后面由从设备发送数据 ,主机应答 ,最后是停止位 。注意 :理论上数据可以是 0 至无数个 。具体处理与主机传输数据大致一样 ,但在 (3) 、(4) 部分有修改 ,具体如下 :

(3) 从机地址 / 数据 :8 位 ,从 MSB 开始传输数据 ;总线传输从机地址时 ,主机控制 SDA ,总线传输数据时 ,从机控制 SDA 。SDA 在 SCL 高电平期间要保存稳定 ,在 SCL 低电平期间改变状态 。一个数据传输产生一个时钟脉冲 。(注意 :第一个数据是从机地址 + 写即‘0’)

(4) 应答 :在第 9 个时钟脉冲期间 ,若是传输的是从机地址 ,主机释放 SDA 线 ,由从机控制 ;

若传输数据,则从机释放 SDA ,由主机控制 。拉低是正确应答 。

         以上是最基础的数据帧格式 ,在实际中 ,都是组合这两种数据帧 。当然 ,(5) 中停止情况可能会换成重启动情况 。如图 3 所示 ,若数据传输完成之后主机仍然继续通信 ,可以产生重启动 ,但在最终一定要生成停止情况 。

                                                                                       图 3 I2C 总线上的数据传输

2.3 速率

       I2C 总线共有几个传输模式 :

  • 标准模式 (Sm) :最高可达 100Kbit/s
  • 快速模式 (Fm) :最高可达 400Kbit/s
  • 快速模式+ (Fm+) :最高可达 1Mbit/s
  • 高速模式 (Hs) :最高可达 4Mbit/s
  • 超快模式 (UFm) :最高可达 5Mbit/s (单工)

除了 UFm 模式 ,其他模式支持向下低速兼容 。

2.4 电气和时序相关

         在此版本中 ,电平的‘0’和‘1’判断为 (单位为 :V ,并且不考虑 Hs 和 UFm 模式) :

  • 输入低电平 (VIL) :-0.5~0.3VDD
  • 输入高电平 (VIH) :7VDD~(VDD + 0.5) 或 5.5
  • 输出低电平 (VOL) :0~0.4 (在 VDD > 2V 的情况下)
  • 低电平输出电流 (IOL) :对 Sm 和 Fm 最小为 3mA ,Fm+ 为 20mA

这个限制了上拉电阻 Rp 的最小值 ,结合图 4 和图 5 提到的最大上升时间 tr 等 ,上拉电阻在一个范围之内 :

                                                     (VDD – VOL) / IOL ≤ Rp ≤ tr / (0.8473 * Cb)


                                                                              图 4 Sm 、Fm 和 Fm+ 的时序图


                                                                     图 5 Sm 、Fm 和 Fm+ 的时序特征                          

2.5 多主控制

         2.1~2.4 简单介绍了 I2C 的基础功能 (7位地址) ,接下来介绍 I2C 总线的多主控制 。

         I2C 总线是多主控总线 ,即连接到总线上的主机不止一个 (要注意在总线上被主机寻址的任何设备都是从机) ,而且总线上的主机没有任何优先顺序 ,此时如果两个或多个主机同时控制总线 ,就会出现竞争现象 ;在 I2C 中 ,通过时钟同步和仲裁决定那个主机顺利控制总线 (如果两个主机传输相同 ,那就都可以顺利完成) 。

         (1) 时钟同步

         仅在多主控制中需要 。简单来说 ,时钟同步就是想要控制总线的主机同时向 SCL 发送时钟 ,在这过程中 ,只要有任何一个主机发送的时钟是低电平 ,那么 SCL 线上的就是低电平 (那些低电平持续时间较短的主机将进入 SCL 是高电平的等待状态 ,只有 SCL 线上为高电平时 ,才开始高电平周期的计数) 。当且仅当所有控制总线的主机都发送高电平时 ,SCL 线上才是高电平 (当有一个主机时钟从高电平转换为低电平时 ,所有想要控制总线的主机时钟都将发出低电平 ,开始低电平周期) 。即可认为 :主机中低电平持续时间最长的决定了 SCL 线上的低电平周期 ,而主机中高电平持续时间最短的决定了 SCL 线上的高电平周期 。如图 6 为时钟同步示意图 。

                      
                                          图 6 时钟同步示意图

         (2) 仲裁

         时钟同步针对 SCL 线 ,仲裁针对的是 SDA 线 ,仲裁同样在多主控制中才有效 。

         首先 ,在启动时 ,所有要控制总线的主机必须在 tHD :STA 时间 (详细见图 5 ) 内启动 ,


                                                图 7 仲裁示意图

         接下来将一位一位的进行仲裁 ,在 SCL 为高电平时 ,每个主机都要检查 SDA 电平与自身发送的电平是否匹配 ,如果不匹配则仲裁失败 ,仲裁失败的主机才关闭 SDA 的输出驱动器 ,但在仲裁失败的字节结束前 ,这个主机可以继续产生时钟信号 ,并且总线空闲时必须重新启动传输 (如果仲裁失败的主机有从机功能 ,该主机必须切换到从机模式) 。

         在这里说明一下 ,因为 IIC 总线有线与功能 ,所以竞争时低电平胜出 。

         除了上述之外 ,I2C允许从机将 SCL 拉低强制主机进入等待状态 ;地址不止有 7 位 ,还可以有 10 位 ;保留地址的用法等等 ,有兴趣可以查看相关资料 。    

3. 参考资料

(1) NXP 官网 :《I2C-bus specification and user manual

         下载链接 :

https://www.nxp.com.cn/docs/en/user-guide/UM10204.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论