I2C
--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线(SDA)和1根串行时钟线(SCL)实 现了双工的同步数据传输。具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。 I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在主从通信中,可以有多个I2C总线器件同时接到I2C总线 上,通过地址来识别通信对象。
IIC 接口的协议里面包括设备地址信息,可以同一总线上连接多个从设备,通过应答来互通数据及命令。但是传输速率有限,标准模式下可达到100Kbps,快速模式下可达到400Kbps(我们开发板一般在130Kbps),高速模式下达到4Mbps,不能实现全双工,不适合传输很多的数据。
IIC总线是一个真正的多主机总线,总线上多个主机初始化传输,可以通过传输检测和仲裁来防止数据被破坏 。
下来详细了解IIC总线时序:
1.1 总线数据有效性
IIC总线是单工,因此同一时刻数据只有一个流向,因此采样有效时钟也是单一的,是在SCL时钟的高电平采样数据。
IIC总线上SDA数据在SCL时钟低电平是可以发生变化,但是在时钟高电平时必须稳定,以便主从设备根据时钟采样数据,如下图:
1.2 总线空闲条件
IIC总线上设备都释放总线(发出传输停止)后,IIC总线根据上拉电阻变成高电平,SDA SCL都是高电平。
1.3 总线数据传输起始和结束条件
IIC总线SCL高电平时SDA出现由高到低的跳变,标志总线上数据传输的开始条件
IIC总线SCL高电平时SDA出现由低到高的跳变,标志总线上数据传输的结束条件
1.4 总线数据传输顺序以及ACK应答
IIC总线上数据传输室MSB在前,LSB在后,从示波器上看,从左向右依次读出数据即可
IIC总线传输的数据不收限制,但是每次发到SDA上的必须是8位,并且主机发送8位后释放总线,从机收到数据后必须拉低SDA一个时钟,回应ACK表示数据接收成功,我们如果示波器上看到的波形就是每次9位数据,8bit+1bit ack。如下:
从机收到一字节数据后,如果需要一些时间处理,则会拉低SCL,让传输进入等待状态,处理完成,释放SCL,继续传输,如下:
1.5 总线读写时序
数据的传输在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/ W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。
IIC总线主设备读写从设备,一般都是与从设备的寄存器打交道,这个可以通过阅读从设备的datasheet获取。总线写时序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master data + slave ack + master restart。。master data + slave nack + master stop
总线读时序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop
总线读时序与写的不同之处在于读需要2次传输才能完成一次读取,首先要写寄存器地址到从设备,其实是写到了从设备的控制寄存器或者命令寄存器,从设备内部会根据这个地址来寻址所要操作的寄存器。
我在读我们的bios和内核时发现,2者在总线读时序上的实现不太一样,在于第一次寄存器地址写入后,一个发的是restart,一个发的是stop,然后再start开始读取数据,示波器抓波形发现读取数据都正确,说明这2种时序都是正确的。
IIC总线的读写时序比较固定,设备通信严格遵循协议,因此iIC总线设备驱动程序的编写也就相对简单一些。
主要应用的iIc总线设备有touchscreen rtc 外扩io等
http://blog.chinaunix.net/uid-21785445-id-2688689.html
IIC总线协议最重要的是起始信号,终止信号和应答信号。起始信号和终止信号由主机产生,应答信号是每次传输完成一个字节数据后必须有的,用于确认传输是否完成,主机向设备发一个字节数据后需要设备作应答,确认设备是否收到数据,主机收一个字节数据后需要向设备发一个应答信号,告诉设备数据是否收到。
(1) 起始信号:在时钟线保持高电平期间,数据线出现由高电平向低电平变化时启动I2C总线;
(2) 终止信号:在时钟线保持高电平期间,数据线出现由低电平向高电平变化时停止I2C总线;
(3) 应答信号:应答信号在第9个时钟位上出现,接收器输出低电平为应答信号(A),输出高电平则为非应答信号(/A)。
IIC数据传输:SCL为高电平时将SDA上数据发走,所以SDA上数据必须在SCL为高电平期间保持稳定,IIC总线首先传输的是数据最高位,最后是最低位。
设备地址:在起始信号后,需要向设备发送一个字节的设备地址,其中高七位为设备的地址,表示同哪个设备进行通信,最低位为数据传输方向,1表示读(接收),0表示写(发送)。
1.发送(写)一个字节数据流程
a.起始信号
b.发送一个设备地址,这里为0,表示发送(写)),设备应答
c.发送设备的写的基地址,设备应答
d.发送数据到设备基地址,设备应答
e.停止信号
2.接收(读)一个字节数据流程
a.起始信号
b.发送一个设备地址,这里为0,表示发送(写)),设备应答
c.发送从设备要读数据的基地址,设备应答
d.起始信号
e.发送一个设备地址,这里为1,表示接收(读)),设备应答
f.从设备基地址处接收到一个字节的数据,主机应答
g.停止信号
从设备地址读或写一个字节数据后,设备读写地址会自动加1
3.连续发送(写)多个字节数据
a.起始信号
b.发送一个设备地址,这里为0,表示发送(写)),设备应答
c.发送设备的写的基地址,设备应答
d.发送数据到设备基地址,设备应答
e.发送数据到设备(基地址+1),设备应答
f.发送数据到设备(基地址+2),设备应答
g.发送数据到设备(基地址+n),设备应答
h.停止信号
4.连续接收(读)多个字节数据
a.起始信号
b.发送一个设备地址,这里为0,表示发送(写)),设备应答
c.发送从设备要读数据的基地址,设备应答
d.起始信号
e.发送一个设备地址,这里为1,表示接收(读)),设备应答
f.从设备基地址处接收到一个字节的数据,主机应答
g.从设备(基地址处+1)接收到一个字节的数据,主机应答
h.从设备(基地址处+2)接收到一个字节