一、特点
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。其主要特点可以概括如下:
(1)在硬件上,12C总线只需要一根数据线SDA和一根时钟线SCL两根线,SDA传输数据,每次传输8bit,即一字节,且先传输高bit,再传输低bit。SCL是时钟线,用于时钟同步。
(2)I2C总线是一个真正的多主机总线。如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有的地址,任何器件既可以作为主机也可以作为从机,但任何时间点只能有一个主机。总线上每个设备都有自己的一个地址,通过地址方式寻址各个器件,共7个bit,理论上总线可挂载127个器件(全0为广播地址),但一个系统中可能有多个同种芯片,因此地址又分为固定部分和可编程部份,具体视芯片而定。
(3)连接到总线上的芯片数量除受7bit地址限制外,还受总线电容的限制。
(4)串行的8位双向数据传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。
二、工作原理
SDA和SCL都是双向I/O线,接口电路为开漏输出,使用时必须通过上拉电阻接到电源VCC.当总线空闲时,两根线都是高电平,连接总线的所有器件输出级都是开漏电路,从而在总线上消耗的电流很小。因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度。当电容过大时,有可能造成传输错误。由于其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
总线上的器件由一个主器件和其他从器件组成。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主器件要发送数据给从器件,则主器件首先寻址从器件,然后主动发送数据至从器件,由主器件终止数据传送;如果主器件要接收从器件的数据,首先由主器件寻址从器件.然后主器件接收从器件发送的数据,由主器件终止接收过程。在这种情况下,主器件负责产生定时时钟和终止数据传送。
三、传输协议
位传输
数据位传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据;若SDA发生跳变,则用来表示一个会话的开始或结束。数据改变:SCL为低电平时,SDA线才能改变传输的数据位,具体如下图所示。
开始和结束信号
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。其具体如下图所示。
应答信号
主设备每发送完8bit数据后等待从设备的ACK,即在第9个clk,读取到SDA低电平为有效;主设备把clk拉低,并将sda换成输入模式(上拉电阻,默认高电平)读取第9位,clk再次拉高,读取从设备发来的ACK。这里又分两种情况:
1.写操作:主设备把clk拉高,等待读取ACK,从设备发现clk拉高后,就把sda拉低,告诉主设备,成功接收到8位数据。
2.读操作:主设备发送芯片地址和寄存器地址,这两个字节的ACK都是由从设备来拉低,同写操作; 从设备开始向从设备发送数据,clk为低时,sda变化,主设备clk拉高时读取sda, ACK由主设备拉低; 当从设备发送完一个字节后,主设备强制把ACK拉高,通知从设备不要需要再发了, 从设备发现这个ACK没有被拉低,认为主设备接收错误,也就结束发送了,当然从设备自己也知道这是一个字节。
? 标准写流程
a) 主器件产生开始信号
b) 主器件发送从器件地址(7bit)和读写操作位0(1bit),改SDA为输入,等待ACK
c) 从器件发送ACK
d) 主器件发送从器件寄存器地址(8bit),改SDA为输入,等待ACK
e) 从器件发送ACK
f) 主器件发送数据字节(8bit),即要写入寄存器中的数据,改SDA为输入,等待ACK
g) 从器件发送ACK
h) 上述第f步至第g步可以重复多次,即可以按顺序写多个寄存器
i) 主器件产生停止信号,结束数据传输。
? 标准读流程
a) 主器件产生开始信号
b) 主器件发送从器件地址(7bit)和读写操作位0(1bit),改SDA为输入,等待ACK
c) 从器件发送ACK
d) 主器件发送从器件寄存器地址(8bit),改SDA为输入,等待ACK
e) 从器件发送ACK
f) 主器件产生开始信号
g) 主器件发送从器件地址(7bit)和读写操作位1(1bit),改SDA为输入,等待ACK
h) 从器件发送ACK
i) 从器件发生数据字节(8bit),即寄存器中的值
j) 主器件发送ACK
k) 上述第i步至第j步可以重复多次,即可以按顺序读多个寄存器
l) 主器件产生停止信号,结束数据传输。