概念
I2C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980年代初设计的,方便了主板、嵌入式系统或手机与周边设备组件之间的通讯。由于其简单性,它被广泛用于微控制器与传感器阵列,显示器,IoT设备,EEPROM等之间的通信。
- I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线。
- 两根通信线:SCL(Serial Clock)---串行时钟线、SDA(Serial Data)---串行数据线。
- 同步,半双工。
- 带数据应答。
- 支持总线挂载多设备(一主多从、多主多从)。
I2C的特点和优势
- 双线制:I2C使用两根信号线进行通信,包括时钟线(SCL)和数据线(SDA)。
- 多从机:多个从机设备可以连接到同一条I2C总线上,每个从机都有唯一的地址。
- 多主机:多个主机设备可以通过I2C总线进行并行通信,通过仲裁机制实现多主机冲突的解决。
- 简单和灵活的连接:I2C协议使用统一的总线结构,可以方便地连接各种设备,减少硬件复杂性。
硬件电路
- 所有I2C设备的SCL连在一起,SDA连在一起。
- 设备的SCL和SDA均要配置成开漏输出模式。
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右。
- 图中为一主多从的模型,CPU作为总线的主机,主机在任何时候都是完全掌握SCL,而且在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。
- 从机在任何时候都只能被动的读取SCL时钟线,不允许控制SCL线;对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机应答的时候,才能短暂地取得SDA的控制权。
I2C时序基本单元
- 起始条件:SCL高电平期间,SDA从高电平切换到低电平。
- 终止条件:SCL高电平期间,SDA从低电平切换到高电平。
- 图1起始条件:在I2C总线处于空闲状态时,SCL与SDA都处于高电平状态,意味着没有设备去触发SCL和SDA,SCL和SDA由外挂的上拉电阻拉高至高电平,总线处于平静的高电平状态。当主机需要进行收发时,首先产生起始条件,让SDA产生一个下降沿,当从机捕获到SCL高电平,SDA下降沿信号时,将进行自身的复位,等待主机的召唤,然后在SDA下降沿之后,主机需要将SCL置于下降沿。
- 图2终止条件:SCL先回弹到高电平,SDA再回弹高电平,产生一个上升沿,上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平,回归最初平静状态。
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。
- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)。