找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7435|回復(fù): 7
收起左側(cè)

關(guān)于DS1302不能正常寫入80+年的問題研究

[復(fù)制鏈接]
ID:70941 發(fā)表于 2014-12-23 01:39 | 顯示全部樓層 |閱讀模式
很早以前就遇到過這個(gè)問題,當(dāng)時(shí)沒有記,現(xiàn)有又遇到這個(gè)問題,果斷要記下。特發(fā)在51hei論壇,以后遇到的朋友可以作為參考。
psb5695.jpg

下面是有問題的程序:
void Write_Ds1302_Byte(unsigned char temp1)
{
unsigned char i;
for(i=0;i<8;i++) //循環(huán)8次 寫入數(shù)據(jù)
{
SCK=0;
SDA=temp1&0x01; //每次傳輸?shù)妥止?jié)
temp1>>=1; //右移一位
SCK=1;
}
}
Write_Ds1302_Byte(address); //寫入“讀”控制命令
for (i=0;i<8;i++) //循環(huán)8次 讀取數(shù)據(jù)
{
if(SDA)
temp|=0x80; //每次傳輸?shù)妥止?jié)
SCK=0;
temp>>=1; //右移一位
SCK=1;
_nop_();
}

    這個(gè)程序?qū)懲甑刂泛,SCL還是高電平就開始讀數(shù)據(jù),而顯然這時(shí)DS1302還沒有將數(shù)據(jù)準(zhǔn)備好,數(shù)據(jù)是在那個(gè)下降沿后才會(huì)有觸發(fā)的,那么第一個(gè)讀到的數(shù)據(jù)就是無效的數(shù)據(jù),依此類推,最高位的數(shù)據(jù)就會(huì)沒有捕捉到了,然而這個(gè)程序又有一個(gè)致命的錯(cuò)誤,就是這個(gè)程序的正確的思路應(yīng)該是讀取8次移位7次,那么這里卻是移位了8次,最后直接導(dǎo)致最先被讀到的無效位被移出去了,而真正有用的最高位沒有被讀到,這也就是為何這個(gè)程序也能夠在年不超過80年的時(shí)候沒有出現(xiàn)問題的原因了。因?yàn)?0的BCD碼的最高位是1,所以會(huì)出現(xiàn)問題,因?yàn)檫@個(gè)最高位就沒有被讀到。
這里說明幾點(diǎn)DS1302這個(gè)芯片是上升沿寫入數(shù)據(jù),下降沿觸發(fā)數(shù)據(jù)輸出,

   還有一個(gè)就是這種對(duì)于從機(jī)先發(fā)送數(shù)據(jù)低位的接收,如果用這位移位的方式,進(jìn)入for循環(huán)后一定是先移位再讀數(shù)據(jù)的方法,這樣第一次的移位就是無效的了,也就是能夠做到讀取8次但是只移位7次。因?yàn)榈谝淮巫x到的最低位的數(shù)據(jù)只需要移動(dòng)7次就可以移到最低位了。如果是寫數(shù)據(jù)的方式則剛好是相反的,必須要先將低位數(shù)據(jù)寫到數(shù)據(jù)線上,然后再移動(dòng),否則的話低位數(shù)據(jù)就會(huì)丟失了。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
凌南之楓 + 5 絕世好帖!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:71748 發(fā)表于 2015-1-6 20:22 | 顯示全部樓層
求解決辦法啊。。。。。
回復(fù)

使用道具 舉報(bào)

ID:92336 發(fā)表于 2015-10-13 14:09 | 顯示全部樓層
本帖最后由 rebosun 于 2015-10-13 14:11 編輯

/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
  unsigned char i,temp=0x00;
  RST=0;
_nop_();
  SCLK=0;
_nop_();
  RST=1;
_nop_();
  Write_Ds1302_Byte(address); //DS1302這個(gè)芯片是上升沿寫入數(shù)據(jù),下降沿觸發(fā)數(shù)據(jù)輸出,
  for (i=0;i<8;i++)   //循環(huán)8次 讀取數(shù)據(jù)
  { SCLK=0;  //DS1302這個(gè)芯片是下降沿觸發(fā)數(shù)據(jù)輸出,
                temp>>=1;   //右移一位  
   if(SDA2)temp|=0x80;   //每次傳輸?shù)妥止?jié)
  SCLK=1;
}
  RST=0;
_nop_();  //以下為DS1302復(fù)位的穩(wěn)定時(shí)間
  RST=0;
SCLK=0;
_nop_();
SCLK=1;
_nop_();
SDA2=0;
_nop_();
SDA2=1;
_nop_();
return (temp);   //返回
}
回復(fù)

使用道具 舉報(bào)

ID:33544 發(fā)表于 2017-6-26 21:23 | 顯示全部樓層
我也遇見了這個(gè)問題,只是都是小白無解
  
回復(fù)

使用道具 舉報(bào)

ID:445798 發(fā)表于 2018-12-14 16:34 | 顯示全部樓層
然而按樓主的法改了,還是不行。。。。
回復(fù)

使用道具 舉報(bào)

ID:96218 發(fā)表于 2018-12-14 22:23 | 顯示全部樓層
個(gè)人認(rèn)為還是晶振的問題
回復(fù)

使用道具 舉報(bào)

ID:7121 發(fā)表于 2018-12-23 12:43 | 顯示全部樓層
還是好好看看 DS1302 的時(shí)序圖吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表