一、关于I2C
I2C为( Inter-IC bus)是用于主从设备通信的协议,具有如下特点:
由两条双向物理连线构成CLK与SDA,可简化布线要求。
具有广泛的支持,常用于传感器控制、数据传输等低数据流要求场合。
通过仲裁可以拥有多个主设备,主设备具备分时操作所有从设备的能力,但在同一时间只有一对设备处于工作状态。
每一个I2C设备都有独立的I2C地址。
丛设备可以为只读设备,也可以为可读写设备。
二、SCL与SDA内部电路
输出采用开漏或集电极开路结构因此需要外接上拉电阻。通过(RECEIVE INFO FROM THE BUS)读入电路可知,所有设备一直在监听总线状态,以确定总线当前是空闲还是忙碌。当数据传输空闲,SCL与SDA均回到高电平状态。
三、I2C协议
1. I2C协议时序图
下面为典型的I2C开始停止时序图
2.开启与停止条件
每一次的传输都以一个START(S)状态开始,通过发送STOP(P)状态告知传输终止。传输开始总线进入忙碌状态,传输结束标志总线重新回到空闲状态。在总线空闲阶段,传输端(Maser)将数据线(SDA)拉低,告知所有I2C设备传输开始。而设备在时钟(SCL)的高电平释放对数据(SDA)的控制,则表示本次传输的终止,设备重新回到空闲状态。
I2C的数据线状态转换都应在时钟(SCL)的低电平操作,在时钟的高电平,数据线应保持稳定的高或低电平状态。
3. 数据格式
8bit为单次传输基本单位(高位在前低位在后),第9clk周期为应答周期,由从设备将SDA线拉低,单次传输数据字节长度不限。如果从设备无法立即应答,则可通过拉低SCL数据线,让数据发送端进入等待状态。从设备通过释放SCL继续数据传输。
4.传输应答机制
每字节数据传输都需要产生对应应答信号,表示数据被从设备接收。时钟始终由主设备产生,用于数据同步。在第9时钟周期SDA控制由主设备转换为从设备,并拉低SDA产生应答信号,主设备开始下一字节传输或停止。如果在第9时钟周期SDA一直为高电平,则表示无应答信号产生。主设备可选择继续尝试下一次传输或发送停止信号。
5. I2C读写地址
START信号后紧跟I2C从设备地址,采用7+1数据格式,7为有效I2C地址,1为数据传输方向(低为写、高为读)。然后数据传输为MSB 在前,这也是为什么驱动I2C地址的写法为:ADDR <<1 | FLAG_WR。
6. 单次读写
假设I2C设备地址为:3CH
单字节读的时序为: 先78H 再寄存器地址 再79H 从设备应答并返回单字节数据 应答周期无操作 主设发送停止位。