I2C详解(一)_sternlycore的博客-CSDN博客_i2c
I2C协议靠这16张图彻底搞懂(超详细)_GREYWALL-CSDN博客_i2c协议
I2C别人的已经讲得很清楚,我按自己的理解重新写写,加深记忆。
I2C特性:
只需要两条总线,一条时钟线SCL,一条数据线SDA;
没有严格的波特率要求,但不能大于其硬件规定的速率;
所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
I²C是真正的多主设备总线,可提供仲裁和冲突检测;
标准模式:Standard Mode = 100 Kbps(最常用)
快速模式:Fast Mode = 400 Kbps
高速模式: High speed mode = 3.4 Mbps
超快速模式: Ultra fast mode = 5 Mbps
最大主设备数:无限制;
最大从机数:理论上是127
引脚和硬件连接:
I2C设备间的连接只有两根线,SDA数据线和SDL时钟线,SDA和SDL均结在上拉电阻,平时处于高电平。
设备地址的确定:
连接到同一个主设备的所有I2C从机,其设备地址不能相同,主机通过往从机写入设备地址,如果某个从机的地址与写入的数据匹配,则应答产生连接,从而主机找到从机
设备地址分为三部分:固定部分+变动部分+读(1)/写(0)
固定部分,要到芯片手册里找
变动部分,在原理图就能看到,这部分是可以更改的,图示A0A1A2都接地,位000,如果有另外一个I2C芯片,可以把A0接高电平,改成001
P为页,只能用程序写入,比较大的I2C芯片内部有很多也,就需要P,如下有2个P,说明最多有4页
把固定部分,变动部分以及读/写合起来就是一个芯片的设备地址:如上读为10100001
数据传输
I2C的数据传输很简单,总结了几条规则方便记忆:
1.scl时钟信号高电平,sda必须稳定(此时数据传输),如果此时sda信号反转,不是启动(sda下降,一高一低)就是停止(sda上升,两个都高)
2.主从每次互动,一定是8+1(应答):7位设备地址+1位读写+1位应答;8位内存地址+1位应答;8位数据+1位应答
3.启动信号之后一定是紧接着设备地址发送(7位设备地址+1位读写+1位应答),找从机
4.应答是低电平
传输的各种状态:
空闲状态:SDA和SDL均处于高电平
启动:SDL处于高电平时,SDA拉低(这是一个动态过程),所有从机立刻激活
结束:SDL处于高电平,SDA拉高(这是一个动态过程)
传输过程:在SDL高电平时,SDA维持稳定,在SDL低电平时,SDA发生变化
应答(ACK):拉低SDA线,并在SCL为高电平期间保持SDA线为低电平
非应答(NOACK):不要拉低SDA线(此时SDA线为高电平),并在SCL为高电平期间保持SDA线为高电平
通讯步骤:
读:(每步最后自动补应答)
主机启动--->找从机(写)--->写内存地址---->再次启动-->找从机(读)--->从机发送,主机应答
--->知道主机不应答--->主机停止
写:
主机启动--->找从机(写)--->写内存地址---->写数据---->主机停止,连续写和单字节写是一样
通信时序: I2C是同步通讯,每步结束都需要应答或者非应答
A.启动
SDL处于高电平,SDA拉低,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。
B.
只要主机按规矩来,从机就自动知道怎么做,真是好小弟