1.简介
IIC(Inter Integrated Circuit)协议是由飞利浦公司开发的一种半双工同步通信协议,属于一主多从的总线结构,一般有两根信号线,一根时钟线SCL和一根数据线SDA。IIC占用的硬件资源较少,速度也较低,是一种适用于低速、短距离、多设备通信的协议。
IIC的一般模式如下
模式 | 速率 | 最大电容 |
---|---|---|
标准模式(Standard Mode) | 100kb/s | 400pF |
快速模式(Fast Mode) | 400kb/s | 400pF |
增强快速模式(Fast Mode Plus) | 1Mb/s | 550pF |
高速模式(High Speed Mode) | 1.7Mb/s | 400pF |
高速模式(High Speed Mode) | 3.4Mb/s | 100pF |
极速模式(Ultra-FastMode) | 5Mb/s | ? |
IIC经过多年的发展,已经支持多主机模型,SMbus协议等。
本文仅介绍最简单的IIC协议。
2.IIC协议
2.1物理层(硬件电路)
2.1.1原理
IIC总线由串行数据线SDA,时钟线SCL和上拉电阻构成
原理是通过对SCL和SDA高低电平时序的控制,来进行数据的传输。在空闲状态时,SCL和SDA被上拉电阻拉高,保持高电平。
2.1.2电路设计和电气限制
连接到总线的输出端必须是开漏输出模式,上拉能力,即上升沿的时间由电源,总线电容和上拉电阻等决定,下降沿由OD产生,速度很快。因此IIC的通信速率上线取决于上拉能力,可以通过示波器直观的看到,上升沿相比于下降沿更慢
2.1.2.1最大设备数量
理论上来说,7位地址的IIC可以挂载127个设备,10位地址IIC可以挂载1023个设备,但是IIC规定了总线电容不能超过400pF,由于器件的管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。
上面说到了上拉能力与总线电容和上拉电阻有关,其原因是电容和电阻形成一个RC时间常数,影响了上拉时间。
2.1.2.2上拉电阻
IIC采用Open drain模式,设备不能自己输出高电平,这牵扯到一些矛盾
- 功耗低 -> 大电阻
- 速度快 -> 小电阻
上拉电阻计算公式
R_{min}=\frac{Vdd(min)-0.4V}{3mA}
\\
R_{max}=\frac{CT}{0.874 * C}
如果IIC的上升沿过缓,可以通过减小上拉电阻Rp来实现(不得小于Rmin),或者降低总线电容(减少总线上的设备数量)
IIC协议还定义了串联在SDA、SCL线上电阻。该电阻的作用是,有效抑制总线上的干扰脉冲进入从设备,提高可靠性。这个电阻的选择一般在100~200ohm左右。这个电阻并不是必须的,在恶劣噪声环境中,可以选用。
2.2协议层
2.2.1基本时序
2.2.1.1起始和终止
IIC协议规定,起始和终止只能由主机发出。
- 总线空闲时,SCL和SDA均为高电平
- SCL为高,SDA从高跳变到低,表示起始信号
- SCL为高,SDA从低跳变到高,表示终止信号
2.2.1.2 寻址
在主机发送起始后,紧接着发送设备地址
2.2.1.3发送一个字节
SCL低电平期间,主机将数据依次放到SDA上(高位先行),然后释放SCL,从机在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许变化。循环8次即可发送一个字节。
2.2.1.4接收一个字节
SCL低电平期间,从机将数据依次放到SDA上(高位先行),然后释放SCL,主机在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许变化。循环8次即可接收一个字节。
2.2.1.5应答
- 发送应答:主机在接受完一个字节后,在下一个时钟发送一位数据,0表示应答,1表示非应答
- 接收应答:主机在发送完一个字节后,在下一个时钟接收一位数据,判断从机是否应答,规则同上(接受之前需要释放SDA)
2.2.2写数据
- 主机发送起始信号
- 主机发送从机地址
- 从机产生应答信号
- 主机发送寄存器地址+write
- 从机产生应答信号
- 重复执行:
- 主机发送发送一个字节数据
- 从机产生应答信号
- 主机发送停止信号
2.2.3读数据
-
主机发送起始信号
-
主机发送从机地址
-
从机产生应答信号
-
主机发送寄存器地址+write
-
主机发送起始信号
-
主机发送寄存器地址+read
-
重复执行:
-
主机读取一个字节
-
主机发送应答信号(应答则继续读取,不应答则停止读取)
-
主机发送停止信号
连续读取时是读取以发送地址为首地址的连续内存区域
2.2.4数据有效性
- SDA线上的数据必须在SCL的高电平时保持稳定。
- SDA线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
- 发送到 SDA 线上的每个字节必须为 8 位,每次传输可以发送的字节数量不受限制 ,每个字节后必须跟一个响应位 ,首先传输的是数据的最高位
- 如果从机要完成一些其他功能后(如中断)才能接收或发送下一个完整的数据字节,可以使时钟线 SCL 保持低电平迫使主机进入等待状态 ,当从机准备好接收下一个数据字节时释放时钟线 SCL, 数据传输继续。
- 当两个主机在较短的时间内发起起始条件时,会进行仲裁,保证仅由一个主机发送数据。
3.总结
IIC协议是一种性价比非常高的通信协议,广泛用于芯片之间的通信,IIC协议是精心设计的,使用最少的硬件实现了最多的功能,其同步时序也易于软件实现,但是由于IIC是Open drain模式,导致其上拉能力较弱,因此最高传输速率有限,尽管现在已经有解决方案,但是并没有普及