关于I2C这个协议,它体现了一个单片机难度的开始,我记得当时我学51时,I2C一直都理解不了,现在回来一看,它的原理貌似又显得如此的简单..
对于硬件连接,也就是SCK时钟线,SDA数据线,两条线而已,这里唯一有讲究的就是I2C上为什么要加上拉电阻:SDA这条线上不一定只接有一个I2C设备,若是在数据传输过程中,设备1的SDA输出1,而设备2的SDA因为设计等各种原因输出了2,那么造成短路,设备将会有烧坏的风险,在这里,我们可以看向I2C设备的内部结构图:
对于一个I2C设备而言,SDA并不直接由设备驱动,而是由OUT处的三极管控制,当OUT=1导通时,SDA接地,则SDA=0,相对的,当OUT=0时,SDA则由外部的电路决定其电平属性。若两边的设备OUT都为0,SDA悬空,那么上拉电阻就能为原本为悬空状态的SDA设置电平为高。有以下真值表
AOUT | BOUT | SDA |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
I2C原理
白色背景表示主-->从,灰色背景表示从-->主
数据写入
流程如下:
1.主芯片(开发板内置)发出一个START信号到从设备
2.主芯片发出设备地址(用于选中I2C总线上的I2C设备)以及方向(0表示写,1表示读)
3.从设备回应(用于确定设备是否存在)
4.主设备发送一个字节的数据给从设备,并等待回应,当接受到从设备的回应后才继续发送下一个字节的数据
5.数据发送结束后,主设备送出一个停止信号给从设备。
数据读出
流程如下:
1.主芯片(开发板内置)发出一个START信号到从设备
2.主芯片发出设备地址(用于选中I2C总线上的I2C设备)以及方向(0表示写,1表示读)
3.从设备回应(用于确定设备是否存在)
4.从设备发送一个字节的数据给主设备,并等待回应,当接受到主设备的回应后才继续发送下一个字节的数据
5.数据发送结束后,主设备送出一个停止信号给从设备。
I2C信号如何形成?
那么START信号,设备地址,方向,停止信号等等又该如何形成呢?
设备地址怎么看?
以AT24C02为例子
对于不同大小的I2C设备,具有不同的从器件地址。由于24C02为2k容量,也就是说只需要参考下图中第一行的内容
即AT24C02的设备地址为:1010xxx,若AT24C02的A1,A2,A3引脚都接地,则AT24C02的设备地址为1010000
SMBus(System Management Bus)系统管理总线,是I2C的一个子集,它是基于I2C的基础提出了更为严格的使用规范。
VDD极限值对比I2C:
SCL时钟频率对比I2C:
地址回应(Address Acknowledge)对比I2C:
数据传输格式对比I2C:
1.Quick Command数据格式
这种数据格式如图,可以在发出设备地址后,只发出一位数据,用于一些简单的I2C设备使用,如开关等。
2.Receive Byte数据格式
这种数据格式如图,和原本的I2C协议很像,但区别在于主设备在接收到从设备发出的数据后,不需要进行应答(ACK)
3.Send Byte数据格式
几乎与I2C的过程一致。
4.Read Byte数据格式
与上面的Receive Byte不同,Read Byte需要在发出设备地址后,还需要发出一个8位的芯片寄存器地址(Command Code),然后发出一个重复S信号(后面会讲这个机制)
5.Read Word数据格式
与Read Byte类似,但区别就是把数据分为高字节与低字节,就是一个是传8位数据用,一个传16位的数据。
6.Write Byte数据格式
7.Write Byte数据格式
对应的写操作数据格式如上:
8.Block Read数据格式
在这个块的读操作涉及到一个新的地方即:从设备会将数据数量Block Count的值上报到主设备,然后主设备才从从设备中读取N个块的数据。
9.Block Write数据格式
类似的东西,不再赘述
10.Block Write - Block Read Process Call数据格式
这个数据格式即写入N个数据块后立即读出N个数据块的数据,这里的两个N分别由主设备和从设备决定
11.PEC数据格式
PEC数据格式是一种错误校验码,即一个用于检验数据是否发送正常的数据块
SMBus中还存在REPEATED START Condition信号的机制(重复发出S信号)
即主设备在完成对数据的写操作后,主设备不用发出结束信号(P),而是直接发出下一个开始信号(S),然后对数据进行读操作即可。在BLOCK数据格式中,如果把传输Block Count的步骤去掉即为I2CBlock数据格式。在两种协议中更建议使用SMBus