一、IIC基本介绍
设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量,同时也降低制造成本。通过使用只有两根线的通信总线,它有效地减少了器件间连接的复杂性。
IIC总线是两线制总线,仅有串行数据线SDA和串行时钟线SCL进行通信。减少了接口数量。
有可变的时钟速率:标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。
二、工作原理
1、开始和停止
I2C总线上的数据必须在时钟高电平时保持稳定,数据线只有在SCL线为低电平时才能改变。而当SCL为高电平时,SDA发生变化则表示的开始或停止。SDA线从高电平向低电平切换表示起始条件,SDA线由低电平向高电平切换表示停止条件。
2、数据格式
SDA线上的每个字节必须是8bit,每个字节后必须跟一个相应位。
(1)先传输IIC设备地址,传输的8bit连续数据中,只有7bit是地址,最后一位表示写(0)或读(1),最先传输的是数据的高位。
(2)再传输内部寄存器地址,传输的8bit连续数据中,全部表示内部寄存器地址,结束后返回ack信号。
(3)最后传输内部寄存器需要写入或读出的数据,8bit一个字节数据,最后返回ack响应信号后,stop结束传输。
3、数据等待
如果传输了8bit后,从机处于busy状态不能接收或传输另外一个完整的字节数据,它可以保持时钟线SCL拉低,使得主机进入等待状态,当从机准备好接收另一个字节数据时再释放时钟总线SCL,继续传输数据。
如下图即:SCL第9拍时,SDA为低电平,表示不能应答。此时下一拍SCL保持拉低,进入等待状态,等待状态时SDA数据线必须拉高。当准备好接收后,会释放时钟总线SCL,开始下一个字节数据的传输。
4、重复启动
5、运用:
主机写的步骤:
发{dev_addr,0} —> 发reg_addr —>发write_data---->主机发ack,结束。
主机读:
发{dev_addr,0} —> 发reg_addr ---->restart —> 发{dev_addr,1} —>接收read_data ---->主机发ack,结束通信。
感谢帮助~~