123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- #include "eeprom_24c02.h"
- #define Time_OUT 3000
- #define EEPROM_WP_GPIOx GPIOB
- #define EEPROM_WP_GPIO_PIN_x GPIO_PIN_1
- const uint8_t EEPROM_24C02_Flag[2] = {0x55,0xAA};
- int8_t AT24C02_OK = ACK_FAIL;
- I2C_Handle_Struct_t I2C_Handle_EEPROM = {GPIOB, GPIO_PIN_11, GPIOB, GPIO_PIN_10};
- //I2C引脚初始化
- void EEPROM_24C02_Init(I2C_Handle_Struct_t* I2C_Handle)
- {
- //保护
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.Pin = EEPROM_WP_GPIO_PIN_x;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
- HAL_GPIO_Init(EEPROM_WP_GPIOx, &GPIO_InitStruct);
- HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_SET);
- I2C_GPIO_Config(I2C_Handle);
- }
- //指定地址读取1字节
- int8_t EEPROM_24C02_ReadOneByte(I2C_Handle_Struct_t* I2C_Handle, uint8_t ReadAddr, uint8_t *data) //指定地址读取一个字节
- {
- uint16_t Timeout_Cnt = 0;
-
- I2C_Start(I2C_Handle);
-
- I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_WR); //发送写命令
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
-
- I2C_Write_Byte(I2C_Handle, ReadAddr);
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
-
- I2C_Start(I2C_Handle);
-
- I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_RD); //发送读命令
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
-
- I2C_Read_Byte(I2C_Handle, data);
- I2C_Send_Nack(I2C_Handle);
- I2C_Stop(I2C_Handle);
- return ACK_OK;
- }
- //指定地址写入1字节
- int8_t EEPROM_24C02_WriteOneByte(I2C_Handle_Struct_t* I2C_Handle, uint8_t WriteAddr,uint8_t DataToWrite) //指定地址写入一个字节
- {
- uint16_t Timeout_Cnt = 0;
- HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_RESET);
-
- I2C_Start(I2C_Handle);
-
- I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_WR); //发送写命令
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
-
- I2C_Write_Byte(I2C_Handle, WriteAddr);
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
- I2C_Write_Byte(I2C_Handle, DataToWrite);
- Timeout_Cnt = 0;
- do
- {
- Timeout_Cnt++;
- if(Timeout_Cnt>Time_OUT)
- {
- return ACK_FAIL;
- }
- }while(I2C_Check_Ack(I2C_Handle));
- I2C_Stop(I2C_Handle);
- HAL_Delay(10);
-
- HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_SET);
-
- //看门狗清零
- #if DEBUG
- HAL_IWDG_Refresh(&hiwdg);
- #endif
-
- return ACK_OK;
- }
- //指定地址写入有效数据
- int8_t SaveParamToEEprom_24C02(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t DataLen, uint8_t *Data)
- {
- uint8_t Temp_8 = 0, i;
- uint16_t CRC_Result = 0;
-
- //按字节存储数据
- for(i=0;i<DataLen;i++)
- {
- if(EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + i, &Temp_8) == ACK_FAIL)
- {
- return ACK_FAIL;
- }
- if(Temp_8 != Data[i])
- {
- Temp_8 = Data[i];
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + i, Temp_8) == ACK_FAIL)
- {
- return ACK_FAIL;
- }
- }
- }
-
- //存储校验位
- CRC_Result = CRC16_Xmodem(Data, DataLen);
- Temp_8 = (uint8_t)(CRC_Result >> 8);
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + DataLen , Temp_8) == ACK_FAIL)
- {
- return ACK_FAIL;
- }
- Temp_8 = (uint8_t)(CRC_Result & 0xFF);
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + DataLen + 1 , Temp_8) == ACK_FAIL)
- {
- return ACK_FAIL;
- }
- return ACK_OK;
- }
- //指定地址读取有效数据
- uint8_t EEPROM_ReadDataBuf[256];
- int8_t GetParamFromEEprom_24C02(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t DataLen, uint8_t *Data)
- {
- uint8_t i, Temp2_8[2];
- uint16_t CRC_Data, CRC_Result;
-
- //读取DataLen个字节
- for(i=0;i<DataLen;i++)
- {
- if(EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + i, (EEPROM_ReadDataBuf + i)) == ACK_FAIL)
- {
- return ACK_FAIL;
- }
- }
- //计算校验
- CRC_Result = CRC16_Xmodem(EEPROM_ReadDataBuf, DataLen);
-
- //读取校验
- EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen, Temp2_8);
- EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen + 1, (Temp2_8 + 1));
- CRC_Data = (uint16_t)(Temp2_8[0] << 8) + Temp2_8[1];
-
- //判断数据是否有效
- if((CRC_Data - CRC_Result) == 0)
- {
- memcpy(Data, EEPROM_ReadDataBuf, DataLen);
- return ACK_OK;
- }
- else
- {
- return ACK_FAIL;
- }
- }
- //写入默认数据
- int8_t CopyDefaultDataToEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
- {
- uint8_t Temp_8[2];
- uint16_t CRC_Result = 0;
-
- Var_SetToDefaultParam();
- Var_SetToDefaultLog();
-
- EEPROM_24C02_ParamReset(I2C_Handle);//1363ms
- EEPROM_24C02_LogReset(I2C_Handle);//1240ms
- //写入数据有效标志
- memcpy((uint8_t*)Temp_8, (uint8_t*)EEPROM_24C02_Flag, sizeof(EEPROM_24C02_Flag));
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]) == ACK_FAIL)
- {
- EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]);
- }
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]) == ACK_FAIL)
- {
- EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]);
- }
- CRC_Result = CRC16_Xmodem(Temp_8, 2);
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8)) == ACK_FAIL)
- {
- EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8));
- }
- if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF)) == ACK_FAIL)
- {
- EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF));
- }
- return ACK_OK;
- }
- //从EEPROM读取数据
- int8_t CopyDataFromEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
- {
- //读出校验码 13ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
- }
- //读出配置参数 30ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param);
- }
- MC_GasMode_Param.Mode = MC_ConfigParam1.GasCtrlMode_Param;
- //读出力矩传感器校正信息 5ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData);
- }
- //读出马达参数 21ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power);
- }
- //读出运行历史1 44ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- }
- MC_RunLog1.PowerOnCnt++;
- //写入开机次数 75ms
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- }
- //读出运行历史2
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
- }
- //读出力矩传感器零点偏移值 22ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)&TorqueOffSetData.Data[0]) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)&TorqueOffSetData.Data[0]);
- }
- //读出密钥 11ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
- }
- //读取平均功耗 16ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
- }
- //读取骑行历史信息
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
- }
- //读取用户配置参数2 31ms
- if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch) == ACK_FAIL)
- {
- GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch);
- }
-
- return ACK_OK;
- }
- //EEPROM_24C02检测
- int8_t EEPROM_24C02_Check(I2C_Handle_Struct_t* I2C_Handle)
- {
- uint8_t Temp_8[2] = {0};
- uint16_t FlagCRC, FlagCRC_Result;
-
- //读取存储标志并计算校验码
- EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8);//1ms
- EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, (Temp_8 + 1));//1ms
- FlagCRC_Result = CRC16_Xmodem(Temp_8, 2);
- //读取存储的校验码
- EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, Temp_8);
- EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (Temp_8 + 1));
- FlagCRC = ((uint16_t)Temp_8[0] << 8) + Temp_8[1];
-
- //判断数据是否有效
- if((FlagCRC - FlagCRC_Result) == 0) // 数据有效
- {
- return(CopyDataFromEEpprom_24C02(I2C_Handle));
- }
- else // 数据无效,写入默认参数
- {
- return(CopyDefaultDataToEEpprom_24C02(I2C_Handle));
- }
- }
- //清除指定区间段有效数据
- void EEPROM_24C02_ClearData(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t EndAddr, uint8_t Data)
- {
- uint8_t i, Length;
-
- Length = EndAddr - AddrBegin;
- for(i=0; i<Length; i++)
- {
- EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + i ,Data);
- }
- }
- //配置参数还原
- void EEPROM_24C02_ParamReset(I2C_Handle_Struct_t* I2C_Handle)
- {
- //写入MC校验码
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
- }
-
- //写入密钥
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
- }
- //写入用户配置参数1
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param);
- }
-
- //写入用户配置参数2
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch);
- }
-
- //写入马达参数
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power);
- }
-
- //写入默认力矩传感器校正信息
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData);
- }
-
- //写入力矩传感器零点偏移值
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)TorqueOffSetData.Data) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)TorqueOffSetData.Data);
- }
- }
- //历史数据还原
- void EEPROM_24C02_LogReset(I2C_Handle_Struct_t* I2C_Handle)
- {
- //写入运行历史1
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- }
-
- //写入运行历史2
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
- }
-
- //写入骑行历史信息
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
- }
-
- //写入平均功耗
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
- }
- }
- //掉电数据从Flash转移到24C02
- int8_t SavePowerOffBakData(I2C_Handle_Struct_t* I2C_Handle, TrueOrFalse_Flag_Struct_t IsSaveFlag)
- {
- if(IsSaveFlag == TRUE) //关机前有存储记录,则把从FLASH取出的数据转移到EEPROM中
- {
- //更新历史信息存储数据
- MC_RunLog1.RunTime = MC_PowerOffBkp.Run_Time;
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- }
-
- //更新骑行信息存储数据
- MC_RideLog.ODO_Km = MC_PowerOffBkp.ODO_Km;
- MC_RideLog.ODO_Time = MC_PowerOffBkp.ODO_Time;
- MC_RideLog.TRIP_Km = MC_PowerOffBkp.Trip_Km;
- MC_RideLog.TRIP_Time = MC_PowerOffBkp.Trip_Time;
- MC_RunLog1.ODO_Km = MC_PowerOffBkp.Log_ODO_Km;
- MC_RunLog1.ODO_Time = MC_PowerOffBkp.Log_ODO_Time;
- MC_AvgPower.PedalPowerSum = MC_PowerOffBkp.PedalPoweSum;
- if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
- {
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
- }
- }
-
- //更新运行信息中ODO信息
- MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
-
- return 0;
- }
- //存储历史数据
- int8_t RunLogSave_Process(uint8_t* RunLogIndex)
- {
- if(*RunLogIndex == 1)
- {
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
- *RunLogIndex = 0;
- }
- else if(*RunLogIndex == 2)
- {
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
- *RunLogIndex = 0;
- }
- return 0;
- }
|