I2C协议
AT24C02的通信协议是I2C,下面对I2C协议做个简单介绍。
I2C协议由两根总线进行数据传输,一条是时钟线(SCL),用于传输时钟脉冲信号,一条是数据线(SDA),用于传输数据。话不多说,下面来看看一串数据是怎么传输的吧
此处贴出时序图
让我们分析一下不同的信号代表的是什么指令。
Start
SCL为高电平时SAD由高电平转为低电平,则为开始。
void Start()
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
delay10us();
SCL=0;
delay10us();
}
End
SCL为高电平时,SAD由低电平转为高电平时,则为结束。
void End()
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1;
delay10us();
}
如何传输一位:
SDA保持不变,SCL经过一个上升沿,一段时间高电平,一个下降沿后,便读取一位数据。
例如想要传输1,则需要SDA先转为高电平,SCL经过一个上升沿,一段时间高电平,一个下降沿后,数据1便传输过去了。
应答的理解:
I2C协议规定传输完8位数据后,接收数据方必须给出应答。
即接收数据方在接收完完整的8位数据后,会向发出数据方传输1位应答信号。传输为0则为应答,传输为1则为非应答。
发出数据方在接收到应答后再决定是否继续传输数据。
如何产生应答:
在发送完8位数据后,主机需保证SDA为高电平,再将SCL由低电平转为高电平,等待应答。
发送一字节数据:
uchar WriteByte(uchar info)
{
uchar a,b;
for(a=0;a<8;a++)
{
SDA=info>>7;
info<<=1;
delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us();
}//此处为发送完一字节信息
SDA=1;
delay10us();
SCL=1;
while(SDA)
{
b++;
if(b>200)
{
SCL=0;
delay10us();
return 0;
}
}//此处为等待应答,并将应答与否作为参数返回
SCL=0;
delay10us();
return 1;
}
读取一字节数据:
uchar Read()
{
uchar out=0,i;
SDA=1;
delay10us();
for(i=0;i<8;i++)
{
SCL=1;
delay10us();
out<<=1;
out|=SDA;
delay10us();
SCL=0;
delay10us();
}
SDA=0;
delay10us();
return out;
}
从机地址的理解:
I2C协议支持多设备,通过对从机地址的访问,对不同设备进行通信。
D7~D1 位组成从机的地址。D0位是数据传送方向位,为“ 0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。
AT24C02的地址D7~D4位默认为1010。
数据传输格式:
红色为主机行为。
主机向从机写数据:
S–>从机地址+0–>A–>date–>A–>date–>~A–>E
主机向从机读数据:
S–>从机地址+1–>A–>date–>A–>date–>~A–>E
其中S是Start,E是End,A是应答
AT24C02
AT24C02的读写规则:
AT24C02芯片规定数据的传输为地址+数据,即规定从机地址后的下一位为数据地址。
对数据进行操作之前必须写入数据地址。
主机向从机写数据:
S–>从机地址+0–>A–>数据地址–>A–>date–>~A–>E
主机向从机读数据:
S–>从机地址+0–>A–>数据地址–>A–>S–>从机地址+1–>A–>date–>~A–>E
写入数据:
//从指定地址开始写入数据
uchar WriteDate(uchar add,uchar date)
{
uchar k=0;
Start();
WriteByte(0xa0);
WriteByte(add);
WriteByte(date);
End();
return k;
}
读入数据:
uchar ReadDate(uchar add,uchar date)
{
uchar out;
Start();
WriteByte(0xa0);
WriteByte(add);
Start();
WriteByte(0xa1);
out=Read();
End();
return out;
}