//******************************************************************** // Ver 1.0 // 2021.11.20 1、新建文件。 //******************************************************************** #include "config.h" EEPROM_Str EEPROM_Info; void EEPROM_InfoInit(void) { MEM_Fill((INT8U *)&EEPROM_Info, 0, sizeof(EEPROM_Str)); EEPROM_Read(EEPROM_ADDR_BALANECE_INFO, (INT8U *) & (BATT_Info.Info.BalanceStats), sizeof(BalanceStats_Str)); EEPROM_Read(EEPROM_ADDR_USE_INFO, (INT8U *) & (BATT_Info.Info.UseInfoLog), sizeof(UseInfoLog_Str)); EEPROM_Read(EEPROM_ADDR_ALARMCNT_INFO, (INT8U *) & (BATT_Info.Info.AlarmCount), sizeof(AlarmCount_Str)); EEPROM_Read(EEPROM_ADDR_ALARMLOG_INFO, (INT8U *) & (BATT_Info.Info.AlarmLog), sizeof(AlarmLog_Str)); } void EEPROM_Init(void) { EEPROM_WpInit(); I2CS_Init1(I2CS1, 100000); EEPROM_InfoInit(); if(BATT_Info.Info.BalanceStats.CellBalanceMin[13] == 0xffffffff) { MEM_Fill((INT8U *) & (BATT_Info.Info.BalanceStats), 0, sizeof(BalanceStats_Str)); EEPROM_Write(EEPROM_ADDR_BALANECE_INFO, (INT8U *) & (BATT_Info.Info.BalanceStats), sizeof(BalanceStats_Str)); } if(BATT_Info.Info.UseInfoLog.ChargeTimeCount == 0xffffffff) { MEM_Fill((INT8U *) & (BATT_Info.Info.UseInfoLog), 0, sizeof(UseInfoLog_Str)); EEPROM_Write(EEPROM_ADDR_USE_INFO, (INT8U *) & (BATT_Info.Info.UseInfoLog), sizeof(UseInfoLog_Str)); } if(BATT_Info.Info.AlarmCount.AlarmCodeCount[9].AlarmCount1 == 0xffff) { MEM_Fill((INT8U *) & (BATT_Info.Info.AlarmCount), 0, sizeof(AlarmCount_Str)); EEPROM_Write(EEPROM_ADDR_ALARMCNT_INFO, (INT8U *) & (BATT_Info.Info.AlarmCount), sizeof(AlarmCount_Str)); } if(BATT_Info.Info.AlarmLog.AlarmTimeStamp[29].AlarmNum == 0xffff) { MEM_Fill((INT8U *) & (BATT_Info.Info.AlarmLog), 0, sizeof(AlarmLog_Str)); EEPROM_Write(EEPROM_ADDR_ALARMLOG_INFO, (INT8U *) & (BATT_Info.Info.AlarmLog), sizeof(AlarmLog_Str)); } } //数据按页对齐写入、读取,有利于提高访问速度 INT8U EEPROM_Read(INT16U Addr, INT8U *ptr, INT16U Len) { INT8U tFlag = 1; EEPROM_Info.Size = 0; do { EEPROM_Info.PageAddr = Addr & (~(EEPROM_SECTOR - 1)); //计算读取页地址 tFlag = EEPROM_I2CRead(EEPROM_Info.PageAddr, EEPROM_Info.Buff, EEPROM_SECTOR); if (tFlag != 0) { EEPROM_Info.Size = Addr & (EEPROM_SECTOR - 1); //计算数据在页里的位置 if(EEPROM_SECTOR >= Len) //计算最后剩余字节数 { EEPROM_Info.Size = Len; } else if(EEPROM_Info.Size == 0) //计算中间字节数 { EEPROM_Info.Size = EEPROM_SECTOR; } MEM_Copy((INT8U *)&EEPROM_Info.Buff[Addr - EEPROM_Info.PageAddr], ptr, EEPROM_Info.Size); EEPROM_Info.Flag = 0; } Addr += EEPROM_Info.Size; ptr += EEPROM_Info.Size; Len -= EEPROM_Info.Size; } while(Len != 0); return (EEPROM_Info.Flag); } INT8U EEPROM_Write(INT16U Addr, INT8U *ptr, INT16U Len) { INT8U tFlag = 1; EEPROM_Wp(DISABLE); DELAY_Ms(10); do { EEPROM_Info.Size = Addr & (EEPROM_SECTOR - 1); //计算数据在页里的位置 if(EEPROM_SECTOR >= Len) //计算最后剩余字节数 { EEPROM_Info.Size = Len; } else //if(EEPROM_Info.Size == 0) //计算中间字节数 { EEPROM_Info.Size = EEPROM_SECTOR; } MEM_Copy(ptr, EEPROM_Info.Buff, EEPROM_Info.Size); tFlag = EEPROM_I2CWrite(Addr, EEPROM_Info.Buff, EEPROM_Info.Size); Addr += EEPROM_Info.Size; ptr += EEPROM_Info.Size; Len -= EEPROM_Info.Size; if (tFlag != 0) { EEPROM_Info.Flag = 0; } DELAY_Ms(100); } while(Len != 0); EEPROM_Wp(ENABLE); return (EEPROM_Info.Flag); }