i2c协议

来源:互联网 发布:winsteel软件下载 编辑:程序博客网 时间:2024/06/06 14:14

 一、关于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  从设备应答并返回单字节数据 应答周期无操作 主设发送停止位。

        单字节写的时序为:先78H 再寄存器地址 待写入数据字节  从设备应答 主设发送停止位。

7. 连续读写


同样假设I2C设备地址为:3CH   

        多字节读的时序为:先78H 再寄存器地址 再79H  从设备应答,单字节数据返回, 主设备应答, 从设备返回Addr+1位置数据,如果主设备继续产生应答则继续返回下一地址数据,直到达到主设备期望的读取数据长度。主设备停止应答,并产生停止信号,数据传输完成。

        多字节写的时序为:先78H 再寄存器地址 (再78H  应答)待写入数据字节  从设备应答 待写入数据字节  从设备继续应答,当主设备完成全部数据写入后,发送停止位,标志连续写入完成。

四、总结

       注意数据方向,单次读产生了2个start位。无论读还是写第一次通信读写位均为写(0),相当于向所有设备写I2C地址。

       连续读写是不同的,写少发送一次设备请求操作,因为当前默认为写模式,固不需要切换。读为先发送访问寄存器地址,然后发送读取命令。然后通过应答位进行连续读写操作,读的时候ACK由主设备产生,表示收到了数据,写的时候ACK由从设备产生表示写成功了。

       为什么最开始的时候是写模式?因为访问发起端无论是需要读还是写 都需要向接收端指定操作设备,即理解为发起端“写”操作地址到接收端。当我们需要完成读操作时就需要将设备切换回读取模式,因此多了一次模式切换操作。 在模式切换命令前为什么需要一个开始位呢?? 没有进入空闲模式的Start即表示读取的开始。否者就会进入写模式,地址被写入了先前写入的地址。还会有数据回来吗?

0 0
原创粉丝点击