完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
能读不能写,为什么呀?求帮忙看一下代码
//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); } |
|
相关推荐
9个回答
|
|
我记得1302.里面有个写保护位,为0时才可以写入,试试吧。
|
|
|
|
|
|
|
|
实验室时,用51写过,当时有个问题,也是不知道什么原因,最后发现是延时函数的问题,貌似对延时要求很严格。既然你用STM32,可以用滴答定时器延时。你试试
|
|
|
|
还没有解决,
|
|
|
|
化成BCD吗,,,,,,,,,,
|
|
|
|
temp=dat; dat1=temp/10; //BCD码转换 dat2=temp%10; date=dat1*16+dat2; 有做对BCD码转换 |
|
|
|
楼主 能不能为我们后生分享下经验啊?谢谢
|
|
|
|
楼主,问题解决了吗?我用STM8S207也遇到了同样的问题,能分享下经验吗?
|
|
|
|
当时应该是时序问题,太久了,不记得了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
551 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
853 浏览 0 评论
2529 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2268 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1708 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5783 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 23:46 , Processed in 0.527441 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号