一、I2C串行总线的组成及工作原理
I2C总线是PHLIPS公司推出的一种串行总线,它只有两根双向信号线。一根是数据线SDA(serial data),另一根是时钟线SCL(serial clock)。可挂多器件,每个器件有唯一地址。通信的方式采用主从方式,主机主动联系从机,从机则被动回应数据。
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
二、I2C总线传输协议
I2C通信一共包含五个时序:起始,终止,应答,发送(写)和接受(读),这五个时序分别由不同的脉冲组合来决定。
数据位有效性:
SCL为高电平期间,SDA必须保持稳定;
SCL为低电平期间,SDA状态允许变化。
起始/终止时序:
SCL高电平,SDA由高向低的变化表示起始信号;
SCL高电平,SDA由低向高的变化表示终止信号。
应答时序:
每个字节8位,先传最高位,后面跟随一位应答位(即一帧9位)
应答位:从机空闲发出应答“0”、从机繁忙发出非应答“1”;
此时主机应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。(*应答位是从机发出的,数据从主机到从机)
发送(写)时序:
数据线 起始信号+从机地址(7位)+数据传送方向位(R/T=1/0)
“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
关于从机地址:这里以AT24C02为例,A0A1A2为地址输入(即I2C可以挂2^3=8个该从机)。
当A0=A1=A2=0时,地址为1010 0000=0xa0。
接收(读)时序:
读操作与写操作的启动方式相同。共有三种读取操作:当前地址读取,随机地址读取和顺序读取。
数据线 起始信号+从机地址(7位)+数据传送方向位(R/T=1/0)
“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
软件模拟I2C通讯:
以上 可知
I2C起始时序程序
void I2C_Start()
{
SCL = 1;
_nop_(); //空操作,占一个机器周期1.08506
SDA = 1;
delay_5us();
SDA = 0;
delay_5us();
}
I2C终止时序程序
void I2C_Stop()
{
SDA = 0;
_nop_();
SCL = 1;
delay_5us();
SDA = 1;
delay_5us();
}
主机检测从机应答
bit Test_ACK()
{
SCL = 1; //在时钟总线为高电平期间可以读取应答信号
delay_5us();
if (SDA)
{
SCL = 0;
I2C_Stop();
return(0);
}
else
{
SCL = 0;
return(1);
}
}
主机发送应答
void Master_ACK(bit i)
{
SCL = 0;
_nop_();
if (i)
{
SDA = 0;
}
else
{
SDA = 1;
}
_nop_();
SCL = 1;//数据保持稳定
_nop_();
SCL = 0;
_nop_();
SDA = 1;
_nop_();
}
关于SPI总线协议有兴趣可以看看。
参考链接:
[1]: I2C总线规格书和用户手册–NXP
[2]:AT24C02_DataSheet
[3]:清翔电子