完善资料让更多小伙伴认识你,还能领取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也遇到了同样的问题,能分享下经验吗?
|
|
|
|
当时应该是时序问题,太久了,不记得了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
238 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
629 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
552 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
552 浏览 0 评论
1074 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11765 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 07:44 , Processed in 0.673335 second(s), Total 57, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号