ReadEeprom.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*********************************************************************************************************
  2. * 模块名称:ReadEeprom.c
  3. * 摘 要:ReadEeprom模块,进行独立按键初始化,以及按键扫描函数实现
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "ReadEeprom.h"
  20. #include "Main.h"
  21. #include "gd32e230x_conf.h"
  22. #include "At24cxx.h"
  23. #include "string.h"
  24. #include "Relay.h"
  25. #include "Sn74hc573.h"
  26. /*********************************************************************************************************
  27. * 宏定义
  28. *********************************************************************************************************/
  29. /*********************************************************************************************************
  30. * 枚举结构体
  31. *********************************************************************************************************/
  32. extern DCPDU_RELAY_Para_Reg DCPDU_RL_time;
  33. /*********************************************************************************************************
  34. * 内部变量定义
  35. *********************************************************************************************************/
  36. uint8_t Eeprom_Rbuf[RELAY_para_sum]={0};
  37. extern uint8_t DCPDU_active_chn;
  38. extern uint8_t Active_state_bit;
  39. extern uint32_t DCPDU_Modbus_Reg[DCPDU_Modbus_Reg_len];
  40. /*********************************************************************************************************
  41. * 内部函数声明
  42. *********************************************************************************************************/
  43. /*********************************************************************************************************
  44. * 内部函数实现
  45. *********************************************************************************************************/
  46. /*********************************************************************************************************
  47. * 函数名称:ReadEeprom
  48. * 函数功能:读出Eeprom的数据
  49. * 输入参数:void
  50. * 输出参数:void
  51. * 返 回 值:void
  52. * 创建日期:2021年07月01日
  53. * 注 意:
  54. *********************************************************************************************************/
  55. void ReadEeprom(void)
  56. {
  57. uint8_t i = 0;
  58. uint8_t j = 0;
  59. uint32_t temp0 = 0;
  60. uint32_t temp1 = 0;
  61. uint32_t temp2 = 0;
  62. uint32_t temp3 = 0;
  63. AT24CxxRead(0, Eeprom_Rbuf, RELAY_para_sum); //从eeprom中读出通道开启延时数据
  64. if((Eeprom_Rbuf[ERom_RL_Ch_N_addr] < 1) || (Eeprom_Rbuf[ERom_RL_Ch_N_addr] > RELAY_ChN_default))
  65. {
  66. Eeprom_Rbuf[ERom_RL_Ch_N_addr] = RELAY_ChN_default;
  67. }
  68. DCPDU_active_chn = Eeprom_Rbuf[ERom_RL_Ch_N_addr];
  69. DCPDU_Modbus_Reg[DCPDU_RL_ST_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_ST_Addr];
  70. DCPDU_Modbus_Reg[DCPDU_RLft_ST_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RLft_ST_Addr];
  71. for(i = 0;i < RELAY_ChN_default;i++)
  72. {
  73. if((Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] < 1) || (Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] > RELAY_ontime_max))
  74. {
  75. Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] = RELAY_ontime_default;
  76. }
  77. if((Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] < 1) || (Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] > RELAY_offtime_max))
  78. {
  79. Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] = RELAY_offtime_default;
  80. }
  81. DCPDU_Modbus_Reg[DCPDU_RL_Ton1_Addr + i - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Ton1_Addr + i];
  82. DCPDU_Modbus_Reg[DCPDU_RL_Toff1_Addr + i - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Toff1_Addr + i];
  83. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = 0;
  84. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = 0;
  85. DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = 0;
  86. DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = 0;
  87. temp0 = 4 * i;
  88. DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0 + 3] = 0;
  89. for(j = 0;j < 4;j++)
  90. {
  91. temp2 = 8 * j;
  92. temp2 = 24 - temp2;
  93. temp3 = 4 * i;
  94. temp3 += j;
  95. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] += (Eeprom_Rbuf[ERom_VLit1_max_Addr + temp3] << temp2);
  96. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] += (Eeprom_Rbuf[ERom_VLit1_min_Addr + temp3] << temp2);
  97. DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] += (Eeprom_Rbuf[ERom_ILit1_max_Addr + temp3] << temp2);
  98. DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] += (Eeprom_Rbuf[ERom_ILit1_min_Addr + temp3] << temp2);
  99. DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0 + 3] += (Eeprom_Rbuf[ERom_TotalWh1_Addr + temp3] << temp2);
  100. //read
  101. }
  102. // if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Vin_LTmax_default))
  103. // {
  104. // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = Vin_LTmax_default;
  105. // }
  106. if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Default_Voltage_Max)
  107. {
  108. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = 0;
  109. }
  110. // if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Vin_LTmax_default))
  111. // {
  112. // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = Vin_LTmin_default;
  113. // }
  114. if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Default_Voltage_Max)
  115. {
  116. DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = 0;
  117. }
  118. // if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i])
  119. // {
  120. // temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i];
  121. // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i];
  122. // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = temp3;
  123. // }
  124. // if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Iout_LTmax_default))
  125. // {
  126. // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = Iout_LTmax_default;
  127. // }
  128. if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Default_Current_Max)
  129. {
  130. DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = 0;
  131. }
  132. // if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] > Iout_LTmax_default))
  133. // {
  134. // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = Iout_LTmin_default;
  135. // }
  136. // if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i])
  137. // {
  138. // temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i];
  139. // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i];
  140. // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = temp3;
  141. // }
  142. }
  143. DCPDU_Modbus_Reg[DCPDU_RL_Allon_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Allon_Addr];
  144. DCPDU_Modbus_Reg[DCPDU_RL_Alloff_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Alloff_Addr];
  145. for(i = 0;i < RELAY_ChN_default;i++)
  146. {
  147. for(j = 0;j < 4;j++)
  148. {
  149. temp0 = 8 * j;
  150. temp0 = 24 - temp0;
  151. temp1 = 4 * i;
  152. temp1 += j;
  153. DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] += Eeprom_Rbuf[ERom_WLit1_max_Addr + temp1] << temp0;
  154. DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] += Eeprom_Rbuf[ERom_kWhLit1_max_Addr + temp1] << temp0;
  155. }
  156. if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] > Default_Power_Max)
  157. {
  158. DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] = 0;
  159. }
  160. if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] > Default_Consum_Max)
  161. {
  162. DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] = 0;
  163. }
  164. }
  165. // read channel status
  166. for(i = 0;i < RELAY_ChN_default;i++)
  167. {
  168. uint8_t temp = i << 1;
  169. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr+temp]; //Read channel status
  170. if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
  171. {
  172. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmax_Threshould_Disable);
  173. }
  174. if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr+i] < THRESHOULD_JUDGMENT)
  175. {
  176. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmin_Threshould_Disable);
  177. }
  178. if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr+i] < THRESHOULD_JUDGMENT)
  179. {
  180. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Imax_Threshould_Disable);
  181. }
  182. if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
  183. {
  184. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Wmax_Threshould_Disable);
  185. }
  186. if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
  187. {
  188. DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
  189. }
  190. }
  191. //read over func
  192. for(i = 0;i < RELAY_ChN_default;i++)
  193. {
  194. DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = Eeprom_Rbuf[ERom_RL_Over_Func_Ch1+i];
  195. if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] >0x0F)
  196. {
  197. DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = 0;
  198. }
  199. }
  200. for(i = 0; i < 4;i ++)
  201. {
  202. temp0 = 8 * i;
  203. temp0 = 24 - temp0;
  204. DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Max] += (Eeprom_Rbuf[ERom_All_Thr_V_Max_Addr + i] << temp0);
  205. DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Min] += (Eeprom_Rbuf[ERom_All_Thr_V_Min_Addr + i] << temp0);
  206. DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_I_Max] += (Eeprom_Rbuf[ERom_All_Thr_I_Max_Addr + i] << temp0);
  207. DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_P_Max] += (Eeprom_Rbuf[ERom_All_Thr_P_Max_Addr + i] << temp0);
  208. DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_C_Max] += (Eeprom_Rbuf[ERom_All_Thr_C_Max_Addr + i] << temp0);
  209. }
  210. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] = 0xFFFFFFFF;
  211. if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Max] <= THRESHOULD_JUDGMENT)
  212. {
  213. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Vmax_Threshould_Disable);
  214. }
  215. if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Min] <= THRESHOULD_JUDGMENT)
  216. {
  217. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Vmin_Threshould_Disable);
  218. }
  219. if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_I_Max] <= THRESHOULD_JUDGMENT)
  220. {
  221. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Imax_Threshould_Disable);
  222. }
  223. if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_P_Max] <= THRESHOULD_JUDGMENT)
  224. {
  225. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Wmax_Threshould_Disable);
  226. }
  227. if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_C_Max] <= THRESHOULD_JUDGMENT)
  228. {
  229. DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Kwhmax_Threshould_Disable);
  230. }
  231. DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] = Eeprom_Rbuf[ERom_All_Over_Func_Addr];
  232. if(DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] > 0x0000002F)
  233. {
  234. DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] = 0;
  235. }
  236. }
  237. /*********************************************************************************************************
  238. * API函数实现
  239. *********************************************************************************************************/
  240. void WriteEeprom(void)
  241. {
  242. uint8_t i = 0;
  243. uint8_t j = 0;
  244. uint32_t temp0 = 0;
  245. uint32_t temp1 = 0;
  246. uint32_t temp2 = 0;
  247. uint32_t temp3 = 0;
  248. uint32_t temp4 = 0;
  249. uint32_t temp5 = 0;
  250. Eeprom_Rbuf[ERom_RL_Ch_N_addr] = RELAY_ChN_default;
  251. Eeprom_Rbuf[ERom_RL_ST_Addr] = DCPDU_Modbus_Reg[DCPDU_RL_ST_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit;
  252. Eeprom_Rbuf[ERom_RLft_ST_Addr] = DCPDU_Modbus_Reg[DCPDU_RLft_ST_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit;
  253. for(i = 0;i <RELAY_ChN_default;i++)
  254. {
  255. Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] = DCPDU_Modbus_Reg[DCPDU_RL_Ton1_Addr + i - DCPDU_Modbus_RegStAd];
  256. Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] = DCPDU_Modbus_Reg[DCPDU_RL_Toff1_Addr + i - DCPDU_Modbus_RegStAd];
  257. }
  258. Eeprom_Rbuf[ERom_RL_Allon_Addr] = DCPDU_Modbus_Reg[DCPDU_RL_Allon_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit;
  259. Eeprom_Rbuf[ERom_RL_Alloff_Addr] = DCPDU_Modbus_Reg[DCPDU_RL_Alloff_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit;
  260. temp0 = DCPDU_VLit1_max_Addr - DCPDU_Modbus_RegStAd;
  261. temp1 = DCPDU_VLit1_min_Addr - DCPDU_Modbus_RegStAd;
  262. temp4 = DCPDU_ILit1_max_Addr - DCPDU_Modbus_RegStAd;
  263. temp5 = DCPDU_ILit1_min_Addr - DCPDU_Modbus_RegStAd;
  264. for(i = 0;i <RELAY_ChN_default;i++)
  265. {
  266. for(j = 0;j < 4;j++)
  267. {
  268. temp2 = 8 * j;
  269. temp2 = 24 - temp2;
  270. temp3 = 4 * i;
  271. temp3 += j;
  272. Eeprom_Rbuf[ERom_VLit1_max_Addr + temp3] = DCPDU_Modbus_Reg[temp0 + i] >> temp2;
  273. Eeprom_Rbuf[ERom_VLit1_min_Addr + temp3] = DCPDU_Modbus_Reg[temp1 + i] >> temp2;
  274. Eeprom_Rbuf[ERom_ILit1_max_Addr + temp3] = DCPDU_Modbus_Reg[temp4 + i] >> temp2;
  275. Eeprom_Rbuf[ERom_ILit1_min_Addr + temp3] = DCPDU_Modbus_Reg[temp5 + i] >> temp2;
  276. }
  277. }
  278. AT24CxxWrite(ERom_RL_Ch_N_addr,Eeprom_Rbuf,RELAY_para_sum);
  279. }