DS 1302 读写异常

2020-01-16 18:27发布

板子用的是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);                //周        
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
xiaobendan
1楼-- · 2020-01-19 23:00
liyo2012 发表于 2017-2-14 15:38
能用吗?

用了两盘了,不良是有的,很少,千分之三左右吧,但是32768晶振的问题比较多,百分之五是有的,现象是起振频率很高,换一个就好了
颜靖峰
2楼-- · 2020-01-20 01:01
ds1302所有的io口都要加上拉电阻,不加数据永远不对
d__xin
3楼-- · 2020-01-20 03:38
淘宝上的坑货挺多,我之前用的比较少,每次50片左右的买,正常价格采购的,

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

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

有时候误差太大。
liyo2012
4楼-- · 2020-01-20 06:21
 精彩回答 2  元偷偷看……
d__xin
5楼-- · 2020-01-20 10:13
liyo2012 发表于 2017-2-16 21:41
请问测试OK后,会不会再出现不行的?

会啊,只要在TB上零买就这样的,后来是从代理整盘采购才没出现问题了。国产大厂的也没问题。
d__xin
6楼-- · 2020-01-20 12:18
liyo2012 发表于 2017-2-16 21:41
请问测试OK后,会不会再出现不行的?

但国产的偶尔会有误差大的情况,一部分是晶振的问题,另一少部分是芯片问题。

一周热门 更多>