OpenEdv-开源电子网

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

DS1302模块驱动程序分享

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-4-21 13:22:18 | 显示全部楼层 |阅读模式
开发环境战舰开发板+MDK5.14+DS1302模块(马家小卖铺有卖)

代码特点及注意事项
1> 不需要使用延时函数
2> 不需要直接操作寄存器
3> 剥离出DATA转BCD及BCD转DATA功能代码
4> 按照原子的思路,利用DS1302上的RAM实现断电后上电不会重新初始化时间(由于即使是外部断电,也会使用电池,所以这里的RAM甚至可以理解为ROM)
5> 如果是使用充电电池(一定要注意),才可以开启涓流充电功能
附件为驱动源码+DS1302使用说明书,如果有问题,还请大神不惜赐教,谢谢~~~

DS1302.rar

1.87 KB, 下载次数: 1294

DS1302中文手册.rar

1.28 MB, 下载次数: 1122

电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-23 19:49:54 | 显示全部楼层
liuchang 发表于 2017-4-22 21:52
代码里写的很清楚,这个就不用回答;了吧

可以把你的主函数发一下吗??
回复 支持 1 反对 0

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-4-21 22:16:25 | 显示全部楼层
大神,膜拜
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-22 16:50:35 | 显示全部楼层
我问一下,你的IO是如何定义输入输出的?他的方向如何确定?
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-4-22 21:52:59 | 显示全部楼层
qing8548329 发表于 2017-4-22 16:50
我问一下,你的IO是如何定义输入输出的?他的方向如何确定?

代码里写的很清楚,这个就不用回答;了吧
电子爱好者
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-23 09:40:25 | 显示全部楼层
liuchang 发表于 2017-4-22 21:52
代码里写的很清楚,这个就不用回答;了吧

#define DAT_READ GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1),我想给问一下这个是如何定义的?为什么要这么定义?
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-23 10:11:52 | 显示全部楼层
qing8548329 发表于 2017-4-23 09:40
#define DAT_READ GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1),我想给问一下这个是如何定义的?为什么要这 ...

我用我的开发板做一下,显示这个错误,不知道是什么原因,我是第一次接触单片机,不要介意
回复 支持 反对

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-10-9
在线时间
12 小时
发表于 2017-7-1 00:59:51 | 显示全部楼层
果然有好料!
回复 支持 反对

使用道具 举报

9

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-4-26
在线时间
64 小时
发表于 2017-7-11 10:39:43 | 显示全部楼层
有没有完整的主函数。只是.c.h 看不懂一些程序的实际用法
以我资质之驽钝,当平心静气、循序渐进、稳扎稳打,不辜负他人勉励。
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-7-11 14:28:36 | 显示全部楼层
合六斗 发表于 2017-7-11 10:39
有没有完整的主函数。只是.c.h 看不懂一些程序的实际用法

只需要在main()中初始化调用下ds1302_init()即可.

当然, 只要已经完成了初始化, 你可以在后面任意地方去读取时间, 设置时间等

如果有说错的地方, 还请指教~~~
电子爱好者
回复 支持 反对

使用道具 举报

9

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-4-26
在线时间
64 小时
发表于 2017-7-11 15:27:32 | 显示全部楼层
liuchang 发表于 2017-7-11 14:28
只需要在main()中初始化调用下ds1302_init()即可.

当然, 只要已经完成了初始化, 你可以在后面任意地方 ...

您好,我就是再后面调用这一块不明白,您是怎么调用的?能给我看一下实例吗?
以我资质之驽钝,当平心静气、循序渐进、稳扎稳打,不辜负他人勉励。
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2016-10-12
在线时间
35 小时
发表于 2017-10-22 11:07:08 | 显示全部楼层
你好,请问马家小卖铺  是哪?
有整个工程的文件吗0-0
我这个ds1302模块不知道是不是好的
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-4-18
在线时间
2 小时
发表于 2018-4-18 16:38:01 | 显示全部楼层
本帖最后由 bolderman 于 2018-4-18 16:42 编辑

大兄弟,你的代码自己验证了吗?
还是写完了就贴上来了?
我用了你的代码根本跑不起来。
害死人呀。

第一个问题是你没依据手册上的时序加延时;
第二个问题是在读数据的时候,是下降沿读数据,并且应该先使data>>1右移,再使最高位置1: data |= 0x80;

修改后的代码如下:

[mw_shl_code=c,true]

void DS1302_WriteOneByte(uint8_t data)
{
        uint8_t index = 0;
        DAT_MODE_OUT();
        for(index=0; index<8; index++)
        {
          SCK_CLR;
        //DAT_MODE_OUT();
         if (data & 0x01) /* 上升沿写数据 */
        {
          DAT_SET;
        }
        else
        {
           DAT_CLR;
        }
         //tdc = 200ns, tcl = 1us
        delay_us(2);
        SCK_SET;
        //tcdh = 280ns, tch = 1us
       delay_us(2);
       data >>= 1;
        }
}


void DS1302_WriteByte(const uint8_t addr, const uint8_t data)
{
        RST_CLR;
        SCK_CLR;
        //tcwh = 4us
        delay_us(5);
        RST_SET;  
        //tcc = 4us
        delay_us(5);
        DS1302_WriteOneByte(addr);
        DS1302_WriteOneByte(data);
        //tcch = 240ns, tch = 1us
        //delay_us(1);
        RST_CLR;
        SCK_CLR;

}


uint8_t DS1302_ReadByte(const uint8_t addr)
{
        uint8_t index = 0, data = 0;
        
        RST_CLR;
        SCK_CLR;
        //tcwh = 4us
        delay_us(5);               
        RST_SET;
        //tcc = 4us
        delay_us(5);        
        DS1302_WriteOneByte(addr);
    DAT_MODE_IN();
        
        for(index=0; index<8; index++)
        {
                SCK_CLR;
        //SCK_SET;
                //tcdd = 800ns tcl = 1us
                delay_us(2);
                data >>= 1;
                if (DAT_READ == 1)   //下降沿读数据,不是上升沿
        {
                        data |= 0x80;
                }
                //data >>= 1;  //原来错误的地方被我注释了
                //SCK_CLR;
                SCK_SET;
                //tch = 1us
                delay_us(2);
        }
        SCK_CLR;
        RST_CLR;
        return data;
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

0

主题

56

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1641
金钱
1641
注册时间
2017-7-15
在线时间
216 小时
发表于 2018-4-19 20:19:31 | 显示全部楼层
bolderman 发表于 2018-4-18 16:38
大兄弟,你的代码自己验证了吗?
还是写完了就贴上来了?
我用了你的代码根本跑不起来。

能把你完整的代码发上来吗,我按照你说的改了,可以写入,但是无法读出。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-4-18
在线时间
2 小时
发表于 2018-4-20 13:43:53 | 显示全部楼层
妖孽11 发表于 2018-4-19 20:19
能把你完整的代码发上来吗,我按照你说的改了,可以写入,但是无法读出。

请下载附件。

DS1302.rar

2.09 KB, 下载次数: 276

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 21:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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