|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)教,為什么DS1302工作不正常? |
| 作者:小羅納耳朵 欄目:技術(shù)交流 |
我用51單片機(jī)與DS1302時(shí)鐘芯片相連。仿真時(shí)DS1302電源VCC2電壓5V正常,VCC1接一個(gè)3V的紐扣電池。接地正常。三條線RST、SCLK、IO數(shù)據(jù)均正常。 DS1302讀寫子程序如下: void WrData(Uchar dd) //寫DS1302子程序 { Uchar i; DataTrans=dd; for(i=0;i<8;i++){ SCLK = 0; IO_DATA = BIT0; SCLK = 1; //SCLK上升沿寫入數(shù)據(jù) DataTrans = DataTrans>>1; } } Uchar RdData(void) //讀DS1302子程序 { Uchar i; for(i=0;i<8;i++){ DataTrans = DataTrans>>1; IO_DATA = 1; SCLK = 1; BIT7 = IO_DATA; SCLK = 0; //SCLK下降沿讀入數(shù)據(jù) } return DataTrans; } void Wr_DS1302 (Uchar addr,Uchar dd){ //將指令寫入DS1302對(duì)應(yīng)地址寄存器子程序 RST = 0; SCLK = 0; RST = 1; WrData(addr); Delayus(1); WrData(dd); RST = 0; IO_DATA = 1; } Uchar Rd_DS1302(Uchar addr){ //讀DS1302相應(yīng)地址寄存器子程序 Uchar DS_Data; RST = 0; SCLK = 0; RST = 1; WrData(addr); Delayus(1); DS_Data = RdData(); RST = 0; return DS_Data; } 在主程序中,先初始化DS1302: Wr_DS1302(0x8e,0x00); //允許寫入 Wr_DS1302(0x80,0x00); //啟動(dòng)時(shí)鐘 然后讀取相應(yīng)寄存器的值。但是讀出的數(shù)值均為0, 那位高手能指點(diǎn)一下啊,問(wèn)題出在可能出在什么地方? |
| 2樓: | >>參與討論 |
| 作者: 小羅納耳朵 于 2006/10/17 21:15:00 發(fā)布:
晶振也不起振 32.768K的晶振,帶2個(gè)10PF的電容,示波器測(cè)不到波形?是這的原因嗎? |
|
| 3樓: | >>參與討論 |
| 作者: zgl7903 于 2006/10/17 21:54:00 發(fā)布:
個(gè)人見(jiàn)解 可以先試者在DS1302的RAM里寫些數(shù)據(jù),讀出來(lái)后作比較,可以知道時(shí)序和操作周期上是否有問(wèn)題。然后再作RTC的操作 |
|
| 4樓: | >>參與討論 |
| 作者: rossi_lao 于 2006/10/17 23:56:00 發(fā)布:
re 1302接6p或12p電容,我試過(guò)不接電容都可以,時(shí)間挺準(zhǔn)的! |
|
| 5樓: | >>參與討論 |
| 作者: 小羅納耳朵 于 2006/10/18 8:47:00 發(fā)布:
試了試向寄存器寫數(shù)據(jù) 試了試向寄存器寫數(shù)據(jù),向0x80里面寫0x01,讀0x81卻是0x02,寫0x02,讀出0x04。是怎么回事。砍绦驎r(shí)序有問(wèn)題嗎? |
|
| 6樓: | >>參與討論 |
| 作者: nevea 于 2006/10/18 9:10:00 發(fā)布:
re 小羅納耳朵 發(fā)表于 2006-10-17 21:15 技術(shù)交流 ←返回版面 晶振也不起振 32.768K的晶振,帶2個(gè)10PF的電容,示波器測(cè)不到波形?是這的原因嗎? 晶振都不振,那肯定是不對(duì)的啊。你換成6PF的試一試...... |
|
| 7樓: | >>參與討論 |
| 作者: 小羅納耳朵 于 2006/10/18 10:44:00 發(fā)布:
讀寫正常了 讀寫正常了。但是寫進(jìn)秒寄存器一個(gè)值。再去讀還是那個(gè)值不變。是因?yàn)檫是沒(méi)有工作嗎?到底是怎么回事啊。手頭沒(méi)有6pF的電容,就把10PF的卸了。還是不行啊 |
|
| 8樓: | >>參與討論 |
| 作者: rossi_lao 于 2006/10/18 13:41:00 發(fā)布:
re 應(yīng)該是秒寄存器的啟動(dòng)位沒(méi)有置位! |
|
| 9樓: | >>參與討論 |
| 作者: 小羅納耳朵 于 2006/10/18 14:43:00 發(fā)布:
? 樓上的?秒寄存器啟動(dòng)位置位?應(yīng)該是清零才能啟動(dòng)吧? |
|
| 10樓: | >>參與討論 |
| 作者: szzhengjin 于 2006/10/18 16:54:00 發(fā)布:
說(shuō)說(shuō) 我用了很多,但不是我修機(jī)器,所以起振是否要程序控制我倒沒(méi)認(rèn)真去看 你的程序讀單字節(jié)錯(cuò)了,這里我提供完整源碼給你,你改一下IO就可以用了 ////========DS1302.H============= #ifndef __DS1302_H__ #define __DS1302_H__ #define RTC_OK 1 //操作成功 #define RTC_FAIL 0 //操作失敗 #define SECOND_INVALID 40 //秒值無(wú)效 #define MINUTE_INVALID 41 //分鐘值無(wú)效 #define HOUR_INVALID 42 //小時(shí)值無(wú)效 #define WEEK_INVALID 43 //星期值無(wú)效 #define DAY_INVALID 44 //日期值無(wú)效 #define MONTH_INVALID 45 //月份值無(wú)效 #define YEAR_INVALID 46 //年份值無(wú)效 #define CENTURY_INVALID 47 //世紀(jì)值無(wú)效 //時(shí)鐘制式參數(shù)定義(暫沒(méi)開啟,全用24小時(shí)制) #define MODE_12_HOUR 0x80 //12小時(shí)制,即有AM/PM #define MODE_24_HOUR 0x00 //24小時(shí)制 //充電參數(shù)定義 #define CHARGE_ENABLE 0xA0 //開啟充電,此時(shí),若限流電阻選擇SELECT_NONE,還是不能充電 #define CHARGE_DISABLE 0x00 //關(guān)閉充電 //充電二極管參數(shù) #define SELECT_ONE_DIODE 0x04 //選擇一個(gè)二極管 #define SELECT_TWO_DIODE 0x08 //選擇二個(gè)二極管 //充電限流電阻參數(shù) #define SELECT_NONE 0x00 //不用連,即斷開充電電路 #define SELECT_R1_2k 0x01 //選擇電阻1,2K #define SELECT_R2_4k 0x02 //選擇電阻2,4K #define SELECT_R3_8k 0x03 //選擇電阻3,8K #define RAM_MAXSIZE 31 //時(shí)鐘內(nèi)部用戶可自定義的RAM最大空間 typedef struct _DATETIME { unsigned CHAR Century; unsigned CHAR Year; unsigned CHAR Month; unsigned CHAR Day; unsigned CHAR Hour; unsigned CHAR Min; unsigned CHAR Sec; unsigned CHAR Week; }sttDateTime; //初始化時(shí)鐘 void InitDS1302(unsigned CHAR ChargeMode); //讀時(shí)鐘 void ReadClock(sttDateTime *pstDateTime); //寫時(shí)鐘 void WriteClock(sttDateTime *pstDateTime); //========DS1302.C================= #include <REG52.H> #include "DS1302.H" sbit RST = P1^5; sbit SCL = P1^6; sbit SDA = P1^7; #define SEC_ADDR 0x80 //1000 0000 #define MIN_ADDR 0x82 //1000 0010 #define HOUR_ADDR 0x84 //1000 0100 #define DAY_ADDR 0x86 //1000 0110 #define MOM_ADDR 0x88 //1000 1000 #define WEEK_ADDR 0x8A //1000 1010 #define YEAR_ADDR 0x8C //1000 1100 #define CENTURY_ADDR 0xC0 //1100 0000 用其RTC內(nèi)存一字節(jié)作為年世紀(jì)字節(jié) #define CONTROL_ADDR 0x8E //1000 1110 #define TRCH_ADDR 0x90 //1001 0000 #define RAM_BASE_ADDR 0xC0 #define READ 1 #define WRITE 0 void DS1302_SendByte(unsigned CHAR Data) { unsigned CHAR i; for(i=0;i<8;i++) { SCL = 0; SDA = (bit)(Data & 0x01); SCL = 1; Data >>= 1; } return; } unsigned CHAR DS1302_ReadByte(void) { unsigned CHAR i,Data; SDA = 1; for(i=0;i<8;i++) { Data >>= 1; SCL = 0; if(SDA==1) Data |= 0x80; SCL = 1; } return(Data); } void DS1302WriteByte(unsigned CHAR Addr, unsigned CHAR Data) { SCL = 0; RST = 1; DS1302_SendByte(Addr); DS1302_SendByte(Data); RST = 0; return ; } unsigned CHAR DS1302ReadByte(unsigned CHAR Addr) { unsigned CHAR Data; SCL = 0; RST = 1; DS1302_SendByte(Addr | READ); Data = DS1302_ReadByte(); RST = 0; return Data; } //初始化時(shí)鐘 void InitDS1302(unsigned CHAR ChargeMode) { unsigned CHAR i; SCL = 0; RST = 0; DS1302WriteByte(CONTROL_ADDR,0x00); //WP=0; i = DS1302ReadByte(SEC_ADDR); if((i & 0x80) == 0x80) { //若時(shí)鐘丟失,即鋰電池沒(méi)電時(shí),自動(dòng)復(fù)位為2005-1-1 00:00:00 星期六 DS1302WriteByte(CENTURY_ADDR,0x20); DS1302WriteByte(YEAR_ADDR,0x06); DS1302WriteByte(MOM_ADDR,0x01); DS1302WriteByte(DAY_ADDR,0x01);   |
|
| 11樓: | >>參與討論 |
| 作者: 小羅納耳朵 于 2006/10/19 20:02:00 發(fā)布:
謝謝! 已經(jīng)調(diào)通了,換個(gè)了芯片起振了。程序沒(méi)變。感謝樓上的! |
|
| 12樓: | >>參與討論 |
| 作者: hq_y 于 2006/10/20 22:39:00 發(fā)布:
2個(gè)電容一定要去掉,加上這2個(gè)電容有時(shí)候會(huì)不起振 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |