最近在使用STC EEPROM时 踩了个坑
写入的数据 取出来 值不一样 查看STC手册时才发现
EEPROM 只能1写成0 不能0 写成1
正常需要写数据到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);//写入新的扇区低位数据
}
|