OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7829|回复: 5

DS1302模块 无法正常使用

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-8-21
在线时间
15 小时
发表于 2017-9-2 21:40:03 | 显示全部楼层 |阅读模式
1金钱
DS1302 新买的模块  以前的程序调用无法正常计时...
源程序可以使用,不知道是不是模块的问题...
现在的情况如下...



  • #include "includes.h"
  • /*************************************
  • 函数名:DS1302_IO_init()
  • 函数参数:无
  • 函数返回值:无
  • 函数功能:
  • 函数描述:
  • CLK   PD6
  • DAT   PD7
  • RST   PG15
  • **************************************/
  • void RST_out(void)
  • {
  •                 //打开外设时钟
  •         RCC->AHB1ENR |=(1<<6);
  •                 /**PG15配置为推挽模式**/
  •         //端口模式寄存器
  •         GPIOG->MODER &=~(0x3ul<<30);  //清零
  •         GPIOG->MODER |=(1ul<<30);     //配置为通用输出模式
  •         //输出类型
  •         GPIOG->OTYPER &=~(1<<15);   //推挽输出
  •         //输出速率
  •         GPIOG->OSPEEDR &=~(0x3ul<<30); //清零
  •         GPIOG->OSPEEDR |=(0x2ul<<30); //输出速率50M
  •         //上下拉
  •         GPIOG->UPDR &=~(0x3ul<<30);  //清零
  •         GPIOG->UPDR |=1ul<<30;
  • }
  • void CLK_out(void)
  • {
  •         //打开外设时钟
  •         RCC->AHB1ENR |=(1<<3);
  •         /**PD6配置为推挽模式**/
  •         //端口模式寄存器
  •         GPIOD->MODER &=~(0x3<<12);  //清零
  •         GPIOD->MODER |=(1<<12);     //配置为通用输出模式
  •         //输出类型
  •         GPIOD->OTYPER &=~(1<<6);   //推挽输出
  •         //输出速率
  •         GPIOD->OSPEEDR &=~(0x3<<12); //清零
  •         GPIOD->OSPEEDR |=(0x2<<12); //输出速率50M
  •         //上下拉
  •         GPIOD->UPDR &=~(0x3<<12);  //清零
  •         GPIOD->UPDR |=1ul<<12;
  •        
  • }
  • void SDA_out(void)
  • {
  •         //打开外设时钟
  •         RCC->AHB1ENR |=(1<<3);
  •         /**PD7配置为推挽模式**/
  •         //端口模式寄存器
  •         GPIOD->MODER &=~(0x3<<14);  //清零
  •         GPIOD->MODER |=(1<<14);     //配置为通用输出模式
  •         //输出类型
  •         GPIOD->OTYPER &=~(1<<7);   //推挽输出
  •         //输出速率
  •         GPIOD->OSPEEDR &=~(0x3<<14); //清零
  •         GPIOD->OSPEEDR |=(0x2<<14); //输出速率50M
  •         //上下拉
  •         GPIOD->UPDR &=~(0x3<<14);  //清零       
  •         GPIOD->UPDR |=1ul<<14;
  • }
  • void SDA_int(void)
  • {
  •         //打开外设时钟
  •         RCC->AHB1ENR |=(1<<3);
  •         //端口模式寄存器
  •         GPIOD->MODER &=~(0x3<<14);  //清零
  •         //上下拉
  •         GPIOD->UPDR &=~(0x3<<14);  //清零       
  • }
  • /************************************************
  • *名称S1302Read()
  • *说明: 先写地址,后读数据
  • *功能: 从cmd相应地址中读取一个字节的数据
  • *调用S1302WriteByte(),DS1302ReadByte()
  • *输入:cmd:要写入的控制字节
  • *输出:dat:读取的数据
  • *************************************************/
  • u8 DS1302_Read(u8 cmd)
  • {
  •         u8 dat;
  •         RST_out();
  •         CLK_out();
  •         RSTL;//初始CE线置为0
  •         SCLKL;//初始时钟线置为0
  •         RSTH;//初始CE置为1,传输开始
  •         DS1302_WriteByte(cmd);//传输命令字,要读取的时间/日历地址
  •         dat=DS1302_ReadByte();//读取要得到的时间/日期
  •         SCLKH;//时钟线拉高
  •         RSTL;//读取结束, CE置为0,结束数据的传输
  •         return dat;//返回得到的时间/日期
  • }
  • /************************************************
  • *名称S1302Write
  • *说明: 先写地址,后写数据
  • *功能: 向cmd相应地址中写一个字节的数据
  • *调用S1302WriteByte()
  • *输入:cmd:要写入的控制字,dat:要写入的数据
  • *输出: 无
  • *************************************************/
  • void DS1302_Write(u8 cmd,u8 dat)
  • {
  •         RST_out();
  •         CLK_out();
  •         RSTL;//初始CE线置为0
  •         SCLKL;//初始时钟线置为0
  •         RSTH;//初始CE置为1,传输开始
  •         Delay_us(2);
  •         DS1302_WriteByte(cmd);//传输命令字,要写入的时间/日历地址
  •         DS1302_WriteByte(dat);//写入要修改的时间/日期
  •         SCLKH;//时钟线拉高
  •         RSTL;//读取结束, CE置为0,结束数据的传输
  • }
  • /************************************************
  • *名称S1302WriteByte
  • *说明: 无
  • *功能: 写入8bit数据
  • *调用:delayus()
  • *输入:dat:要写入的数据
  • *输出: 无
  • *************************************************/
  • void DS1302_WriteByte(u8 dat)
  • {
  •         u8 i;
  •         SDA_out();
  •         CLK_out();
  •         SCLKL;
  •         Delay_us(2);
  •         for(i=0;i<8;i++)
  •         {
  •                
  •           if((dat&(0x01<<i))) //注意DS1302的数据和地址都是从最低位开始传输的
  •                 {
  •             SDAH;
  •                 }
  •                 else
  •                 {
  •                         SDAL;
  •                 }
  •                 Delay_us(2);
  •                 SCLKH;
  •                 Delay_us(2);
  •                 SCLKL;
  •           
  •         }
  •          
  • }
  • /************************************************
  • *名称S1302ReadByte()
  • *说明: 无
  • *功能: 读取8bit的数据
  • *调用:delayus()
  • *输入: 无
  • *输出:dat:读取的数据
  • *************************************************/
  • u8 DS1302_ReadByte(void)
  • {
  •         u8 i,dat=0;
  •         SDA_int();
  •         CLK_out();
  •         Delay_us(2);
  •         for(i=0;i<8;i++)
  •         {
  •                
  •                 if((GPIOD->IDR&(1<<7)))
  •                 {
  •                         dat|=0x01<<i;
  •           }
  •                 else
  •           {
  •                    dat&=~(0x01<<i);
  •           }
  •                 SCLKH;
  •                 Delay_us(2);
  •                 SCLKL;
  •                 Delay_us(2);
  •                 }
  •         return dat;
  • }
  • /************************************************
  • *名称:void DS1302_init(void)
  • *说明: 给1302写入一个初始的值
  • *功能: 写入日期,和时钟的值
  • *调用S1302Write()
  • *输入: 无
  • *输出: 无
  • *************************************************/
  • void DS1302_init(void)
  • {
  •         DS1302_Write(0x8e,0x00);//写保护关
  •         DS1302_Write(DS1302_SECOND_WRITE,0x00);
  •         DS1302_Write(DS1302_MINUTE_WRITE,0x30);
  •         DS1302_Write(DS1302_HOUR_WRITE,0x10);
  •         DS1302_Write(DS1302_WEEK_WRITE,0x03);
  •         DS1302_Write(DS1302_DAY_WRITE,0x18);
  •         DS1302_Write(DS1302_MONTH_WRITE,0x08);
  •         DS1302_Write(DS1302_YEAR_WRITE,0x17);
  •         DS1302_Write(0x90,0x01); //充电
  •         DS1302_Write(0xc0,0xf0); //初始化一次标示
  •         DS1302_Write(0x8e,0x80);
  • }
  • /************************************************
  • 函数名:DisplayTime(void)
  • 函数参数:无
  • 函数返回值:无
  • 函数功能:
  • 函数描述:
  • *************************************************/
  • void DisplayTime(void)
  • {
  • //        u8 str1[20];
  • //        u8 str2[20];
  • //        u8 str3[20];
  •         u8 year,month,day,hour,minute,second,week;
  •         u8 temp_year,temp_month,temp_day,temp_hour,temp_minute,temp_second;
  •         //LCD_Init();
  •         while(1)
  •         {
  •          
  •   temp_year=DS1302_Read(DS1302_YEAR_READ);
  •         temp_month=DS1302_Read(DS1302_MONTH_READ);
  •         temp_day=DS1302_Read(DS1302_DAY_READ);
  •   temp_hour=DS1302_Read(DS1302_HOUR_READ);
  •         temp_minute=DS1302_Read(DS1302_MINUTE_READ );
  •         temp_second=DS1302_Read(DS1302_SECOND_READ);
  •         week=DS1302_Read(DS1302_WEEK_READ);       
  •         year=(temp_year/16)*10+temp_year%16;
  •   month=(temp_month/16)*10+temp_month%16;
  •   day=(temp_day/16)*10+temp_day%16;
  •   hour=(temp_hour/16)*10+temp_hour%16;
  •   minute=(temp_minute/16)*10+temp_minute%16;               
  •         second=        (temp_second/16)*10+temp_second%16;               
  • //        sprintf((char*)str1,"20%02d年%02d月%02d日",year,month,day);
  • //        sprintf((char*)str2,"%02d:%02d:%02d",hour,(char)minute,second);       
  • //        sprintf((char*)str3,"星期%d",(char)week);
  •         printf("20%02d年%02d月%02d日\r\n",year,month,day);
  •         printf("%02d:%02d:%02d\r\n",hour,(char)minute,second);
  • //  LCD_Disstring(48,0,RED,WHITE,str1);
  • //        LCD_Disstring(80,32,RED,WHITE,str2);
  •        
  •   }
  • }




  • #ifndef DS1302_H
  • #define DS1302_H
  • #include "stm32f4xx.h"
  • #define RSTL GPIOG->ODR&=~(1<<15)
  • #define RSTH GPIOG->ODR|=(1<<15)
  • #define SCLKL GPIOD->ODR&=~(1<<6)
  • #define SCLKH GPIOD->ODR|=(1<<6)
  • #define SDAL  GPIOD->ODR&=~(1<<7)
  • #define SDAH  GPIOD->ODR|=(1<<7)
  • #define DS1302_SECOND_WRITE  0x80         
  • #define        DS1302_MINUTE_WRITE  0x82
  • #define        DS1302_HOUR_WRITE    0x84
  • #define        DS1302_DAY_WRITE     0x86
  • #define        DS1302_MONTH_WRITE   0x88
  • #define        DS1302_YEAR_WRITE    0x8C
  • #define        DS1302_WEEK_WRITE    0X8A
  • #define DS1302_SECOND_READ  0x81         
  • #define        DS1302_MINUTE_READ   0x83
  • #define        DS1302_HOUR_READ     0x85
  • #define        DS1302_DAY_READ     0x87
  • #define        DS1302_MONTH_READ    0x89
  • #define        DS1302_YEAR_READ    0x8D
  • #define        DS1302_WEEK_READ     0X8B
  • void RST_out(void);
  • void CLK_out(void);
  • void SDA_out(void);
  • void SDA_int(void);
  • u8 DS1302_Read(u8 cmd);
  • void DS1302_Write(u8 cmd,u8 dat);
  • void DS1302_WriteByte(u8 dat);
  • u8 DS1302_ReadByte(void);
  • void DS1302_init(void);
  • void DisplayTime(void);
  • #endif




  • int main()
  • {
  •         DS1302_init();
  •         USART1_init(9600);
  •         DisplayTime();
  • }



QQ截图20170902213637.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-5-11
在线时间
62 小时
发表于 2019-8-14 18:47:22 | 显示全部楼层
楼主问题解决了吗?我也遇到和你相同的问题 QQ图片20190814173200.png
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2019-10-20
在线时间
15 小时
发表于 2019-10-24 22:35:46 | 显示全部楼层
806034232 发表于 2019-8-14 18:47
楼主问题解决了吗?我也遇到和你相同的问题

请问你解决了吗?我也遇到这种情况了
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2019-10-20
在线时间
15 小时
发表于 2019-10-24 22:37:02 | 显示全部楼层
806034232 发表于 2019-8-14 18:47
楼主问题解决了吗?我也遇到和你相同的问题

你好,请问这个问题你解决了吗?我也遇到同样的了
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2019-10-20
在线时间
15 小时
发表于 2019-10-24 22:38:20 | 显示全部楼层
你好,请问这个问题你解决了吗?我也遇到同样的问题了
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-4-15
在线时间
3 小时
发表于 2021-5-20 23:16:37 | 显示全部楼层
我也遇到了同样的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 20:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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