最近在使用STC EEPROM時 踩了個坑
寫入的數據 取出來 值不一樣 查看STC手冊時才發現
EEPROM 只能1寫成0 不能0 寫成1
51hei圖片_20230110032101.png (90.39 KB, 下載次數: 33)
下載附件
1
2023-1-10 03:22 上傳
正常需要寫數據到EEPROM需要 先擦除數據整扇區512字節
再寫入 數據才是正常的
那么扇區內的其他數據不是也同時被擦除拉
要保留扇區內其他數據 只能線讀出來 修改好后再寫入整個扇區
STC 官方提供的例程 只有 讀 N個字節,寫N個字節 , 擦除 三個基本操作
所以只能自己寫一個功能函數了
下面的就是根據官網的讀寫例程 湊合寫的
已經測通過試過
希望可以給大家借鑒,如果有更高效的寫法 可以分享出來一起探討
/*描述:讀出原有EEPROM數據 修改其中數據 重新寫入EEPROM
函數: EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
參數: EE_address: 要寫入的EEPROM的首地址.
DataAddress: 要寫入數據的指針.
len: 要寫入的長度
-----------------------------------------------------------------------------------------------------------*/
void EEPROM_save_write(u32 EE_address,u8 *DataAddress,u8 len)
{ u16 j;
u8 i;
u8 H[255];//扇區高位緩存
u8 L[255];//扇區高位緩存
u8 sq; //操作扇區緩存
//先讀出EEPROM原有扇區數據
j=EE_address;
sq=j/512; //轉換成扇區
EEPROM_read_n(sq<<9,L,255); //讀出扇區低位
EEPROM_read_n((sq<<9)+256,H,255); //讀出扇區高位
for(i=0;i<len;i++){ //循環修改 長度
if((j/256)%2) //判斷地址高位還是低位 修改取出來的數值
H[j%256+i]=*(DataAddress+i);
else
L[j%256+i]=*(DataAddress+i);
}
EEPROM_SectorErase(sq*512); //擦除所在扇區
EEPROM_write_n(sq<<9,L,255); //寫入新的扇區低位數據
EEPROM_write_n((sq<<9)+256,H,255);//寫入新的扇區低位數據
}
|