標(biāo)題: 關(guān)于STC單片機EEPROM讀寫操作誤區(qū) [打印本頁]

作者: 明記冷氣    時間: 2023-1-10 03:45
標(biāo)題: 關(guān)于STC單片機EEPROM讀寫操作誤區(qū)
最近在使用STC EEPROM時 踩了個坑   
寫入的數(shù)據(jù)  取出來 值不一樣  查看STC手冊時才發(fā)現(xiàn)
EEPROM 只能1寫成0 不能0 寫成1


正常需要寫數(shù)據(jù)到EEPROM需要 先擦除數(shù)據(jù)整扇區(qū)512字節(jié)
再寫入 數(shù)據(jù)才是正常的
那么扇區(qū)內(nèi)的其他數(shù)據(jù)不是也同時被擦除拉
要保留扇區(qū)內(nèi)其他數(shù)據(jù)  只能線讀出來 修改好后再寫入整個扇區(qū)
STC 官方提供的例程 只有 讀 N個字節(jié),寫N個字節(jié) , 擦除 三個基本操作
所以只能自己寫一個功能函數(shù)了
下面的就是根據(jù)官網(wǎng)的讀寫例程 湊合寫的
已經(jīng)測通過試過
希望可以給大家借鑒,如果有更高效的寫法 可以分享出來一起探討

/*描述:讀出原有EEPROM數(shù)據(jù)  修改其中數(shù)據(jù)  重新寫入EEPROM
函數(shù): EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
參數(shù): EE_address:  要寫入的EEPROM的首地址.
      DataAddress: 要寫入數(shù)據(jù)的指針.
      len:               要寫入的長度
-----------------------------------------------------------------------------------------------------------*/
void EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
{      u16 j;        
        u8  i;
        u8  H[255];//扇區(qū)高位緩存
        u8  L[255];//扇區(qū)高位緩存
        u8  sq;     //操作扇區(qū)緩存
        //先讀出EEPROM原有扇區(qū)數(shù)據(jù)
        j=EE_address;
        sq=j/512;                                      //轉(zhuǎn)換成扇區(qū)
        EEPROM_read_n(sq<<9,L,255);       //讀出扇區(qū)低位
        EEPROM_read_n((sq<<9)+256,H,255); //讀出扇區(qū)高位
        for(i=0;i<len;i++){               //循環(huán)修改 長度
    if((j/256)%2)                     //判斷地址高位還是低位 修改取出來的數(shù)值
             H[j%256+i]=*(DataAddress+i);
        else
             L[j%256+i]=*(DataAddress+i);        
    }        
        EEPROM_SectorErase(sq*512);       //擦除所在扇區(qū)
        EEPROM_write_n(sq<<9,L,255);      //寫入新的扇區(qū)低位數(shù)據(jù)
        EEPROM_write_n((sq<<9)+256,H,255);//寫入新的扇區(qū)低位數(shù)據(jù)
}



作者: hjc5035    時間: 2023-1-10 15:57
EEPROM每個字節(jié)默認(rèn)是FFH,所以只能寫0將1改成0,擦除是按扇區(qū)(512B)
作者: coody_sz    時間: 2023-1-13 16:33
STC的EEPROM是FLASH結(jié)構(gòu),所有的FLASH都是扇區(qū)擦除的,擦除后全部是FF,寫只能將1寫成0,不能寫成1.
多個字節(jié)的操作,先全部讀出來(最多是一個扇區(qū)512字節(jié)),修改,擦除,寫入。

FLASH是一種浮柵結(jié)構(gòu)的FET(U盤、SD卡、TF卡、固態(tài)硬盤都是),一個FET一個bit,擦除就是將柵極放電,則FET截止,輸出1,寫入就是給柵極充電,則FET導(dǎo)通,輸出0。停電后,柵極電壓保持,一般能保持20年以上。
作者: wangxiangtan    時間: 2023-1-14 18:23
coody_sz 發(fā)表于 2023-1-13 16:33
STC的EEPROM是FLASH結(jié)構(gòu),所有的FLASH都是扇區(qū)擦除的,擦除后全部是FF,寫只能將1寫成0,不能寫成1.
多個 ...

老哥專業(yè),學(xué)習(xí)了




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