标题: 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