最近在做仪器,之前用已有的芯片做了好几台,DS1302都能正常工作,然后DS1302新片片不够,在某宝上面的金牌卖家那买了国产的DS1302,然后不能正常工作,写不进去值,也读不出来。然后我又在另外一家金牌卖家那买(这个发货是给了两款DS1302的芯片,加上之前的一共买了三款DS1302),还是这种问题。安装后出现的问题也不一样。有的晶振不起震,有的起震了但不正常。同一块电路板,换成之前的有的芯片,立马正常工作,晶振用的是5pf的晶振,VBAT电池直接供电3.3到4.2V。三个IO全配置的推免输出,以前我自己有的DS1302就这样配置的,能正常工作。后面把CE改成开漏输出也不行,烧进去后我以前能正常工作的变得不正常了。
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);
}
此帖出自小平头技术问答
一周热门 更多>