1 I2C通信
I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
两根通信线:SCL(Serial Clock)、SDA(Serial Data)
同步,半双工
带数据应答
支持总线挂载多设备(一主多从、多主多从)
2 硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
主机完全掌控SCL线,空闲状态下主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候主机才会转交SDA的控制权给从机。在任何时刻SCL线都只能被动读取,从机不允许控制SCL线,从机不允许主动发起对SDA的控制。
主机SCL可以配置为推挽输出,从机的SCL配置成浮空输入或上拉输入。为避免设备出现短路,I2C禁止所有设备输出强上拉高电平,采用外置弱上拉电阻加开漏输出的电路结构。
一主多从:主机可以访问总线上的任何一个设备,每个设备要确定唯一的设备地址,主机在起始条件之后要发送一个字节叫从机的名字,被叫到的从机要响应之后主机的读写操作。从机设备地址在I2C协议标准分为7位地址和10位地址。MPU6050的芯片7位地址为1101 000,AT24C02的7位地址为1010 000。
引脚数据进来通过数据缓冲器进行输入,输出时采用开漏输出。
3 I2C时序基本单元
(1)起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
都由主机控制
(2)发送一个字节:
SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
最开始SCL低电平,主机如果想发送0就拉低SDA到低电平,想发送1就放手SDA回弹到高电平,在SCL低电平期间允许改变SDA电平,SDA放好后主机松手时钟线SCL回弹到高电平,高电平期间从机读取SDA,此时SDA不允许变化,主机放手SCL一段时间后就可以继续拉低SCL传输下一位。
(3)接收一个字节:
SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
(4)发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
4 I2C时序
4.1 指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
起始条件+设备地址(7位地址位&