关于I2C的读写问题
时间:10-02
整理:3721RD
点击:
下面两个程序都是关于I2C的写数据程序,为什么第二个程序就不行呢?
第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;
SDA=CY;
_nop_();
SCL=1;
NOP4();
SCL=0;
}
Read_ACK();
}
第二个程序:void Write_A_Byte(uchar dat) //写一个字节
{
uchar i;
uchar temp;
temp=dat;
SCL=0; //释放时钟信号 让数据总线变化
for(i=0;i<8;i++)
{
if(temp&0x80)
SDA=1;
else
SDA=0;
//SCL=1;
temp<<=1;
NOP4();
SCL=1;
NOP4();
}
SDA = 1;
NOP4();
}
第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;
SDA=CY;
_nop_();
SCL=1;
NOP4();
SCL=0;
}
Read_ACK();
}
第二个程序:void Write_A_Byte(uchar dat) //写一个字节
{
uchar i;
uchar temp;
temp=dat;
SCL=0; //释放时钟信号 让数据总线变化
for(i=0;i<8;i++)
{
if(temp&0x80)
SDA=1;
else
SDA=0;
//SCL=1;
temp<<=1;
NOP4();
SCL=1;
NOP4();
}
SDA = 1;
NOP4();
}
用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了
第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。
void Write_A_Byte(uchar dat) //写一个字节
{
uchar i;
uchar temp;
temp=dat;
SCL=0; //释放时钟信号 让数据总线变化
for(i=0;i<8;i++)
{
if(temp&0x80)
SDA=1;
else
SDA=0;
SCL=1;
temp<<=1;
NOP4();
SCL=0;
NOP4();
}
}
是这样的,但是还是不行啊…………
顶一个………………
if(temp&0x80)
SDA=1;
else
SDA=0;
在这加一个NOP4();试试
SCL=1;
temp<<=1;
NOP4();
SCL=0;
NOP4();
另外你如何判断写入是否成功呢
还是不行,我是用24c04在仿真软件上仿真的
嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。
