找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机IIC中SDA和SCL引脚无法拉高的问题

[复制链接]
跳转到指定楼层
楼主
ID:1010470 发表于 2022-3-15 01:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人目前使用的是朱老师的板子,写了一个模拟IIC的代码,但测试时发现SDA和SCL引脚拉低后无法拉高,而使用朱老师的例程则不会发生这种问题,我比对了下朱老师的代码,目前没有找到问题(引脚配置相同,Start()和Stop()函数也相同),还请大佬们指出我的问题所在,不胜感激

代码部分在附件,写的比较乱,也没有做注释,还望大佬海涵

51_IIC.rar

32.83 KB, 下载次数: 12

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

使用道具 举报

沙发
ID:776619 发表于 2022-3-15 06:52 | 只看该作者
本帖最后由 wolfinn 于 2022-3-15 06:53 编辑

IIC_SendByte(0xA0);
IIC_SendByte(0x00);
IIC_SendByte(0xab);
个人认为I2C动作需要时间的,这三句要加延时。其他时方有关I2C操作也是如此。也可以把这三个发数据写为I2C其中一个函数,当然函数也不能不考虑延时问题。
回复

使用道具 举报

板凳
ID:776619 发表于 2022-3-15 07:09 | 只看该作者
也就是说单片机想获得I2C控制权时I2C器件又没有完全释放。
回复

使用道具 举报

地板
ID:584814 发表于 2022-3-15 08:33 | 只看该作者
建议两个程序对照查不同之处,然后应当就清楚了。
或者直接将不同部分一起发上来参考。
回复

使用道具 举报

5#
ID:401564 发表于 2022-3-15 12:42 | 只看该作者
你的IIC写入之后没有把SDA拉高
本身就没有SDA拉高的代码,SDA怎么能拉高呢?
要有SDA=1;这个语句之后,才能读取到SDA的电平数据
给你一个参考一下,顺便问你一个问题,为什么要写low呢?0不行吗?它不比low少打两键盘吗?
void Write_Byte(unsigned char Byte)                        //写入器件的应答信号由从机给出
{
        unsigned char i;
        unsigned int k;               
        for(i=0;i<8;i++)
                         {                               
                                if(Byte&0x80)SDA=1;
                                else SDA=0;
                                Delay();
                                SCL=1;
                                Delay();
                                SCL=0;
                                Delay();                                               
                                Byte<<=1;
                        }
        SCL=1;
        Delay();       
        SDA=1;       
        while((SDA==1)&&(k<1000))         //超时就不再等待应答
                {
                        k++;
                        Delay();
                }                                                 //等待SDA出现低电平,出现低电平就表示器件已经应答         
        SCL=0;
}
回复

使用道具 举报

6#
ID:844772 发表于 2022-3-15 15:12 | 只看该作者
SDA=High;      //你要先拉高,才知道是不是SLAVE 拉低的
SCL = High;
IIC_Delay();  // 这要加延时,等ACK,延时长短看手册
        if(SDA == High)
                return IIC_NG;
        else
                return IIC_OK;
回复

使用道具 举报

7#
ID:647804 发表于 2022-3-15 17:37 | 只看该作者
SDA和SDO脚的区别是什么
回复

使用道具 举报

8#
ID:647804 发表于 2022-3-15 17:38 | 只看该作者

SDA和SDO的区别是什么,二者是一样的吗
回复

使用道具 举报

9#
ID:1010470 发表于 2022-3-15 22:37 | 只看该作者
wolfinn 发表于 2022-3-15 06:52
IIC_SendByte(0xA0);
IIC_SendByte(0x00);
IIC_SendByte(0xab);

感谢,但我看了下代码里应该是加上了延时,阎石代码也是从例程里copy过来的
回复

使用道具 举报

10#
ID:1010470 发表于 2022-3-15 22:40 | 只看该作者
Y_G_G 发表于 2022-3-15 12:42
你的IIC写入之后没有把SDA拉高
本身就没有SDA拉高的代码,SDA怎么能拉高呢?
要有SDA=1;这个语句之后,才能 ...

多谢,但我现在的问题是IIC的SDA和SCL一旦拉低就无法再次拉高,我尝试在例程里直接运行I2C_Start()和I2C_Stop()函数,发现引脚能够正常的拉低后再拉高,至于后面的发送部分的代码我没有细琢磨,还望见谅
回复

使用道具 举报

11#
ID:1010470 发表于 2022-3-15 22:43 | 只看该作者
统一回复下,例程是参考朱有鹏老师的代码,代码如下(注:数码管的代码部分可能有所修改,各位可以参考LCD部分的代码)

16、EEPROM(24C02).rar

2.21 MB, 下载次数: 7

回复

使用道具 举报

12#
ID:1010470 发表于 2022-3-15 22:47 | 只看该作者
Y_G_G 发表于 2022-3-15 12:42
你的IIC写入之后没有把SDA拉高
本身就没有SDA拉高的代码,SDA怎么能拉高呢?
要有SDA=1;这个语句之后,才能 ...

您好,我目前的问题是SDA和SCL只要一拉低(I2C_Start()函数)就无法通过任何方法拉高,目前还没有考虑到发送和接收函数的问题,我在朱老师的例程中可以直接实现对这两个引脚的拉低再拉高,但自己的代码就是不行,对比了下也没发现个所以然
回复

使用道具 举报

13#
ID:1010470 发表于 2022-3-15 22:49 | 只看该作者
Y_G_G 发表于 2022-3-15 12:42
你的IIC写入之后没有把SDA拉高
本身就没有SDA拉高的代码,SDA怎么能拉高呢?
要有SDA=1;这个语句之后,才能 ...

至于Low这部分确实是我小题大做了,我的原意是想尽可能提高代码的可读性
回复

使用道具 举报

14#
ID:401564 发表于 2022-3-16 13:39 | 只看该作者
Xyy98715 发表于 2022-3-15 22:47
您好,我目前的问题是SDA和SCL只要一拉低(I2C_Start()函数)就无法通过任何方法拉高,目前还没有考虑到 ...

不明白你在说什么
想搞定问题,把电路和你的完整的代码上传
你这种描述,只能是猜
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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