搜索
bottom↓
回复: 30

DS 1302 读写异常

[复制链接]

出70入0汤圆

发表于 2017-1-15 08:34:36 | 显示全部楼层 |阅读模式
板子用的是STC 12C5A系列芯片, 用1302模块, 第一个手板,可以通过串口,通过上位机读写1302.

问题:1  第一个手板1302 没有用上拉,可以正常读写,引脚用的是推挽模式,(测试了一个多月了) 第二个板子读不出来,写不进去,加了上拉10K电阻也没有用,后将IO口改为开漏模式,可以读出,但还是写不了!

            1302 用什么IO模式是OK的?  与什么因素有关?两个手板的1302部分是用引线焊接的,会是这里的问题吗?

            
   
     1302 主程序:
//DS1302初始化函数
void ds1302_init(void)
{
        RST=0;                        //RST脚置低
        SCK=0;                        //SCK脚置低
}
//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
        uchar i;
        RST=1;                                        //启动DS1302总线       
        //写入目标地址:addr
        addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;      //产生时钟
                SCK=0;
                addr = addr >> 1;
                }       
        //写入数据:d
        for (i = 0; i < 8; i ++) {
                if (d & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;    //产生时钟
                SCK=0;
                d = d >> 1;
                }
        RST=0;                //停止DS1302总线
}

//从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr) {

        uchar i,temp;       
        RST=1;                                        //启动DS1302总线
        //写入目标地址:addr
        addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;
                SCK=0;
                addr = addr >> 1;
                }       
        //输出数据:temp
        for (i = 0; i < 8; i ++) {
                temp = temp >> 1;
                if (IO) {
                        temp |= 0x80;
                        }
                else {
                        temp &= 0x7F;
                        }
                SCK=1;
                SCK=0;
                }       
        RST=0;                                        //停止DS1302总线
        return temp;
}
//向DS302写入时钟数据
void ds1302_write_time(void)
{
        ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
        ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停时钟
        //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓流充电
        ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
        ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
        ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
        ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
        ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
        ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
        ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
        ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护     
}
//从DS302读出时钟数据
void ds1302_read_time(void)  
{
        time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
        time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
        time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
        time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
        time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
        time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
        time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周        
}

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-1-15 18:51:54 | 显示全部楼层
stc的芯片毛病就是多啊

出0入0汤圆

发表于 2017-1-15 18:55:15 | 显示全部楼层
为毛还在玩DS1302   玩 DS3231 嘛

1302 程序都烂大街了  

出110入26汤圆

发表于 2017-1-15 19:25:07 | 显示全部楼层
程序虽然烂大街,但没几个是按时序严格写的,尤其国产兼容的IC,操作时间比较长,调试起来更会生不如死,建议楼主对着ds码代码。

出70入0汤圆

 楼主| 发表于 2017-1-15 22:28:52 | 显示全部楼层
lxa0 发表于 2017-1-15 18:51
stc的芯片毛病就是多啊

关于芯片,有一个感触很深的:15F54 系列芯片,脱机烧录,都不知道有没有烧进去的,批量生产搞死人。另外两个系列的状态就很明确。15F54系列,居然有一个开关状态被冲过去的。整个程序就一个地方改变状态的注释掉后,居然跑两三分钟后,会冲过去了!感觉会不会是芯片问题!

出70入0汤圆

 楼主| 发表于 2017-1-15 22:30:08 | 显示全部楼层
kinoko 发表于 2017-1-15 19:25
程序虽然烂大街,但没几个是按时序严格写的,尤其国产兼容的IC,操作时间比较长,调试起来更会生不如死,建 ...

用STC官方的驱动,也不行!!

出25入84汤圆

发表于 2017-1-15 22:50:27 | 显示全部楼层
1-wire总线对时序要求很严格,你有没有用多线程? 要是用了 注意延时有没有问题

出0入96汤圆

发表于 2017-1-16 08:07:26 | 显示全部楼层
你的初始化部分呢?

出70入0汤圆

 楼主| 发表于 2017-1-16 10:02:09 | 显示全部楼层
gallle 发表于 2017-1-16 08:07
你的初始化部分呢?

顶头,第一行!IO口是用什么模式呢?感觉什么都不对!

出0入0汤圆

发表于 2017-1-16 19:44:33 | 显示全部楼层
STC就谁用谁知道,转其它品牌了

出70入0汤圆

 楼主| 发表于 2017-1-16 20:08:29 | 显示全部楼层
four_zhg 发表于 2017-1-16 19:44
STC就谁用谁知道,转其它品牌了

现像:把 RST与 IO引脚设置为 开漏 加10K上拉,可以读出时间,但写不进去!

出0入0汤圆

发表于 2017-1-16 20:29:53 | 显示全部楼层
你最好是用示波器或逻辑分析仪看一下引脚在写的时候的状态和时序是不是正确

出70入0汤圆

 楼主| 发表于 2017-1-17 15:09:51 | 显示全部楼层
four_zhg 发表于 2017-1-16 20:29
你最好是用示波器或逻辑分析仪看一下引脚在写的时候的状态和时序是不是正确 ...

不好意思, 几片1302 IC 当中有一个是不同批次的,原来10年旧的板子上的,这片可以用。新的几个都是淘宝买的,一个都用不了!! 想不起是有不同批的,又用的是不同款的STC芯片,一直都没有想到DS1302会这出这么多问题! 所以出现各种 奇奇怪怪的现象!!!!!


