106 lines
2.8 KiB
C
106 lines
2.8 KiB
C
#include "EEPROM.h"
|
||
#include "stdio.h"
|
||
void Inf_AT24C02_Init(void)
|
||
{
|
||
HAL_I2C_Init(&hi2c2);
|
||
}
|
||
|
||
void Inf_AT24C02_WriteByte(uint8_t innerAddr, uint8_t byte)
|
||
{
|
||
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
|
||
|
||
HAL_Delay(5);
|
||
|
||
}
|
||
|
||
uint8_t Inf_AT24C02_ReadByte(uint8_t innerAddr)
|
||
{
|
||
uint8_t byte;
|
||
HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
|
||
return byte;
|
||
}
|
||
void Inf_AT24C02_WriteBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
|
||
{
|
||
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
|
||
HAL_Delay(5);
|
||
}
|
||
void Inf_AT24C02_ReadBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
|
||
{
|
||
HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
|
||
|
||
}
|
||
|
||
// 清空整个AT24C02 EEPROM (写入0xFF)
|
||
void Clear_EEPROM_All(void)
|
||
{
|
||
uint16_t addr; // 使用 uint16_t 以防地址超过 255 (虽然AT24C02不会)
|
||
uint8_t clear_data = 0xFF; // 定义要写入的值,通常用 0xFF
|
||
|
||
// printf("开始清空整个 EEPROM...\r\n");
|
||
|
||
// AT24C02 有 256 个字节地址 (0 到 255)
|
||
for(addr = 0; addr < 256; addr++)
|
||
{
|
||
// 调用你驱动中的单字节写入函数
|
||
Inf_AT24C02_WriteByte((uint8_t)addr, clear_data);
|
||
|
||
// 你驱动中的 Inf_AT24C02_WriteByte 已经包含了 HAL_Delay(5),
|
||
// 所以这里不需要额外加延时,除非你需要更长的延时。
|
||
|
||
// 可以选择性地加一个进度打印,但会拖慢速度
|
||
// if ((addr + 1) % 32 == 0) { // 每写入32个字节打印一次
|
||
// printf("已清空 %d / 256 字节...\r\n", addr + 1);
|
||
// }
|
||
}
|
||
|
||
// printf("EEPROM 清空完成。\r\n");
|
||
}
|
||
|
||
|
||
void Save_Float_To_EEPROM(uint8_t addr, float data)
|
||
{
|
||
uint8_t bytes[4]; // 用于存储浮点数的字节数组
|
||
memcpy(bytes,&data,sizeof(float));
|
||
Inf_AT24C02_WriteBytes(addr,bytes,4);
|
||
|
||
}
|
||
|
||
float Read_Float_From_EEPROM(uint8_t addr)
|
||
{
|
||
uint8_t bytes[4];
|
||
float data;
|
||
Inf_AT24C02_ReadBytes(addr,bytes,4);
|
||
memcpy(&data,bytes,sizeof(float));
|
||
return data;
|
||
|
||
}
|
||
|
||
|
||
void Save_Energy_To_EEPROM(float energy)
|
||
{
|
||
// 保存能量值
|
||
Save_Float_To_EEPROM(EEPROM_ENERGY_ADDR, energy); // 保存能量值到 EEPROM
|
||
|
||
// 保存标志位
|
||
Inf_AT24C02_WriteByte(EEPROM_ENERGY_FLAG, EEPROM_ENERGY_FLAG_VAL);
|
||
}
|
||
|
||
|
||
float Load_Energy_From_EEPROM(void)
|
||
{
|
||
float energy = 0.0f; // 默认值
|
||
uint8_t flag;
|
||
flag = Inf_AT24C02_ReadByte(EEPROM_ENERGY_FLAG); // 读取标志位
|
||
|
||
if(flag == EEPROM_ENERGY_FLAG_VAL)
|
||
{
|
||
energy=Read_Float_From_EEPROM(EEPROM_ENERGY_ADDR); // 读取能量值
|
||
}
|
||
else
|
||
{
|
||
energy=0.0f; // 未找到有效数据,返回默认值
|
||
Save_Energy_To_EEPROM(energy); // 保存默认值到 EEPROM
|
||
}
|
||
return energy;
|
||
}
|