搜索
bottom↓
回复: 2

诡异的现象:DS1302读字节函数

[复制链接]

出0入0汤圆

发表于 2014-6-13 16:55:55 | 显示全部楼层 |阅读模式
直接上代码——

  1. uint8_t DS1302ReadByte(void)
  2. {
  3.         uint8_t i,dat=0xXX;//uint8_t i,dat;
  4.        
  5.        
  6.         GPIO_SetBits(GPIOB,DS1302_SDA);
  7.         delay();
  8.         for(i=0;i<8;i++)
  9.         {
  10.                 dat>>=1;               
  11.                 if(GPIO_ReadInputDataBit(GPIOB,DS1302_SDA))
  12.                 {
  13.                         dat|=0x80;
  14.                 }
  15.                 GPIO_SetBits(GPIOB,DS1302_SCLK);
  16.                 delay();
  17.                 GPIO_ResetBits(GPIOB,DS1302_SCLK);
  18.                 delay();
  19.         }
  20.         return dat;
  21. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-6-13 16:58:02 | 显示全部楼层
本帖最后由 prince2010 于 2014-6-13 19:06 编辑

现象:第3行,把注释代码代替前面的代码就会出问题,而0xXX表示任何值都可以。如果dat没有初始化,那么秒寄存器的读数是错误的,有时干脆不走了,而其他寄存器读数没有问题。

补充说明:调用时采用的是突发模式——

  1. void read_time(void)
  2. {
  3.         GPIO_ResetBits(GPIOD,DS1302_RST);
  4.         GPIO_ResetBits(GPIOB,DS1302_SCLK);
  5.         GPIO_SetBits(GPIOD,DS1302_RST);
  6.        
  7.         DS1302WriteByte(0xBF);//突发读模式,避免读寄存器时因进位带来的读数错误

  8.         ds1302_time[2]=spilittochar(DS1302ReadByte());        //秒寄存器
  9.         ds1302_time[1]=spilittochar(DS1302ReadByte());        //分寄存器
  10.         ds1302_time[0]=spilittochar(DS1302ReadByte());        //时寄存器
  11.         ds1302_date[2]=spilittochar(DS1302ReadByte());        //日寄存器
  12.         ds1302_date[1]=spilittochar(DS1302ReadByte());        //月寄存器
  13.         DS1302ReadByte();                                        //周寄存器
  14.         ds1302_date[0]=spilittochar(DS1302ReadByte());        //年寄存器
  15.         DS1302ReadByte();                                        //写保护寄存器
  16.        
  17.         GPIO_SetBits(GPIOB,DS1302_SCLK);
  18.         GPIO_ResetBits(GPIOD,DS1302_RST);
  19. }
复制代码








出0入0汤圆

 楼主| 发表于 2014-6-16 10:45:38 | 显示全部楼层
唉,星期五下班时发帖确实不是时候,自己顶一下先。

说一下目前进展——

单步调试发现,如果dat不赋初值,那么在第一次进入for循环的时候执行dat>>=1;  语句之后,最左侧居然补1

哪位朋友指导一下,怎么会发生这种情况?

以下摘自《C程序设计语言(第2版 新版)》——

本帖子中包含更多资源

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

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-29 04:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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