请教大佬,关于DS1302的问题

2019-03-24 16:56发布

最近在做仪器,之前用已有的芯片做了好几台,DS1302都能正常工作,然后DS1302新片片不够,在某宝上面的金牌卖家那买了国产的DS1302,然后不能正常工作,写不进去值,也读不出来。然后我又在另外一家金牌卖家那买(这个发货是给了两款DS1302的芯片,加上之前的一共买了三款DS1302),还是这种问题。安装后出现的问题也不一样。有的晶振不起震,有的起震了但不正常。同一块电路板,换成之前的有的芯片,立马正常工作,晶振用的是5pf的晶振,VBAT电池直接供电3.3到4.2V。三个IO全配置的推免输出,以前我自己有的DS1302就这样配置的,能正常工作。后面把CE改成开漏输出也不行,烧进去后我以前能正常工作的变得不正常了。 QQ截图20181213104002.png
uchar code write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //
uchar code read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};    //

//BCD转16进制
void BCDtoHex(uchar *pBuff,uchar len) //BCDÂë×aÎaê®áù½øÖÆ
{
uchar i,temp;
for(i = 0;i < len;i ++)
{
temp =pBuff / 16;
pBuff = temp * 10 + pBuff % 16;
}
}

//读时间//
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)                    
   Time[n] = Ds1302Read(read_addr[n]);        //1,2,3,4,6       
   BCDtoHex(Time,7);
}
//写字节
void Ds1302Write(uchar addr, uchar dat)
{
        uchar n;
        CE = 0;
        _nop_();
        Sclk = 0;
        _nop_();
        CE = 1;
        _nop_();

        for (n=0; n<8; n++)
        {
                DSIO = addr & 0x01;
                addr >>= 1;
                Sclk = 1;
                _nop_();
                Sclk = 0;
                _nop_();
        }
        for (n=0; n<8; n++)
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                Sclk = 1;
                _nop_();
                Sclk = 0;
                _nop_();       
        }                         
        CE = 0;
        _nop_();
}

//写时间
void Ds1302WriteTime()
{
  uchar n;
  CE=0;
  Sclk=0;
  Ds1302Write(0x8E,0x00);               
  for(n=0; n<7; n++)            
        Ds1302Write(write_addr[n],Time[n]);       
  Ds1302Write(0x8E,0x80);               
}

//读字节
uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        CE = 0;
        _nop_();

        Sclk = 0;
        _nop_();
        CE = 1;
        _nop_();

        for(n=0; n<8; n++)
        {
                DSIO = addr & 0x01;
                addr >>= 1;
                Sclk = 1;
                _nop_();
                Sclk = 0;
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)
        {
                dat1 = DSIO;
                dat = (dat>>1) | (dat1<<7);
                Sclk = 1;
                _nop_();
                Sclk = 0;
                _nop_();
        }

        CE = 0;
        _nop_();       
        Sclk = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}
//初始化
void Initial_DS1302(void)
{
CE = 0;
CE = 1;      
Ds1302Write(0x8E,0x00);
Ds1302Write(0x90,0xA5);
Ds1302Write(0x80,0x00);
Ds1302Write(0x8E,0x80);
}



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。