用的STM32控制DS1302做的实时时钟,能读出来时间,但写不进...
时间:10-02
整理:3721RD
点击:
能读不能写,为什么呀?求帮忙看一下代码
//DS1302.c程序
#include <1302.h>
void WriteByte1302(u16 addr,u16 dat) //void writeds1302_dat(u8 dat)
{
u8 i;
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X33333333; //控制三线作输出模式
GPIOA->ODR|=1<<5;//DS1302_SETCE();ce=1
delay(100);
addr=addr&0xFE;
for(i=0;i<8;i++)
{
GPIOA->ODR&=0XFFF7;//sclk=0
delay(100);
if(addr&0x01)
{
GPIOA->ODR|=1<<4; //io=dat&0x01;DS1302_SETIO();//io=1
}
else
GPIOA->ODR&=0XFFEF;//GPIOA->ODR&=0//io=0
delay(100);
GPIOA->ODR|=1<<3; //sclk=1;DS1302_SETSCK()
delay(100);
addr=addr>>1;
delay(100);
}
for(i=0;i<8;i++)
{
GPIOA->ODR&=0XFFF7;//GPIOA->ODR=0<<3 //GPIOA->ODR&=0<<3;//sclk=0;DS1302_CLRSCK()
delay(100);
if(dat&0x01)
{
GPIOA->ODR|=1<<4; //io=dat&0x01;DS1302_SETIO();//io=1
}
else
GPIOA->ODR&=0XFFEF;//GPIOA->ODR=0<<4;//DS1302_CLRIO()//io=0
delay(100);
dat=dat>>1;
GPIOA->ODR|=1<<3; //sclk=1
delay(100);
}
GPIOA->ODR&=0XFFDF;//DS1302_CLRCE(); //ce=0
}
/***********************/
void Write1302(u16 add,u8 dat)
{
u8 dat1,dat2,date,temp;
temp=dat;
dat1=temp/10; //BCD码转换
dat2=temp%10;
date=dat1*16+dat2;
WriteByte1302(0x8e,0x00); //关闭写保护
WriteByte1302(add,date);
WriteByte1302(0x8e,0x80);//打开写保护
//WriteByte1302(add);
//Write1Byte302(dat);
// GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;
// delay(100); //_nop_();
}
/***************************/
u16 ReadByte1302(u16 dat) 读时间字节函数
{
u16 i,temp,dat0,dat1,dat2;
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X33333333;
DS1302_CLRCE(); //res=0;
delay(100); //_nop_();
DS1302_CLRSCK();//sclk=0;
delay(100); //_nop_();
DS1302_SETCE(); //res=1;
delay(100); //_nop_();
for(i=0;i<8;i++)
{
DS1302_CLRIO();//GPIOA->ODR&=0//io=0
DS1302_CLRSCK(); //sclk=0;
if(dat&0x01)
DS1302_SETIO();//GPIOA->ODR|=1<<4; //io=1
dat=dat>>1;
DS1302_SETSCK();//GPIOA->ODR|=1<<3; //sclk=1;
}
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X00343000;
for(i=0;i<8;i++)
{
temp=temp>>1;
DS1302_CLRSCK(); //sclk=0;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))
temp=temp|0x80;
DS1302_SETSCK();//GPIOA->ODR|=1<<3; //sclk=1;
}
DS1302_CLRCE();//res=0;
delay(100); //_nop_();
dat1=temp/16;
dat2=temp%16; //数制转换
dat0=dat1*10+dat2;
return(dat0);
}
u16 Read1302(u16 addr) //读1302里时间
{
u16 dat;
dat=ReadByte1302(addr);
return dat;
}
void initial(void) //ds1302初始化函数
{
GPIOA->ODR&=0xffef; //GPIOA->ODR&=0<<4;rst=0;
GPIOA->ODR&=0xfff7; //GPIOA->ODR&=0<<3; //sclk=0;
WriteByte1302(WRITE_PROTECT,0x80);
}
//DS1302.c程序
#include <1302.h>
void WriteByte1302(u16 addr,u16 dat) //void writeds1302_dat(u8 dat)
{
u8 i;
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X33333333; //控制三线作输出模式
GPIOA->ODR|=1<<5;//DS1302_SETCE();ce=1
delay(100);
addr=addr&0xFE;
for(i=0;i<8;i++)
{
GPIOA->ODR&=0XFFF7;//sclk=0
delay(100);
if(addr&0x01)
{
GPIOA->ODR|=1<<4; //io=dat&0x01;DS1302_SETIO();//io=1
}
else
GPIOA->ODR&=0XFFEF;//GPIOA->ODR&=0//io=0
delay(100);
GPIOA->ODR|=1<<3; //sclk=1;DS1302_SETSCK()
delay(100);
addr=addr>>1;
delay(100);
}
for(i=0;i<8;i++)
{
GPIOA->ODR&=0XFFF7;//GPIOA->ODR=0<<3 //GPIOA->ODR&=0<<3;//sclk=0;DS1302_CLRSCK()
delay(100);
if(dat&0x01)
{
GPIOA->ODR|=1<<4; //io=dat&0x01;DS1302_SETIO();//io=1
}
else
GPIOA->ODR&=0XFFEF;//GPIOA->ODR=0<<4;//DS1302_CLRIO()//io=0
delay(100);
dat=dat>>1;
GPIOA->ODR|=1<<3; //sclk=1
delay(100);
}
GPIOA->ODR&=0XFFDF;//DS1302_CLRCE(); //ce=0
}
/***********************/
void Write1302(u16 add,u8 dat)
{
u8 dat1,dat2,date,temp;
temp=dat;
dat1=temp/10; //BCD码转换
dat2=temp%10;
date=dat1*16+dat2;
WriteByte1302(0x8e,0x00); //关闭写保护
WriteByte1302(add,date);
WriteByte1302(0x8e,0x80);//打开写保护
//WriteByte1302(add);
//Write1Byte302(dat);
// GPIOA->ODR&=0xffdf;//GPIOA->ODR&=0<<5; //res=0;
// delay(100); //_nop_();
}
/***************************/
u16 ReadByte1302(u16 dat) 读时间字节函数
{
u16 i,temp,dat0,dat1,dat2;
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X33333333;
DS1302_CLRCE(); //res=0;
delay(100); //_nop_();
DS1302_CLRSCK();//sclk=0;
delay(100); //_nop_();
DS1302_SETCE(); //res=1;
delay(100); //_nop_();
for(i=0;i<8;i++)
{
DS1302_CLRIO();//GPIOA->ODR&=0//io=0
DS1302_CLRSCK(); //sclk=0;
if(dat&0x01)
DS1302_SETIO();//GPIOA->ODR|=1<<4; //io=1
dat=dat>>1;
DS1302_SETSCK();//GPIOA->ODR|=1<<3; //sclk=1;
}
GPIOA->CRL&=0XFF000FFF;
GPIOA->CRL|=0X00343000;
for(i=0;i<8;i++)
{
temp=temp>>1;
DS1302_CLRSCK(); //sclk=0;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))
temp=temp|0x80;
DS1302_SETSCK();//GPIOA->ODR|=1<<3; //sclk=1;
}
DS1302_CLRCE();//res=0;
delay(100); //_nop_();
dat1=temp/16;
dat2=temp%16; //数制转换
dat0=dat1*10+dat2;
return(dat0);
}
u16 Read1302(u16 addr) //读1302里时间
{
u16 dat;
dat=ReadByte1302(addr);
return dat;
}
void initial(void) //ds1302初始化函数
{
GPIOA->ODR&=0xffef; //GPIOA->ODR&=0<<4;rst=0;
GPIOA->ODR&=0xfff7; //GPIOA->ODR&=0<<3; //sclk=0;
WriteByte1302(WRITE_PROTECT,0x80);
}
我记得1302.里面有个写保护位,为0时才可以写入,试试吧。
我已经打开了,WriteByte1302(0x8e,0x00); //关闭写DS1302保护
可能是程序没有写进去
实验室时,用51写过,当时有个问题,也是不知道什么原因,最后发现是延时函数的问题,貌似对延时要求很严格。既然你用STM32,可以用滴答定时器延时。你试试
还没有解决,
化成BCD吗,,,,,,,,,,
temp=dat;
dat1=temp/10; //BCD码转换
dat2=temp%10;
date=dat1*16+dat2;
有做对BCD码转换
小编 能不能为我们后生分享下经验啊?谢谢
小编,问题解决了吗?我用STM8S207也遇到了同样的问题,能分享下经验吗?
当时应该是时序问题,太久了,不记得了。