|
最近在使用STC EEPROM時 踩了個坑
寫入的數(shù)據(jù) 取出來 值不一樣 查看STC手冊時才發(fā)現(xiàn)
EEPROM 只能1寫成0 不能0 寫成1
51hei圖片_20230110032101.png (90.39 KB, 下載次數(shù): 33)
下載附件
1
2023-1-10 03:22 上傳
正常需要寫數(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ù)
}
|
評分
-
查看全部評分
|