51单片机接AT24C02模拟I2C总线问题
时间:10-02
整理:3721RD
点击:
我用51单片机接AT24C02模拟I2C总线,编写程序的时候其中向AT24C02写入一个字节这个函数,如下:
void WriteByte(uchar dat)
{
uchar i,temp;
temp = dat;
for (i = 0;i < 8;i++)
{
temp <<= 1;
SCL = 0;
delay();
SDA = CY;
delay();
SCL = 1;
delay();
}
SCL = 0;
delay();
SDA = 1;
delay();
}
其中,这个函数最后的SCL = 0;delay();SDA = 1;delay();去掉任何一个程序都不能正常工作,SDA=1我知道是为了以后应答的时候检测是否被拉成低电平,但是我【实在不知道为什么一定要写SCL=0】?为什么去掉这个函数里最后的SCL = 0;程序就不能正常工作?
(PS:应答程序如下
void I2CResponse()
{
uchar i;
SCL = 1;
delay();
while ((SDA == 1) && (i < 250))
{
i++;
}
SCL = 0;
delay();
})
如需要其他部分程序可回复我。谢谢!
void WriteByte(uchar dat)
{
uchar i,temp;
temp = dat;
for (i = 0;i < 8;i++)
{
temp <<= 1;
SCL = 0;
delay();
SDA = CY;
delay();
SCL = 1;
delay();
}
SCL = 0;
delay();
SDA = 1;
delay();
}
其中,这个函数最后的SCL = 0;delay();SDA = 1;delay();去掉任何一个程序都不能正常工作,SDA=1我知道是为了以后应答的时候检测是否被拉成低电平,但是我【实在不知道为什么一定要写SCL=0】?为什么去掉这个函数里最后的SCL = 0;程序就不能正常工作?
(PS:应答程序如下
void I2CResponse()
{
uchar i;
SCL = 1;
delay();
while ((SDA == 1) && (i < 250))
{
i++;
}
SCL = 0;
delay();
})
如需要其他部分程序可回复我。谢谢!
IIC协议你压根就没看吧,这都是协议规定的东西
嗯IIC协议我仔细看过,但我没找到这两句话必须加的 详细依据,您能告诉我吗
这个跟各个人所编写的程序结构有关,你可以多找一些24c02的例程,对比一下,至少我的24c02程序时没有你所疑惑的那两个操作的。
有时候有些操作并不一定时协议里要求的,只是可能因为程序结构的问题,有时为了后续操作的电平信号衔接而做一些电平的操作。
这个是我写的,从机主动返回应答子函数,看下,感觉这个东西没那么难理解