51单片机读取IIC总线的问题
ucharI2C_read_byte(){uchardat,i;SCL=0;//先拉低_nop_();SDA=1;//时钟总线为高电平才可以读_nop_();for(i=...
uchar I2C_read_byte()
{
uchar dat,i;
SCL = 0; //先拉低
_nop_();
SDA = 1; //时钟总线为高电平才可以读
_nop_();
for(i = 0 ; i < 8 ; i++)
{
SCL = 1;
_nop_();
if (SDA)
{
dat |= 0x01; //
}
else
{
dat &= 0xfe; //1111 1110
}
_nop_();
SCL = 0 ;
_nop_();
if(i < 7)
{
dat = dat << 1;
}
}
return(dat);
}
/*I2C发送数据*/
bit I2C_TransmitData(uchar ADDR, DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(ADDR);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(DAT);
if (!Test_ACK())
{
return(0);
}
I2C_Stop();
return(1);
}
为什么发送数据的时候 要把scl=0 sda=1 ,但是 接收数据的时候却不用呢 ?
发送数据的程序:
void I2C_send_byte(uchar byte)
{
uchar i;
for(i = 0 ; i < 8 ; i++)
{
SCL = 0;
_nop_();
if (byte & 0x80)
{
SDA = 1;
_nop_();
}
else
{
SDA = 0;
_nop_();
}
SCL = 1;
_nop_();
byte <<= 1; // 0101 0100B
}
SCL = 0;
_nop_();
SDA = 1;
_nop_();
} 展开
{
uchar dat,i;
SCL = 0; //先拉低
_nop_();
SDA = 1; //时钟总线为高电平才可以读
_nop_();
for(i = 0 ; i < 8 ; i++)
{
SCL = 1;
_nop_();
if (SDA)
{
dat |= 0x01; //
}
else
{
dat &= 0xfe; //1111 1110
}
_nop_();
SCL = 0 ;
_nop_();
if(i < 7)
{
dat = dat << 1;
}
}
return(dat);
}
/*I2C发送数据*/
bit I2C_TransmitData(uchar ADDR, DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(ADDR);
if (!Test_ACK())
{
return(0);
}
I2C_send_byte(DAT);
if (!Test_ACK())
{
return(0);
}
I2C_Stop();
return(1);
}
为什么发送数据的时候 要把scl=0 sda=1 ,但是 接收数据的时候却不用呢 ?
发送数据的程序:
void I2C_send_byte(uchar byte)
{
uchar i;
for(i = 0 ; i < 8 ; i++)
{
SCL = 0;
_nop_();
if (byte & 0x80)
{
SDA = 1;
_nop_();
}
else
{
SDA = 0;
_nop_();
}
SCL = 1;
_nop_();
byte <<= 1; // 0101 0100B
}
SCL = 0;
_nop_();
SDA = 1;
_nop_();
} 展开
1个回答
展开全部
scl=0 scl=1 用来产后时钟脉冲
发送时SDA = 1是发1 SDA = 0是发0
接收时SDA = 1是进入读取状态(弱上拉,不接负载时读取是1,但很容易被拉低成0)具体读取得到的是1还是0,是由24C02存储的数据决定的,如果存储的数据的当前位是0,SDA总线上的1会被拉低成0,这时读取得到的就是0
发送时SDA = 1是发1 SDA = 0是发0
接收时SDA = 1是进入读取状态(弱上拉,不接负载时读取是1,但很容易被拉低成0)具体读取得到的是1还是0,是由24C02存储的数据决定的,如果存储的数据的当前位是0,SDA总线上的1会被拉低成0,这时读取得到的就是0
追问
其实 我问的不是这个 我问的是发送字节的最好要把SDA拉高 但是读取字节的时候为什么不用拉高了 最后我发现 读取字节完毕之后 IIC要发送一个非应答信号 然后 发送停止信号 不用关心以后的数据传送问题 总之 谢谢你了!!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询