只能重新购买,再测试了!!!

出0入0汤圆

发表于 2017-1-17 18:54:03 | 显示全部楼层
liyo2012 发表于 2017-1-15 22:28
关于芯片,有一个感触很深的:15F54 系列芯片,脱机烧录,都不知道有没有烧进去的,批量生产搞死人。另外 ...

反正我是不用stc的
搞着玩还凑合
正经用还是得at的

出10入113汤圆

发表于 2017-1-15 08:34:37 | 显示全部楼层
这个可以确定是1302芯片的问题。

出10入113汤圆

发表于 2017-1-17 19:43:51 | 显示全部楼层
另外,你既然用来读写,肯定要配置成弱上拉的引脚状态,就是51单片机复位后的默认状态,配置成推挽低电平等于短路了,这都不懂吗?

出0入0汤圆

发表于 2017-2-4 00:28:40 | 显示全部楼层
你现在找到问题了吗?

出0入0汤圆

发表于 2017-2-4 09:15:13 | 显示全部楼层

SCK=1;    //产生时钟
                SCK=0;
为:
nop();
nop();
nop();
SCK=1;    //产生时钟
nop();
nop();
nop();
                SCK=0;
nop();
nop();

试试看

出5入10汤圆

发表于 2017-2-4 11:22:24 | 显示全部楼层
本帖最后由 chen849928055 于 2017-2-4 11:28 编辑

延时的时间满足了,IO的模式设置对了,一般没有你说的那些问题
另外加上拉10K电阻 ,IO口要设置为开漏模式

出70入0汤圆

 楼主| 发表于 2017-2-8 13:41:16 | 显示全部楼层
Percychiu 发表于 2017-2-4 00:28
你现在找到问题了吗?

换DS芯片试了两台可以!

出70入0汤圆

 楼主| 发表于 2017-2-8 13:42:17 | 显示全部楼层
chen849928055 发表于 2017-2-4 11:22
延时的时间满足了,IO的模式设置对了,一般没有你说的那些问题
另外加上拉10K电阻 ,IO口要设置为开漏模式 ...

初步换了芯片可以! 感觉就是芯片问题!

出0入0汤圆

发表于 2017-2-8 19:33:08 来自手机 | 显示全部楼层
要标准模式,加三个10K上拉,供应商要可靠

出70入0汤圆

 楼主| 发表于 2017-2-14 14:49:41 | 显示全部楼层
xiaobendan 发表于 2017-2-8 19:33
要标准模式,加三个10K上拉,供应商要可靠

现在有三种情况:

A: 淘宝上1.8带电池,带模块的,用不了!

B:实体供应商的,说是国产的,有几个日期修改不了,比如,13-15. (这个很鬼)

C:淘宝上,标称进口芯片的,5块一个的,没有什么问题,可以正常操作!

出0入0汤圆

发表于 2017-2-14 14:55:32 | 显示全部楼层
liyo2012 发表于 2017-2-14 14:49
现在有三种情况:

A: 淘宝上1.8带电池,带模块的,用不了!

我只用时间的,淘宝,一次一盘,好像2500片吧,价格好像六毛多吧

出70入0汤圆

 楼主| 发表于 2017-2-14 15:38:57 | 显示全部楼层
xiaobendan 发表于 2017-2-14 14:55
我只用时间的,淘宝,一次一盘,好像2500片吧,价格好像六毛多吧

能用吗?

出0入0汤圆

发表于 2017-2-14 20:01:15 来自手机 | 显示全部楼层
liyo2012 发表于 2017-2-14 15:38
能用吗?

用了两盘了,不良是有的,很少,千分之三左右吧,但是32768晶振的问题比较多,百分之五是有的,现象是起振频率很高,换一个就好了

出0入0汤圆

发表于 2017-2-15 14:31:18 | 显示全部楼层
ds1302所有的io口都要加上拉电阻,不加数据永远不对

出0入169汤圆

发表于 2017-2-15 17:23:28 | 显示全部楼层
淘宝上的坑货挺多,我之前用的比较少,每次50片左右的买,正常价格采购的,

有时候通信不上(这种情况比较少,但也算是常有的事)

有时候数据不对(比如13月2日,或者2月30日等,这个不太容易发现,要设置到前几天让它自己走才会发现问题)

有时候误差太大。

出70入0汤圆

 楼主| 发表于 2017-2-16 21:41:38 | 显示全部楼层
d__xin 发表于 2017-2-15 17:23
淘宝上的坑货挺多,我之前用的比较少,每次50片左右的买,正常价格采购的,

有时候通信不上(这种情况比较 ...

请问测试OK后,会不会再出现不行的?

出0入169汤圆

发表于 2017-2-17 08:30:45 | 显示全部楼层
liyo2012 发表于 2017-2-16 21:41
请问测试OK后,会不会再出现不行的?

会啊,只要在TB上零买就这样的,后来是从代理整盘采购才没出现问题了。国产大厂的也没问题。

出0入169汤圆

发表于 2017-2-17 08:34:35 | 显示全部楼层
liyo2012 发表于 2017-2-16 21:41
请问测试OK后,会不会再出现不行的?

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

本版积分规则

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

GMT+8, 2024-4-24 02:51

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

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