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

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

作者: PDDDF    時間: 2019-12-17 15:09
標題: 單片機EEPROM的讀寫之間要不要延時一段時間
最近寫一個需要保存參數(shù)的程序,IC用STC15W408AS,10個扇區(qū)都用到了,實測時經(jīng)常出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,請問有沒有什么辦法可以保證數(shù)據(jù)的準確性
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;
}


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

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



作者: PDDDF    時間: 2019-12-18 09:27
pcbboy 發(fā)表于 2019-12-17 17:23
你這個程序不完整看不了,按我的經(jīng)驗不會出現(xiàn)數(shù)據(jù)丟失問題。

我補充一下吧,就是多了個保存數(shù)據(jù)和菜單循環(huán)共用的按鍵,按下執(zhí)行把改變后得值存回原地址,這樣而已
補充:把這個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
測試的時候需要模擬一般使用情況時使用者對參數(shù)進行修改的場景,所以我就想把它做到某些情況下面對快速的讀寫操作仍然可以保證數(shù)據(jù)的準確性
作者: muzhi    時間: 2019-12-19 19:17
前一陣在壇子里逛看見前輩討論這個,24C02一頁的大小是8,所以寫入的時候每到8的倍數(shù)的時候要等5ms換頁 寫的時候要注意下,讀的時候可以一次性讀,換page寫的時候要等5ms




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