1636|4

1234

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

RTC1302S与stm32模拟的IO口,显示正常 [复制链接]

本帖最后由 ywlzh 于 2016-4-20 13:03 编辑

这几天来了一个DS1302S,据说芯片是原装的,这下就激起了我的兴趣了
电路图:
  哎,不知道怎么滴,图片上传不了了。

看了一下DS1302S的技术资料,找些关键的地方吧

算了,图片传不了,时序图就不好说了直接给程序得了

先看几个引脚的定义吧,免得后面看了不懂
  1. #define ds1302clk GPIO_Pin_10
  2. #define ds1302dat GPIO_Pin_11
  3. #define ds1302rst GPIO_Pin_12
复制代码

然后是DS1302s的几个寄存器的地址也写入到数组中去
  1. uint8_t read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   //读秒、分、时、日、月、周、年的寄存器地址
  2. uint8_t write[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};  //写秒、分、时、日、月、周、年的寄存器地址
复制代码

此帖出自单片机论坛
点赞 关注(1)
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 

回复
举报

1234

帖子

4

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 ywlzh 于 2016-4-20 12:39 编辑

再是引脚的初始化
  1. /******************************************************
  2. 函数:void ds1302_GPIO_Configuration(void)
  3. 作用:配置RTC引脚,PC11必须为开漏模式,这样才是真正的双向口
  4. ******************************************************/
  5. void ds1302_GPIO_Configuration(void)
  6. {
  7.         GPIO_InitTypeDef GPIO_InitStruct;

  8.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  9.         GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst;
  10.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOC, &GPIO_InitStruct);

  12.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
  13.         GPIO_InitStruct.GPIO_Pin = ds1302dat;
  14.         GPIO_Init(GPIOC, &GPIO_InitStruct);        
  15. }
复制代码
再然后是写一个字节,这个程序可以参照技术资料中的时序图
  1. /******************************************************
  2. 函数:void write_1302byte(uint8_t dat)
  3. 作用:写一个字节的数据到RTC中
  4. ******************************************************/
  5. void write_1302byte(uint8_t dat)
  6. {
  7.     uint8_t i=0;
  8.     GPIO_ResetBits(GPIOC,ds1302clk);
  9.     delay_us(2);                     //延时大约2us
  10.     for(i=0;i<8;i++){
  11.          GPIO_ResetBits(GPIOC,ds1302clk);
  12.          if(dat&0x01)
  13.                GPIO_SetBits(GPIOC,ds1302dat);
  14.         else
  15.               GPIO_ResetBits(GPIOC,ds1302dat);
  16.        delay_us(2);
  17.        GPIO_SetBits(GPIOC,ds1302clk);
  18.        dat>>=1;
  19.        delay_us(1);
  20.    }       
  21. }
复制代码




此帖出自单片机论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

板凳
 
再是读一个字节数据,但要先写入地址,才可以读,这个也可以参考资料里的时序图
  1. /******************************************************
  2. 函数:uint8_t read_1302(uint8_t add)
  3. 作用:先写入地址,然后在读输出一个字节的数据
  4. ******************************************************/       
  5. uint8_t read_1302(uint8_t add)
  6. {
  7.         uint8_t i=0,dat1=0x00;
  8.         GPIO_ResetBits(GPIOC,ds1302rst);
  9.         GPIO_ResetBits(GPIOC,ds1302clk);
  10.         delay_us(3);//略微延时2us
  11.         GPIO_SetBits(GPIOC,ds1302rst);
  12.         delay_us(3);//时间要大约3us
  13.         write_1302byte(add);//先写寄存器的地址
  14.         for(i=0;i<8;i++){
  15.           GPIO_SetBits(GPIOC,ds1302clk);
  16.                 dat1>>=1;
  17.                 GPIO_ResetBits(GPIOC,ds1302clk);
  18.                 if(GPIO_ReadInputDataBit(GPIOC,ds1302dat)==1)  dat1=dat1|0x80;
  19.           }
  20.           delay_us(1);
  21.           GPIO_ResetBits(GPIOC,ds1302rst);
  22.           return dat1;
  23.         }
复制代码


此帖出自单片机论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

4
 
然后要向指定的地址写入数据,这样好校准时间
  1. /******************************************************
  2. 函数:void write_1302(uint8_t add,uint8_t dat)
  3. 作用:向指定的寄存器中写入一个数据
  4. ******************************************************/               
  5. void write_1302(uint8_t add,uint8_t dat)
  6. {
  7.         GPIO_ResetBits(GPIOC,ds1302rst);
  8.         GPIO_ResetBits(GPIOC,ds1302clk);
  9.         delay_us(1);//略微延时
  10.         GPIO_SetBits(GPIOC,ds1302rst);
  11.         delay_us(2);//时间大约2us
  12.         write_1302byte(add);
  13.         write_1302byte(dat);
  14.         GPIO_ResetBits(GPIOC,ds1302rst);
  15.         GPIO_ResetBits(GPIOC,ds1302clk);
  16.         delay_us(1);

  17. }
复制代码
这个动作就是时序图中一次的动作,先写地址,然后写数据。
此帖出自单片机论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

5
 
本帖最后由 ywlzh 于 2016-4-20 12:52 编辑

最后在这里总结一下:
   看时序图编出对应的程序,这个是需要锻炼的,慢慢来,切不可着急,我用的方法比较笨拙,采用的硬仿,如果大家有什么更好的办法可以说一下,RTC时钟做好了,可以将函数用USMART的方法,通过指令的形式从串口获得时间值,设置当前时间值。

  可惜图片传不了,无法看到效果图
此帖出自单片机论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表