普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1419|回复: 5

请教大佬关于ds1302读一个字节的问题

[复制链接]

2

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2023-7-31 19:44:58 | 显示全部楼层 |阅读模式
本帖最后由 ikura 于 2023-7-31 19:48 编辑

先写一下我自己读一个字节的函数
sbit rtc_io = P3 ^ 4;
sbit rtc_ce = P3 ^ 5;
sbit rtc_sclk = P3 ^ 6;


static unsigned char rtc_read_byte(unsigned char cw)
{
        unsigned char cnt = 0;
        unsigned char byte = 0x00;
        unsigned char tmp;
       
        rtc_ce = 1;
       
        for (cnt = 0; cnt < 8; ++cnt) {
                rtc_io = !!(cw & 0x01 << cnt);
                rtc_sclk = 1;
                _nop_();
                rtc_sclk = 0;
        }

        cnt ^= cnt;
       
        do {
                byte |= (tmp = rtc_io) ? tmp << cnt : 0;
                rtc_sclk = 1;
                _nop_();
                rtc_sclk = 0;
        } while (++cnt < 8);
       
        rtc_ce = 0;
        rtc_io = 0;  //这里不懂
        return byte;
}


如上代码,当我把函数返回前的那句rtc_io = 0注释掉之后,读取的时间就是乱的,但是加上了就正常了。
这里实在不明白为什么最后一定要把io口电平拉低,查看ds1302的手册和时序图,并没有看到相关的讲解,实在是弄不清原因了,还希望大佬能帮我解答一下,多谢啦

回复

使用道具 举报

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-8-1 11:13:30 | 显示全部楼层
本帖最后由 zhong_zhiqi 于 2023-8-1 11:16 编辑

你用的是普中A2-A4系列的实验板吗?

在官方视频P180的14:00开始和18:30处都讲到了在读字节后,由于实验板P3.4没有接上拉电阻,所以需要对这个IO口添加几行语句将IO口先置0再置1。不过讲师在这里并没有将原因讲透彻,查了查网上资料,感觉是与51芯片内部的电路设计有关,没有想通的一点就是读取在前,IO管脚的状态都已经保存好了,后面的动作应该不会产生影响才对,看看大家有什么想法?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

2

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
 楼主| 发表于 2023-8-1 12:27:46 | 显示全部楼层
zhong_zhiqi 发表于 2023-8-1 11:13
你用的是普中A2-A4系列的实验板吗?

在官方视频P180的14:00开始和18:30处都讲到了在读字节后,由于实验 ...

您好,那个视频我也看了,我就是不明白为什么这个上拉电阻会有这种影响,而且将io电平拉低为什么可以解决这个问题。
还有个问题想请教您,这个上拉电阻是io内部的弱上拉电阻还是在io口外面又弄一个上拉电阻?如果是内部电阻,那P34就不是准双向口了,它就成了推挽输出了,无法做输入啊,如果是外面接的上拉,那么这个上拉的作用是什么呢?
回复 支持 反对

使用道具 举报

2

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
 楼主| 发表于 2023-8-3 11:28:08 | 显示全部楼层
自己顶一下
回复 支持 反对

使用道具 举报

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-8-5 10:22:15 | 显示全部楼层
本帖最后由 zhong_zhiqi 于 2023-8-5 10:30 编辑
ikura 发表于 2023-8-1 12:27
您好,那个视频我也看了,我就是不明白为什么这个上拉电阻会有这种影响,而且将io电平拉低为什么可以解决 ...

我从查找到的资料看,讲师说的上拉电阻是指接口外的电阻,就是我上个帖子里电路图上P3.3和P3.5接的电阻,而不是指内部电路的,资料显示内部电路是三组晶体管( https://www.cnblogs.com/QQ2962269558/p/12883718.html ),而且从查到的材料看这个外部的上拉电阻的作用就是杜绝了该接口处于“悬空”状态,当一个引脚处于“悬空”状态时,"读"引脚是可能出错的,如果P3.4和P3.3、P3.5一样有上拉电阻的话,则可以明确的确定高、低电平。很多文章或视频在这个地方都说的很含糊,再查查看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

2

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
 楼主| 发表于 2023-8-10 16:23:28 | 显示全部楼层
zhong_zhiqi 发表于 2023-8-5 10:22
我从查找到的资料看,讲师说的上拉电阻是指接口外的电阻,就是我上个帖子里电路图上P3.3和P3.5接的电阻, ...

    您好,我看芯片手册上说,p3属于准双向口,内部是有弱上拉电阻的,既然有内部上拉我认为p3应该不是默认悬空的,p0是开漏的,对于它来说外部上拉电阻应该是为了把它钳位在高电平。
    我这两天也看了很多资料,我猜测,这些外部强上拉电阻是为了增强稳定性的,因为弱上拉很容易被干扰。
    对于ds1302的读,开始读时p34输出一定是高电平,而读完后继续读时,p34仍然要输出高电平(因为读的命令字lsb一定是1),这就导致p34读完后由于弱上拉容易被干扰,那么后续输出时的高电平不稳定,导致错误。
    解决办法是,要不就先把电平拉低(p34是强下拉),要不在外部接一个强上拉,总之要让输出稳定,就不会出错了。当然这都是猜测,真实情况如何就需要大佬帮忙解答了。

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-5 23:24 , Processed in 0.101525 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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