eeprom_24c02.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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. uint8_t EEPROM_ReadDataBuf[256];
  143. int8_t GetParamFromEEprom_24C02(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t DataLen, uint8_t *Data)
  144. {
  145. uint8_t i, Temp2_8[2];
  146. uint16_t CRC_Data, CRC_Result;
  147. //读取DataLen个字节
  148. for(i=0;i<DataLen;i++)
  149. {
  150. if(EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + i, (EEPROM_ReadDataBuf + i)) == ACK_FAIL)
  151. {
  152. return ACK_FAIL;
  153. }
  154. }
  155. //计算校验
  156. CRC_Result = CRC16_Xmodem(EEPROM_ReadDataBuf, DataLen);
  157. //读取校验
  158. EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen, Temp2_8);
  159. EEPROM_24C02_ReadOneByte(I2C_Handle, AddrBegin + DataLen + 1, (Temp2_8 + 1));
  160. CRC_Data = (uint16_t)(Temp2_8[0] << 8) + Temp2_8[1];
  161. //判断数据是否有效
  162. if((CRC_Data - CRC_Result) == 0)
  163. {
  164. memcpy(Data, EEPROM_ReadDataBuf, DataLen);
  165. return ACK_OK;
  166. }
  167. else
  168. {
  169. return ACK_FAIL;
  170. }
  171. }
  172. //写入默认数据
  173. int8_t CopyDefaultDataToEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
  174. {
  175. uint8_t Temp_8[2];
  176. uint16_t CRC_Result = 0;
  177. Var_SetToDefaultParam();
  178. Var_SetToDefaultLog();
  179. EEPROM_24C02_ParamReset(I2C_Handle);//1363ms
  180. EEPROM_24C02_LogReset(I2C_Handle);//1240ms
  181. //写入数据有效标志
  182. memcpy((uint8_t*)Temp_8, (uint8_t*)EEPROM_24C02_Flag, sizeof(EEPROM_24C02_Flag));
  183. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]) == ACK_FAIL)//11ms
  184. {
  185. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8[0]);
  186. }
  187. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]) == ACK_FAIL)//11ms
  188. {
  189. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, Temp_8[1]);
  190. }
  191. CRC_Result = CRC16_Xmodem(Temp_8, 2);
  192. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8)) == ACK_FAIL)//11ms
  193. {
  194. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, (uint8_t)(CRC_Result >> 8));
  195. }
  196. if(EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF)) == ACK_FAIL)//11ms
  197. {
  198. EEPROM_24C02_WriteOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (uint8_t)(CRC_Result & 0xFF));
  199. }
  200. return ACK_OK;
  201. }
  202. //从EEPROM读取数据
  203. int8_t CopyDataFromEEpprom_24C02(I2C_Handle_Struct_t* I2C_Handle)
  204. {
  205. //读出校验码 13ms
  206. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
  207. {
  208. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
  209. }
  210. //读出力矩传感器1校正系数 5ms
  211. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_1_CAL_K, sizeof(TorqueSensor_1_Param.Torque_Cal_K), &TorqueSensor_1_Param.Torque_Cal_K) == ACK_FAIL)
  212. {
  213. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_1_CAL_K, sizeof(TorqueSensor_1_Param.Torque_Cal_K), &TorqueSensor_1_Param.Torque_Cal_K);
  214. }
  215. //读出力矩传感器1零点偏移 5ms
  216. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_1, sizeof(TorqueSensor_1_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_1_Param.Torque_OffSetData.Data) == ACK_FAIL)
  217. {
  218. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_1, sizeof(TorqueSensor_1_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_1_Param.Torque_OffSetData.Data);
  219. }
  220. //读出力矩传感器2校正系数 5ms
  221. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_2_CAL_K, sizeof(TorqueSensor_2_Param.Torque_Cal_K), &TorqueSensor_2_Param.Torque_Cal_K) == ACK_FAIL)
  222. {
  223. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_2_CAL_K, sizeof(TorqueSensor_2_Param.Torque_Cal_K), &TorqueSensor_2_Param.Torque_Cal_K);
  224. }
  225. //读出力矩传感器2零点偏移 5ms
  226. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_2, sizeof(TorqueSensor_2_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_2_Param.Torque_OffSetData.Data) == ACK_FAIL)
  227. {
  228. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_2, sizeof(TorqueSensor_2_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_2_Param.Torque_OffSetData.Data);
  229. }
  230. //读出力矩传感器3校正系数 5ms
  231. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_3_CAL_K, sizeof(TorqueSensor_3_Param.Torque_Cal_K), &TorqueSensor_3_Param.Torque_Cal_K) == ACK_FAIL)
  232. {
  233. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_3_CAL_K, sizeof(TorqueSensor_3_Param.Torque_Cal_K), &TorqueSensor_3_Param.Torque_Cal_K);
  234. }
  235. //读出力矩传感器3零点偏移 5ms
  236. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_3, sizeof(TorqueSensor_3_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_3_Param.Torque_OffSetData.Data) == ACK_FAIL)
  237. {
  238. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_3, sizeof(TorqueSensor_3_Param.Torque_OffSetData), (uint8_t*)&TorqueSensor_3_Param.Torque_OffSetData.Data);
  239. }
  240. //读出运行历史1 44ms
  241. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  242. {
  243. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  244. }
  245. MC_RunLog1.PowerOnCnt++;
  246. //写入开机次数 75ms
  247. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  248. {
  249. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  250. }
  251. //读出运行历史2
  252. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
  253. {
  254. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
  255. }
  256. //读取骑行历史信息
  257. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  258. {
  259. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  260. }
  261. //读出密钥 11ms
  262. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
  263. {
  264. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  265. }
  266. //读取平均功耗 16ms
  267. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
  268. {
  269. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
  270. }
  271. //读取启动值
  272. if(GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData) == ACK_FAIL)
  273. {
  274. GetParamFromEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData);
  275. }
  276. return ACK_OK;
  277. }
  278. //EEPROM_24C02检测
  279. int8_t EEPROM_24C02_Check(I2C_Handle_Struct_t* I2C_Handle)
  280. {
  281. uint8_t Temp_8[2] = {0};
  282. uint16_t FlagCRC, FlagCRC_Result;
  283. //读取存储标志并计算校验码
  284. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG, Temp_8);//1ms
  285. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 1, (Temp_8 + 1));//1ms
  286. FlagCRC_Result = CRC16_Xmodem(Temp_8, 2);
  287. //读取存储的校验码
  288. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 2, Temp_8);
  289. EEPROM_24C02_ReadOneByte(I2C_Handle, EEPROM_24C02_ADDR_FLAG + 3, (Temp_8 + 1));
  290. FlagCRC = ((uint16_t)Temp_8[0] << 8) + Temp_8[1];
  291. //判断数据是否有效
  292. if((FlagCRC - FlagCRC_Result) == 0) // 数据有效
  293. {
  294. return(CopyDataFromEEpprom_24C02(I2C_Handle));
  295. }
  296. else // 数据无效,写入默认参数
  297. {
  298. return(CopyDefaultDataToEEpprom_24C02(I2C_Handle));
  299. }
  300. }
  301. //清除指定区间段有效数据
  302. void EEPROM_24C02_ClearData(I2C_Handle_Struct_t* I2C_Handle, uint8_t AddrBegin, uint8_t EndAddr, uint8_t Data)
  303. {
  304. uint8_t i, Length;
  305. Length = EndAddr - AddrBegin;
  306. for(i=0; i<Length; i++)
  307. {
  308. EEPROM_24C02_WriteOneByte(I2C_Handle, AddrBegin + i ,Data);
  309. }
  310. }
  311. //配置参数还原 958ms
  312. void EEPROM_24C02_ParamReset(I2C_Handle_Struct_t* I2C_Handle)
  313. {
  314. //写入校验码
  315. if(SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode) == ACK_FAIL)
  316. {
  317. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CHECKCODE, sizeof(MC_CheckInfo.CheckCode), MC_CheckInfo.CheckCode);
  318. }
  319. //力矩传感器1校正系数
  320. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_1_CAL_K, sizeof(TorqueSensor_1_Param.Torque_Cal_K), &TorqueSensor_1_Param.Torque_Cal_K) == ACK_FAIL)
  321. {
  322. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_1_CAL_K, sizeof(TorqueSensor_1_Param.Torque_Cal_K), &TorqueSensor_1_Param.Torque_Cal_K);
  323. }
  324. //力矩传感器1零点偏移
  325. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_1, sizeof(TorqueSensor_1_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_1_Param.Torque_OffSetData.Data) == ACK_FAIL)
  326. {
  327. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_1, sizeof(TorqueSensor_1_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_1_Param.Torque_OffSetData.Data);
  328. }
  329. //力矩传感器2校正系数
  330. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_2_CAL_K, sizeof(TorqueSensor_2_Param.Torque_Cal_K), &TorqueSensor_2_Param.Torque_Cal_K) == ACK_FAIL)
  331. {
  332. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_2_CAL_K, sizeof(TorqueSensor_2_Param.Torque_Cal_K), &TorqueSensor_2_Param.Torque_Cal_K);
  333. }
  334. //力矩传感器2零点偏移
  335. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_2, sizeof(TorqueSensor_2_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_2_Param.Torque_OffSetData.Data) == ACK_FAIL)
  336. {
  337. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_2, sizeof(TorqueSensor_2_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_2_Param.Torque_OffSetData.Data);
  338. }
  339. //力矩传感器3校正系数
  340. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_3_CAL_K, sizeof(TorqueSensor_3_Param.Torque_Cal_K), &TorqueSensor_3_Param.Torque_Cal_K) == ACK_FAIL)
  341. {
  342. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_3_CAL_K, sizeof(TorqueSensor_3_Param.Torque_Cal_K), &TorqueSensor_3_Param.Torque_Cal_K);
  343. }
  344. //力矩传感器3零点偏移
  345. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_3, sizeof(TorqueSensor_3_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_3_Param.Torque_OffSetData.Data) == ACK_FAIL)
  346. {
  347. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_OFFSET_3, sizeof(TorqueSensor_3_Param.Torque_OffSetData), (uint8_t*)TorqueSensor_3_Param.Torque_OffSetData.Data);
  348. }
  349. //写入密钥
  350. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key) == ACK_FAIL)
  351. {
  352. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  353. }
  354. //写入力矩传感器启动值
  355. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData) == ACK_FAIL)
  356. {
  357. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData);
  358. }
  359. }
  360. //历史数据还原
  361. void EEPROM_24C02_LogReset(I2C_Handle_Struct_t* I2C_Handle)
  362. {
  363. //写入运行历史1
  364. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  365. {
  366. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  367. }
  368. //写入运行历史2
  369. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt) == ACK_FAIL)
  370. {
  371. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
  372. }
  373. //写入骑行历史信息
  374. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  375. {
  376. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  377. }
  378. //写入平均功耗
  379. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO) == ACK_FAIL)
  380. {
  381. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
  382. }
  383. }
  384. //掉电数据从Flash转移到24C02
  385. int8_t SavePowerOffBakData(I2C_Handle_Struct_t* I2C_Handle, TrueOrFalse_Flag_Struct_t IsSaveFlag)
  386. {
  387. if(IsSaveFlag == TRUE) //关机前有存储记录,则把从FLASH取出的数据转移到EEPROM中
  388. {
  389. //更新历史信息存储数据
  390. MC_RunLog1.RunTime = MC_PowerOffBkp.Run_Time;
  391. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt) == ACK_FAIL)
  392. {
  393. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  394. }
  395. //更新骑行信息存储数据
  396. MC_RideLog.ODO_Km = MC_PowerOffBkp.ODO_Km;
  397. MC_RideLog.ODO_Time = MC_PowerOffBkp.ODO_Time;
  398. MC_RideLog.TRIP_Km = MC_PowerOffBkp.Trip_Km;
  399. MC_RideLog.TRIP_Time = MC_PowerOffBkp.Trip_Time;
  400. MC_RunLog1.ODO_Km = MC_PowerOffBkp.Log_ODO_Km;
  401. MC_RunLog1.ODO_Time = MC_PowerOffBkp.Log_ODO_Time;
  402. if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
  403. {
  404. SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  405. }
  406. }
  407. //更新运行信息中ODO信息
  408. MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
  409. return 0;
  410. }
  411. //存储历史数据
  412. int8_t RunLogSave_Process(uint8_t* RunLogIndex)
  413. {
  414. if(*RunLogIndex == 1)
  415. {
  416. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  417. *RunLogIndex = 0;
  418. }
  419. else if(*RunLogIndex == 2)
  420. {
  421. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG2, sizeof(MC_RunLog2_Struct_t), (uint8_t*)&MC_RunLog2.MCU_FaultCnt);
  422. *RunLogIndex = 0;
  423. }
  424. return 0;
  425. }