/********************************************************************************************************* * 模块名称:ReadEeprom.c * 摘 要:ReadEeprom模块,进行独立按键初始化,以及按键扫描函数实现 * 当前版本:1.0.0 * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.) * 完成日期:2021年07月01日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "ReadEeprom.h" #include "Main.h" #include "gd32e230x_conf.h" #include "At24cxx.h" #include "string.h" #include "Relay.h" #include "Sn74hc573.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ extern DCPDU_RELAY_Para_Reg DCPDU_RL_time; /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ uint8_t Eeprom_Rbuf[RELAY_para_sum]={0}; extern uint8_t DCPDU_active_chn; extern uint8_t Active_state_bit; extern uint32_t DCPDU_Modbus_Reg[DCPDU_Modbus_Reg_len]; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:ReadEeprom * 函数功能:读出Eeprom的数据 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void ReadEeprom(void) { uint8_t i = 0; uint8_t j = 0; uint32_t temp0 = 0; uint32_t temp1 = 0; uint32_t temp2 = 0; uint32_t temp3 = 0; AT24CxxRead(0, Eeprom_Rbuf, RELAY_para_sum); //从eeprom中读出通道开启延时数据 if((Eeprom_Rbuf[ERom_RL_Ch_N_addr] < 1) || (Eeprom_Rbuf[ERom_RL_Ch_N_addr] > RELAY_ChN_default)) { Eeprom_Rbuf[ERom_RL_Ch_N_addr] = RELAY_ChN_default; } DCPDU_active_chn = Eeprom_Rbuf[ERom_RL_Ch_N_addr]; DCPDU_Modbus_Reg[DCPDU_RL_ST_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_ST_Addr]; DCPDU_Modbus_Reg[DCPDU_RLft_ST_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RLft_ST_Addr]; for(i = 0;i < RELAY_ChN_default;i++) { if((Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] < 1) || (Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] > RELAY_ontime_max)) { Eeprom_Rbuf[ERom_RL_Ton1_Addr + i] = RELAY_ontime_default; } if((Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] < 1) || (Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] > RELAY_offtime_max)) { Eeprom_Rbuf[ERom_RL_Toff1_Addr + i] = RELAY_offtime_default; } DCPDU_Modbus_Reg[DCPDU_RL_Ton1_Addr + i - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Ton1_Addr + i]; DCPDU_Modbus_Reg[DCPDU_RL_Toff1_Addr + i - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Toff1_Addr + i]; DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = 0; DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = 0; DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = 0; DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = 0; temp0 = 4 * i; DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0 + 3] = 0; for(j = 0;j < 4;j++) { temp2 = 8 * j; temp2 = 24 - temp2; temp3 = 4 * i; temp3 += j; DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] += (Eeprom_Rbuf[ERom_VLit1_max_Addr + temp3] << temp2); DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] += (Eeprom_Rbuf[ERom_VLit1_min_Addr + temp3] << temp2); DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] += (Eeprom_Rbuf[ERom_ILit1_max_Addr + temp3] << temp2); DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] += (Eeprom_Rbuf[ERom_ILit1_min_Addr + temp3] << temp2); DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0 + 3] += (Eeprom_Rbuf[ERom_TotalWh1_Addr + temp3] << temp2); //read } // 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)) // { // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = Vin_LTmax_default; // } if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Default_Voltage_Max) { DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = 0; } // 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)) // { // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = Vin_LTmin_default; // } if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Default_Voltage_Max) { DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = 0; } // if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i]) // { // temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i]; // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i]; // DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = temp3; // } // 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)) // { // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = Iout_LTmax_default; // } if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Default_Current_Max) { DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = 0; } // 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)) // { // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = Iout_LTmin_default; // } // if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i]) // { // temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i]; // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i]; // DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = temp3; // } } DCPDU_Modbus_Reg[DCPDU_RL_Allon_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Allon_Addr]; DCPDU_Modbus_Reg[DCPDU_RL_Alloff_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Alloff_Addr]; for(i = 0;i < RELAY_ChN_default;i++) { for(j = 0;j < 4;j++) { temp0 = 8 * j; temp0 = 24 - temp0; temp1 = 4 * i; temp1 += j; DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] += Eeprom_Rbuf[ERom_WLit1_max_Addr + temp1] << temp0; DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] += Eeprom_Rbuf[ERom_kWhLit1_max_Addr + temp1] << temp0; } if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] > Default_Power_Max) { DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] = 0; } if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] > Default_Consum_Max) { DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] = 0; } } // read channel status for(i = 0;i < RELAY_ChN_default;i++) { uint8_t temp = i << 1; DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr+temp]; //Read channel status if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr+i] < THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr+i] < THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmin_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr+i] < THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Imax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr+i] < THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Wmax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr+i] < THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Kwhmax_Threshould_Disable); } } //read over func for(i = 0;i < RELAY_ChN_default;i++) { DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = Eeprom_Rbuf[ERom_RL_Over_Func_Ch1+i]; if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] >0x0F) { DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = 0; } } for(i = 0; i < 4;i ++) { temp0 = 8 * i; temp0 = 24 - temp0; DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Max] += (Eeprom_Rbuf[ERom_All_Thr_V_Max_Addr + i] << temp0); DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Min] += (Eeprom_Rbuf[ERom_All_Thr_V_Min_Addr + i] << temp0); DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_I_Max] += (Eeprom_Rbuf[ERom_All_Thr_I_Max_Addr + i] << temp0); DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_P_Max] += (Eeprom_Rbuf[ERom_All_Thr_P_Max_Addr + i] << temp0); DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_C_Max] += (Eeprom_Rbuf[ERom_All_Thr_C_Max_Addr + i] << temp0); } DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] = 0xFFFFFFFF; if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Max] <= THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Vmax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_V_Min] <= THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Vmin_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_I_Max] <= THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Imax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_P_Max] <= THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Wmax_Threshould_Disable); } if(DCPDU_Modbus_Reg[Mb_Dbuff_Thr_All_C_Max] <= THRESHOULD_JUDGMENT) { DCPDU_Modbus_Reg[Mb_Dbuff_ALL_ST_FT_Addr] &= (Shield_Kwhmax_Threshould_Disable); } DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] = Eeprom_Rbuf[ERom_All_Over_Func_Addr]; if(DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] > 0x0000002F) { DCPDU_Modbus_Reg[Mb_Dbuff_Over_All_Func] = 0; } } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ void WriteEeprom(void) { uint8_t i = 0; uint8_t j = 0; uint32_t temp0 = 0; uint32_t temp1 = 0; uint32_t temp2 = 0; uint32_t temp3 = 0; uint32_t temp4 = 0; uint32_t temp5 = 0; Eeprom_Rbuf[ERom_RL_Ch_N_addr] = RELAY_ChN_default; Eeprom_Rbuf[ERom_RL_ST_Addr] = DCPDU_Modbus_Reg[DCPDU_RL_ST_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit; Eeprom_Rbuf[ERom_RLft_ST_Addr] = DCPDU_Modbus_Reg[DCPDU_RLft_ST_Addr - DCPDU_Modbus_RegStAd] & Active_state_bit; for(i = 0;i > temp2; Eeprom_Rbuf[ERom_VLit1_min_Addr + temp3] = DCPDU_Modbus_Reg[temp1 + i] >> temp2; Eeprom_Rbuf[ERom_ILit1_max_Addr + temp3] = DCPDU_Modbus_Reg[temp4 + i] >> temp2; Eeprom_Rbuf[ERom_ILit1_min_Addr + temp3] = DCPDU_Modbus_Reg[temp5 + i] >> temp2; } } AT24CxxWrite(ERom_RL_Ch_N_addr,Eeprom_Rbuf,RELAY_para_sum); }