s3c2440裸机-I2c编程-1.i2c协议

 1.硬件电路

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。如下图:

SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平。

 

2.i2c协议规则

传输过程如下:

 

主控发送start讯号(S)

主控发送从设备地址(slave dev addr)

主控发送方向(W/R)

从设备应答(ack)

主控(or从设备)发送数据(data)

从设备(or主控)应答(ack)

主控发送停止讯号(P)

下图是具体的s3c2440 一次i2c读写过程:

 

2.1 start & stop讯号

 

start信号:SCL是高电平,SDA被主控拉低

stop信号:SCL是高电平,SDA被主控拉高

2.2 ack讯号

 

第9个时钟周期,SDA被拉低表示ack讯号

2.3 DATA格式

 

用 9个clk传输8bit数据(7bit 从设备地址 + 1bit方向 ),MSB高位先出。第9个clk是ack讯号。

2.4 数据有效性

SDA 线上的数据必须在SCL高电平周期保持稳定,在 SCL 低电平时才能允许改变

换言之,SCL为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时SDA会进行电平切换,为下次数据表示做准备。

 

2.5 一条SDA上实现双向传输的原理(开极电路)

 

条件:

1.主设备发送时,从设备不发送(通过SCL控制即可,比如让前8个clk主控发送数据到SDA,让第9个clk从设备发送数据到SDA)

2.主设备发送数据时,从设备的“发送引脚”不能影响SDA数据。反之,从设备发送数据时,主设备的"发送引脚"不能影响到SDA数据。那么如何做到?(SDA内部电路用三极管,开集电路)

从上图得出当A,B都为低电平时,三极管不导通,SDA的电平取决于外部电路,这里SDA有上拉电阻,所以对应高电平

当主控拉高A时,三极管导通,此时SDA接地,电平被拉低

同理,当从设备拉高B时,三极管导通,此时SDA接地,电平被拉低

那么电平真值表如下:

 

所以,实现双向传输时:

如果是master-> slave进行数据传输,那么让主控驱动三极管,拉低SDA。

如果是slave-> master进行数据传输,那么让从设备驱动三极管,拉低SDA。

否则,都不驱动三极管,SDA一直输出高电平,处于idle状态

2.6 SCL被从设备拉低表示busy状态

 

第9个clk 后i2c会产生中断,此时SCL被拉低,表示busy状态,表示谁都不允许再使用i2c, 然后等到中断处理结束了,也就是处于idle状态了,此时会释放出SCL,那么主控可以继续发送SCL讯号表示可以继续进行i2c通信了。

原文地址:https://www.cnblogs.com/fuzidage/p/15384523.html