找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1632|回复: 4
打印 上一主题 下一主题
收起左侧

I2C总线读取一个数据时,24c02和PCF8591的单片机程序为什么不一样?

[复制链接]
跳转到指定楼层
楼主
ID:316481 发表于 2020-6-4 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
函数功能: 接收一字节子程序
//-------------------------------------------------------------------
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中正确读取数据。同样是读取数据函数,不知道为什么有这个区别?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:8222 发表于 2020-6-4 21:40 | 只看该作者
SDA = 1;//这一句的作用是什么?这是主机把数据线拉高,等待24C02输出数据。
if(SDA == 1)
tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe;   // 否则数据的最后一位置0
这个IF和ELSE才是读取24C02数据。
回复

使用道具 举报

板凳
ID:316481 发表于 2020-6-4 22:44 | 只看该作者
温xyz 发表于 2020-6-4 21:40
SDA = 1;//这一句的作用是什么?这是主机把数据线拉高,等待24C02输出数据。
if(SDA == 1)
tdata = tda ...

不是,上面那个函数是PCF8591进行A/D转换时,从i2c总线上读一个数据的函数。
回复

使用道具 举报

地板
ID:654797 发表于 2022-1-11 19:30 | 只看该作者
这得看两个程序的情况,有些程序在其它的地方已经拉高了,所以在读取的时候就不用在拉高了
回复

使用道具 举报

5#
ID:624769 发表于 2022-1-11 19:47 来自手机 | 只看该作者
读完一个字节会发ack,发ack时会sda=0,如果管杀不管埋,那么在下次读的时候就要sda=1,反之,发完ack,有首尾,会sda=1,自然在收下一个字节就不需要sda=1了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表