欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機EEPROM的讀寫之間要不要延時一段時間 [打印本頁]

作者: PDDDF    時間: 2019-12-17 15:09
標題: 單片機EEPROM的讀寫之間要不要延時一段時間
最近寫一個需要保存參數的程序,IC用STC15W408AS,10個扇區都用到了,實測時經常出現數據丟失的現象,請問有沒有什么辦法可以保證數據的準確性
void key_handle()
{
        uchar t,e1,e2,limit;
        e1 = dcx(0x0020);
        e2 = dcx(0x0220);
         while(1)
         {
                 if(KEY_1 == 0)
                 {
                         Delay(2);
                         if(KEY_1 == 0)
                         {
                                 while(KEY_1 == 0);
                                 if(limit<++e1) e1 = 0;
                         }                         
                 }
                 
                 if(KEY_2 == 0)
                 {
                         Delay(2);
                         if(KEY_2 == 0)
                         {
                                 while(KEY_2 == 0);
                                 if(limit<--e1) e1 = limit;
                         }
                 }
                 display1(e1);
         }


uchar dcx(uint addr)
{
  uchar dat;
        IAP_CONTR = ENABLE_IAP;
        IAP_CMD = CMD_READ;
        IAP_ADDRL = addr;
        IAP_ADDRH = addr >> 8;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();
        _nop_();
        dat = IAP_DATA;
        Q0();
       
        return dat;
}

void cc(uint addr)
{
  IAP_CONTR = ENABLE_IAP;
        IAP_CMD = CMD_ERASE;
        IAP_ADDRL = addr;
        IAP_ADDRH = addr>>8;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();
        _nop_();
        Q0();
}

void xcx(uint addr,uchar dat)
{
  IAP_CONTR = ENABLE_IAP;
        IAP_CMD = CMD_PROGRAM;
        IAP_ADDRL = addr;
        IAP_ADDRH = addr>>8;
        IAP_DATA = dat;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();
        _nop_();
        Q0();
}

void Q0()
{
  IAP_CONTR = 0;
        IAP_CMD = 0;
        IAP_TRIG = 0;
        IAP_ADDRH = 0x80;
        IAP_ADDRL = 0;
}


大概就是按鍵設置參數然后保存這樣,連續對多個參數進行調整后保存會出現數據丟失或者數據錯誤 的情況,網上說在每次寫入后都校驗一次,不過在實際使用中不同參數的讀寫保存之間的操作間隔非常小,11.059的晶振不知道能不能在這樣極短的間隔內跑完這一系列的語句,不知道大佬們有沒有什么好的EEPROM讀寫過程可以分享分享,虛心請教,謝謝

作者: man1234567    時間: 2019-12-17 16:38
根據手冊來,除非手冊印錯了
作者: pcbboy    時間: 2019-12-17 17:23
你這個程序不完整看不了,按我的經驗不會出現數據丟失問題。
作者: wulin    時間: 2019-12-17 17:26
因為EEPROM有擦寫壽命的,所以不太適合用于頻繁適時擦寫。通常是把需要保存的數據放在緩存中,掉電時才寫入EEPROM保存,再次上電時讀取保存的數據。
STC單片機寫EEPROM是按扇區為單位,每個扇區512字節,寫之前要將整個扇區擦除,寫一個字節也得如此。
為了保證寫入的數據準確無誤可以每寫完一個地址的數據,立即讀取該地址的數據,并與寫數據比較判斷是否正確。如正確續寫下一個地址的數據,直至全部數據寫完。如果中途發現錯誤可以將整個扇區擦除從頭開始重寫。STC官方示例:



作者: PDDDF    時間: 2019-12-18 09:27
pcbboy 發表于 2019-12-17 17:23
你這個程序不完整看不了,按我的經驗不會出現數據丟失問題。

我補充一下吧,就是多了個保存數據和菜單循環共用的按鍵,按下執行把改變后得值存回原地址,這樣而已
補充:把這個if判斷放到while(1)里
if(KEY_SET == 0)
           {
                   Delay(2);
                   if(KEY_SET == 0)
                   {
                     while(KEY_SET == 0);
                     if(19<++q) q = 0;
                     cc(0x0020 & 0x0220);
                     if(IAP_CONTR == 0) xcx(0x0020,e1);
                     if(IAP_CONTR == 0) xcx(0x0220,e2);
                     return;
                   }
           }
作者: PDDDF    時間: 2019-12-18 09:34
測試的時候需要模擬一般使用情況時使用者對參數進行修改的場景,所以我就想把它做到某些情況下面對快速的讀寫操作仍然可以保證數據的準確性
作者: muzhi    時間: 2019-12-19 19:17
前一陣在壇子里逛看見前輩討論這個,24C02一頁的大小是8,所以寫入的時候每到8的倍數的時候要等5ms換頁 寫的時候要注意下,讀的時候可以一次性讀,換page寫的時候要等5ms




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1