eeprom_24c02.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. #include "eeprom_24c02.h"
  2. #define Time_OUT 3000
  3. #define EEPROM_WP_GPIOx GPIOB
  4. #define EEPROM_WP_GPIO_PIN_x GPIO_PIN_1
  5. const uint8_t EEPROM_24C02_Flag[2] = {0x55,0xAA};
  6. int8_t AT24C02_OK = ACK_FAIL;
  7. I2C_Handle_Struct_t I2C_Handle_EEPROM = {GPIOB, GPIO_PIN_11, GPIOB, GPIO_PIN_10};
  8. //I2C引脚初始化
  9. void EEPROM_24C02_Init(I2C_Handle_Struct_t* I2C_Handle)
  10. {
  11. //保护
  12. GPIO_InitTypeDef GPIO_InitStruct;
  13. GPIO_InitStruct.Pin = EEPROM_WP_GPIO_PIN_x;
  14. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  15. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  16. HAL_GPIO_Init(EEPROM_WP_GPIOx, &GPIO_InitStruct);
  17. HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_SET);
  18. I2C_GPIO_Config(I2C_Handle);
  19. }
  20. //指定地址读取1字节
  21. int8_t EEPROM_24C02_ReadOneByte(I2C_Handle_Struct_t* I2C_Handle, uint8_t ReadAddr, uint8_t *data) //指定地址读取一个字节
  22. {
  23. uint16_t Timeout_Cnt = 0;
  24. I2C_Start(I2C_Handle);
  25. I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_WR); //发送写命令
  26. Timeout_Cnt = 0;
  27. do
  28. {
  29. Timeout_Cnt++;
  30. if(Timeout_Cnt>Time_OUT)
  31. {
  32. return ACK_FAIL;
  33. }
  34. }while(I2C_Check_Ack(I2C_Handle));
  35. I2C_Write_Byte(I2C_Handle, ReadAddr);
  36. Timeout_Cnt = 0;
  37. do
  38. {
  39. Timeout_Cnt++;
  40. if(Timeout_Cnt>Time_OUT)
  41. {
  42. return ACK_FAIL;
  43. }
  44. }while(I2C_Check_Ack(I2C_Handle));
  45. I2C_Start(I2C_Handle);
  46. I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_RD); //发送读命令
  47. Timeout_Cnt = 0;
  48. do
  49. {
  50. Timeout_Cnt++;
  51. if(Timeout_Cnt>Time_OUT)
  52. {
  53. return ACK_FAIL;
  54. }
  55. }while(I2C_Check_Ack(I2C_Handle));
  56. I2C_Read_Byte(I2C_Handle, data);
  57. I2C_Send_Nack(I2C_Handle);
  58. I2C_Stop(I2C_Handle);
  59. return ACK_OK;
  60. }
  61. //指定地址写入1字节
  62. int8_t EEPROM_24C02_WriteOneByte(I2C_Handle_Struct_t* I2C_Handle, uint8_t WriteAddr,uint8_t DataToWrite) //指定地址写入一个字节
  63. {
  64. uint16_t Timeout_Cnt = 0;
  65. HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_RESET);
  66. I2C_Start(I2C_Handle);
  67. I2C_Write_Byte(I2C_Handle, AT24C02_ADDR_WR); //发送写命令
  68. Timeout_Cnt = 0;
  69. do
  70. {
  71. Timeout_Cnt++;
  72. if(Timeout_Cnt>Time_OUT)
  73. {
  74. return ACK_FAIL;
  75. }
  76. }while(I2C_Check_Ack(I2C_Handle));
  77. I2C_Write_Byte(I2C_Handle, WriteAddr);
  78. Timeout_Cnt = 0;
  79. do
  80. {
  81. Timeout_Cnt++;
  82. if(Timeout_Cnt>Time_OUT)
  83. {
  84. return ACK_FAIL;
  85. }
  86. }while(I2C_Check_Ack(I2C_Handle));
  87. I2C_Write_Byte(I2C_Handle, DataToWrite);
  88. Timeout_Cnt = 0;
  89. do
  90. {
  91. Timeout_Cnt++;
  92. if(Timeout_Cnt>Time_OUT)
  93. {
  94. return ACK_FAIL;
  95. }
  96. }while(I2C_Check_Ack(I2C_Handle));
  97. I2C_Stop(I2C_Handle);
  98. HAL_Delay(10);
  99. HAL_GPIO_WritePin(EEPROM_WP_GPIOx, EEPROM_WP_GPIO_PIN_x, GPIO_PIN_SET);
  100. //看门狗清零
  101. #if DEBUG
  102. HAL_IWDG_Refresh(&hiwdg);
  103. #endif
  104. return ACK_OK;
  105. }
  106. //指定地址写入有效数据
  107. int8_t SaveParamToEEprom_24C02(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t DataLen, uint8_t *Data)
  108. {
  109. uint8_t Temp_8 = 0, i;
  110. uint16_t CRC_Result = 0;
  111. //按字节存储数据
  112. for(i=0;i<DataLen;i++)
  113. {
  114. if(EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + i, &Temp_8) == ACK_FAIL)
  115. {
  116. return ACK_FAIL;
  117. }
  118. if(Temp_8 != Data[i])
  119. {
  120. Temp_8 = Data[i];
  121. if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + i, Temp_8) == ACK_FAIL)
  122. {
  123. return ACK_FAIL;
  124. }
  125. }
  126. }
  127. //存储校验位
  128. CRC_Result = CRC16_Xmodem(Data, DataLen);
  129. Temp_8 = (uint8_t)(CRC_Result >> 8);
  130. if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + DataLen , Temp_8) == ACK_FAIL)
  131. {
  132. return ACK_FAIL;
  133. }
  134. Temp_8 = (uint8_t)(CRC_Result & 0xFF);
  135. if(EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + DataLen + 1 , Temp_8) == ACK_FAIL)
  136. {
  137. return ACK_FAIL;
  138. }
  139. return ACK_OK;
  140. }
  141. //指定地址读取有效数据
  142. int8_t GetParamFromEEprom_24C02(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t DataLen, uint8_t *Data)
  143. {
  144. uint8_t Temp1_8[256], i, Temp2_8[2];
  145. uint16_t CRC_Data, CRC_Result;
  146. //读取DataLen个字节
  147. for(i=0;i<DataLen;i++)
  148. {
  149. if(EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + i, (Temp1_8 + i)) == ACK_FAIL)
  150. {
  151. return ACK_FAIL;
  152. }
  153. }
  154. //计算校验
  155. CRC_Result = CRC16_Xmodem(Temp1_8, DataLen);
  156. //读取校验
  157. EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen, Temp2_8);
  158. EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen + 1, (Temp2_8 + 1));
  159. CRC_Data = (uint16_t)(Temp2_8[0] << 8) + Temp2_8[1];
  160. //判断数据是否有效
  161. if((CRC_Data - CRC_Result) == 0)
  162. {
  163. memcpy(Data, Temp1_8, DataLen);
  164. return ACK_OK;
  165. }
  166. else
  167. {
  168. return ACK_FAIL;
  169. }
  170. }
  171. //写入默认数据
  172. int8_t CopyDefaultDataToEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
  173. {
  174. uint8_t Temp_8[2];
  175. uint16_t CRC_Result = 0;
  176. //写入MC校验码
  177. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
  178. {
  179. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
  180. }
  181. //写入MC配置参数
  182. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag) == ACK_FAIL)
  183. {
  184. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
  185. }
  186. //写入默认力矩传感器校正信息
  187. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData) == ACK_FAIL)
  188. {
  189. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData);
  190. }
  191. //写入马达参数
  192. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power) == ACK_FAIL)
  193. {
  194. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power);
  195. }
  196. //写入运行历史1
  197. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  198. {
  199. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  200. }
  201. //写入运行历史2
  202. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
  203. {
  204. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
  205. }
  206. //写入力矩传感器零点偏移值
  207. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)TorqueOffSetData.Data) == ACK_FAIL)
  208. {
  209. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)TorqueOffSetData.Data);
  210. }
  211. //写入密钥
  212. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
  213. {
  214. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  215. }
  216. //写入平均功耗
  217. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
  218. {
  219. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
  220. }
  221. //写入骑行历史信息
  222. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  223. {
  224. return ACK_FAIL;
  225. }
  226. //写入用户配置参数2
  227. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch) == ACK_FAIL)
  228. {
  229. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch);
  230. }
  231. //写入数据有效标志
  232. memcpy((uint8_t*)Temp_8, (uint8_t*)EEPROM_24C02_Flag, sizeof(EEPROM_24C02_Flag));
  233. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]) == ACK_FAIL)
  234. {
  235. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]);
  236. }
  237. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]) == ACK_FAIL)
  238. {
  239. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]);
  240. }
  241. CRC_Result = CRC16_Xmodem(Temp_8, 2);
  242. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8)) == ACK_FAIL)
  243. {
  244. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8));
  245. }
  246. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF)) == ACK_FAIL)
  247. {
  248. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF));
  249. }
  250. return ACK_OK;
  251. }
  252. //从EEPROM读取数据
  253. int8_t CopyDataFromEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
  254. {
  255. //读出校验码 13ms
  256. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
  257. {
  258. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
  259. }
  260. //读出配置参数 30ms
  261. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag) == ACK_FAIL)
  262. {
  263. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1_Struct_t), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
  264. }
  265. //读出力矩传感器校正信息 5ms
  266. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData) == ACK_FAIL)
  267. {
  268. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_PARAM, sizeof(MC_TorqueCorrectParam_Struct_t), (uint8_t*)&MC_TorqueCorrectParam.StarData);
  269. }
  270. //读出马达参数 21ms
  271. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power) == ACK_FAIL)
  272. {
  273. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_MOTOR_PARAM, sizeof(MC_MotorParam_Struct_t), (uint8_t*)&MC_MotorParam.Rate_Power);
  274. }
  275. //读出运行历史 44ms
  276. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  277. {
  278. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  279. }
  280. MC_RunLog1.PowerOnCnt++;
  281. //写入开机次数 75ms
  282. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  283. {
  284. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  285. }
  286. //读出运行历史2
  287. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
  288. {
  289. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
  290. }
  291. //读出力矩传感器零点偏移值 22ms
  292. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)&TorqueOffSetData.Data[0]) == ACK_FAIL)
  293. {
  294. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)&TorqueOffSetData.Data[0]);
  295. }
  296. //读出密钥 11ms
  297. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
  298. {
  299. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  300. }
  301. //读取平均功耗 16ms
  302. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
  303. {
  304. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
  305. }
  306. //读取骑行历史信息
  307. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  308. {
  309. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  310. }
  311. //读取用户配置参数2 31ms
  312. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch) == ACK_FAIL)
  313. {
  314. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CONFIG_PARAM2, sizeof(MC_ConfigParam2_Struct_t), (uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch);
  315. }
  316. return ACK_OK;
  317. }
  318. //EEPROM_24C02检测
  319. int8_t EEPROM_24C02_Check(I2C_Handle_Struct_t* I2C_Handle)
  320. {
  321. uint8_t Temp_8[2] = {0};
  322. uint16_t FlagCRC, FlagCRC_Result;
  323. //读取存储标志并计算校验码
  324. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8);//1ms
  325. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, (Temp_8 + 1));//1ms
  326. FlagCRC_Result = CRC16_Xmodem(Temp_8, 2);
  327. //读取存储的校验码
  328. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, Temp_8);
  329. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (Temp_8 + 1));
  330. FlagCRC = ((uint16_t)Temp_8[0] << 8) + Temp_8[1];
  331. //判断数据是否有效
  332. if((FlagCRC - FlagCRC_Result) == 0) // 数据有效
  333. {
  334. return(CopyDataFromEEpprom_24C02(I2C_Handle));
  335. }
  336. else //数据无效
  337. {
  338. Var_SetEEPROM_ToDefaultData();
  339. return (CopyDefaultDataToEEpprom_24C02(I2C_Handle));
  340. }
  341. }
  342. //清除指定区间段有效数据
  343. void EEPROM_24C02_ClearData(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t EndAddr, uint8_t Data)
  344. {
  345. uint8_t i, Length;
  346. Length = EndAddr - AddrBegin;
  347. for(i=0; i<Length; i++)
  348. {
  349. EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + i ,Data);
  350. }
  351. }
  352. //掉电数据从Flash转移到24C02
  353. int8_t SavePowerOffBakData(I2C_Handle_Struct_t* I2C_Handle, TrueOrFalse_Flag_Struct_t IsSaveFlag)
  354. {
  355. if(IsSaveFlag == TRUE) //关机前有存储记录,则把从FLASH取出的数据转移到EEPROM中
  356. {
  357. //更新历史信息存储数据
  358. MC_RunLog1.RunTime = MC_PowerOffBkp.Run_Time;
  359. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  360. {
  361. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  362. }
  363. //更新骑行信息存储数据
  364. MC_RideLog.ODO_Km = MC_PowerOffBkp.ODO_Km;
  365. MC_RideLog.ODO_Time = MC_PowerOffBkp.ODO_Time;
  366. MC_RideLog.TRIP_Km = MC_PowerOffBkp.Trip_Km;
  367. MC_RideLog.TRIP_Time = MC_PowerOffBkp.Trip_Time;
  368. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  369. {
  370. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  371. }
  372. }
  373. //更新运行信息中ODO信息
  374. MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
  375. return 0;
  376. }