I2C

I2C
KayerI2C
1. I2C基础知识
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
是一种简单的双向两线制总线协议标准,支持同步串行半双工通讯。
标准模式传输速率为 100kbit/s,快速模式为400kbit/s,高速模式下可达3.4Mbit/s,目前大多I2C设备尚不支持高速模式。
I2C总线广泛应用于各种设备和应用领域,例如传感器、存储器(如EEPROM)、显示屏、温度传感器、实时时钟(RTC)、扩展IO芯片等。
- SCL:串行时钟总线,用于数据收发同步
- SDA:串行数据总线,用高低电平表示数据
- 可连接多个I2C通讯设备,支持一主多从也支持多主多从。每个设备都有唯一的地址,主机通过这个地址与从机通信
- 总线通过上拉电阻接到电源。设备空闲时,输出高阻态,当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平
2. 工作原理
主从关系:
- 主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
数据传送:
- 如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
- 如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。
时钟同步:
- SCL用于数据的时钟同步,确保主从设备之间的数据传输同步进行。
3. 主要特点
硬件简单:I2C总线只需要一根数据线和一根时钟线两根线,总线接口已经集成在芯片内部,不需要特殊的接口电路。
多主机总线:I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏。
在线检测:I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试。
数据传输与地址设定:数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。
负载能力:由于线路中电容会影响总线传输速度,I2C总线的负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
4. I2C协议
I2C作为串行通信,是按照位进行传输,一般是高位先行
- 起始信号:当SCL是高电平时,SDA 线从高电平向低电平切换。
- 停止信号:当SCL是高电平时,SDA 线从低电平向高电平切换
4.1 传输地址
- 主机通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。
- I2C协议规定设备地址可以是7位或10位,实际中7位的地址应用比较广泛。
- 紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W),第 8位或第11位。
- 数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
5. 总线时序
5.1 起始和停止信号
起始信号
起始信号由主设备发起,用于通知总线上的所有设备即将开始数据传输。
当SCL为高电平时,SDA由高电平变为低电平,产生一个下降沿,表示起始信号的开始。
停止信号
- 停止信号也由主设备发起,用于通知总线上的所有设备数据传输已经结束。
- 当SCL为高电平时,SDA由低电平变为高电平,产生一个上升沿,表示停止信号的开始。
5.2 数据有效性
- SDA高或低电平状态只有在 SCL时钟信号是低电平时才能改变。
- 必须在SCL保持高电平时,SDA的数据才有效。(SDA保持电平的长度高大于SCL低电平的长度)
- SCL为低电平时,此时SDA可以跳变。
5.3 响应和非响应
接收方接到数据后要给发送方响应,有2种响应
应答响应。 给发送方一个低电平(ACK),表示接收方已成功接收该字节。
非应答响应。 给发送方一个高电平(NACK),通常表示接收方接收该字节没有成功。
应答信号在SCL的第9个时钟周期(当SCL为高电平时)发送。