标题:
I2C总线读取一个数据时,24c02和PCF8591的单片机程序为什么不一样?
[打印本页]
作者:
Cmz@
时间:
2020-6-4 17:31
标题:
I2C总线读取一个数据时,24c02和PCF8591的单片机程序为什么不一样?
函数功能: 接收一字节子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
uchar tdata=0;
while(n--)
{
SDA = 1;//这一句的作用是什么?
SCL = 1;
tdata =tdata<<1; //左移一位
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SCL = 0;
}
return(tdata);
}
这是PCF8591在i2c上读取一个数据的函数,在每次while循环时为什么需要使SDA值为1,而且当scl为1时,此时SDA为1,那读出来的每一位不都是1吗?而如果把这一句注释掉则A/D转换结果全为0.
/***************************************************
函数功能:从AT24Cxx读取数据
出口参数:x
***************************************************/
unsigned char ReadData()
// 从AT24Cxx移入数据到MCU
{
unsigned char i;
unsigned char x; //储存从AT24Cxx中读出的数据
for(i = 0; i < 8; i++)
{
SCL = 1; //SCL置为高电平
x<<=1; //将x中的各二进位向左移一位
x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中
SCL = 0; //在SCL的下降沿读出数据
}
return(x); //将读取的数据返回
}
这是24c08从i2c上读取一个数据的函数,在每次for循环开始,并没有SDA=1;语句,这样也能从24c08中正确读取数据。同样是读取数据函数,不知道为什么有这个区别?
作者:
温xyz
时间:
2020-6-4 21:40
SDA = 1;//这一句的作用是什么?这是主机把数据线拉高,等待24C02输出数据。
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
这个IF和ELSE才是读取24C02数据。
作者:
Cmz@
时间:
2020-6-4 22:44
温xyz 发表于 2020-6-4 21:40
SDA = 1;//这一句的作用是什么?这是主机把数据线拉高,等待24C02输出数据。
if(SDA == 1)
tdata = tda ...
不是,上面那个函数是PCF8591进行A/D转换时,从i2c总线上读一个数据的函数。
作者:
vscos
时间:
2022-1-11 19:30
这得看两个程序的情况,有些程序在其它的地方已经拉高了,所以在读取的时候就不用在拉高了
作者:
188610329
时间:
2022-1-11 19:47
读完一个字节会发ack,发ack时会sda=0,如果管杀不管埋,那么在下次读的时候就要sda=1,反之,发完ack,有首尾,会sda=1,自然在收下一个字节就不需要sda=1了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1