Files
RS485_T1_Transition/Source/SYSTEM/eeprom.c
yeyangwen 13980737e3 feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
2026-02-09 17:32:59 +08:00

337 lines
8.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "includes.h"
E_PARA_INFO g_eeprom;
E_MCU_DEV_INFO g_mcu_dev;
U8_T EEPROM_CheckSum(U8_T *data,U16_T len)
{
U8_T data_sum = 0;
for(U16_T i = 0;i<len;i++)
{
data_sum += data[i];
}
return data_sum;
}
void EEPROM_Init(void){
U8_T rev = 0;
EnIFCClk; //使能 IFC 时钟
IFC->MR |= 0x10002; //高速模式,延迟 2 个周期
delay_nms(10);
memset(&g_eeprom,0,sizeof(E_PARA_INFO));
rev = EEPROM_ReadParaInfo(&g_eeprom);
if(rev == 0x00){
//读取成功,开始校验以下参数
EEPROM_Validate_ParaInfo(&g_eeprom);
}else{
//读取失败,恢复默认参数
EEPROM_Default_ParaInfo(&g_eeprom);
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info Use Default:%d",g_eeprom.pipe_flag);
}
}
U8_T EEPROM_ReadParaInfo(E_PARA_INFO *info){
U8_T read_info[6];
U8_T para_data[EEPROM_APP_DATA_Size_Max];
U16_T read_len = 0;
memset(read_info,0,sizeof(read_info));
memset(para_data,0,sizeof(para_data));
ReadDataArry_U8(EEPROM_ParaInfo_Address,4,read_info);
if(read_info[0] == EEPROM_APP_SVAE_FLAG){
read_len = read_info[2];
read_len <<= 8;
read_len |= read_info[1];
if(read_len <= EEPROM_APP_DATA_Size_Max){
ReadDataArry_U8(EEPROM_ParaInfo_Address+EEPROM_Offset_Data,read_len,para_data);
if(EEPROM_CheckSum(para_data,sizeof(E_PARA_INFO)) == read_info[3]){
//校验成功
memcpy((uint8_t *)info,para_data,sizeof(E_PARA_INFO));
return 0x00;
}
}
}
return 0x01;
}
U8_T EEPROM_WriteParaInfo(E_PARA_INFO *info){
U8_T save_data[EEPROM_APP_DATA_Size_Max + 6];
U16_T save_len = sizeof(E_PARA_INFO);
if(save_len >= EEPROM_APP_DATA_Size_Max) save_len = EEPROM_APP_DATA_Size_Max;
save_data[0] = EEPROM_APP_SVAE_FLAG;
save_data[1] = save_len & 0xFF;
save_data[2] = (save_len >> 8) & 0xFF;
memcpy(&save_data[4],(uint8_t *)info,save_len);
save_data[3] = EEPROM_CheckSum(&save_data[4],save_len);
save_len+=4;
Page_ProgramData(EEPROM_ParaInfo_Address,save_len,save_data);
return 0;
}
U8_T EEPROM_ClearParaInfo(void){
U8_T save_data[EEPROM_APP_DATA_Size_Max+10];
UINT16 save_len = sizeof(E_PARA_INFO);
if(save_len >= EEPROM_APP_DATA_Size_Max) save_len = EEPROM_APP_DATA_Size_Max;
save_len += 4;
memset(save_data,0xFF,save_len);
Page_ProgramData(EEPROM_ParaInfo_Address,save_len,save_data);
return 0;
}
U8_T EEPROM_Validate_ParaInfo(E_PARA_INFO *info){
U8_T i=0;
//以下为本地参数
// //温差
// if(info->temp_diff > 18 ){
// info->temp_diff = EEPROM_TempDifference_Default; //默认
// }
// Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info temp_diff %d",info->temp_diff);
//
// //温度显示单位
// if(info->temp_select > 0x02 ){
// info->temp_select = EEPROM_TempSelect_Default; //默认保护电流为10A
// }
//
//
// if(info->backlight_en >= 0x02)
// {
// info->backlight_en = 0x00;
// }
//
// if(info->pipe_flag > 0x02)
// {
// info->pipe_flag = 0x00;
// }
//
// if((info->dev_addr == 0x00) || (info->dev_addr == 0xff))
// {
// info->dev_addr = 0x01;
// }
//
// //按键灵敏度
// if(info->key_sens_level > 2)
// {
// info->key_sens_level = EEPROM_TouchLevel_Default; //默认中灵敏度
// }
//
// //显示语言
// if(info->langue_select > 2)
// {
// info->langue_select = EEPROM_LangueSelect_Default;//默认中英文混合
// }
//设备端口类型
if(info->dev_port > 2) //2024-12-16
{
info->dev_port = POLLING_PORT; //默认轮训端口
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info temp unit:%d backlight_en:%d key_sens_level:%d device_addr:%d device_port:%d",\
info->temp_select,info->backlight_en,info->key_sens_level,info->dev_addr,info->dev_port);
return 0;
}
/*恢复默认值*/
void EEPROM_Default_ParaInfo(E_PARA_INFO *info){
info->dev_addr = 0x01;
info->pipe_flag = 0x00;
info->temp_diff = EEPROM_TempDifference_Default;
info->temp_select = EEPROM_TempSelect_Default;
info->backlight_en = 0x00;
info->key_sens_level = EEPROM_TouchLevel_Default;
info->langue_select = EEPROM_LangueSelect_Default;
info->dev_port = POLLING_PORT; //2024-12-16
}
/*************<- boot ->****************/
/*******************************************************************************
* Function Name : EEPROM_ReadMCUDevInfo
* Description : 从EEPROM中读取设备信息
*******************************************************************************/
U8_T EEPROM_ReadMCUDevInfo(E_MCU_DEV_INFO *info)
{
U8_T read_info[6];
U8_T para_data[EEPROM_DATA_Size_Max];
U16_T read_len = 0;
memset(read_info,0,sizeof(read_info));
memset(para_data,0,sizeof(para_data));
ReadDataArry_U8(EEPROM_MCUDevInfo_Address,4,read_info);
if(read_info[0] == EEPROM_SVAE_FLAG){
read_len = read_info[2];
read_len <<= 8;
read_len |= read_info[1];
if(read_len <= EEPROM_DATA_Size_Max){
ReadDataArry_U8(EEPROM_MCUDevInfo_Address+EEPROM_Offset_Data,read_len,para_data);
if(EEPROM_CheckSum(para_data,sizeof(E_MCU_DEV_INFO)) == read_info[3]){
//校验成功
memcpy((uint8_t *)info,para_data,sizeof(E_MCU_DEV_INFO));
#if DBG_LOG_EN
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevAddr:%d",g_mcu_dev.dev_addr);
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevType:%d",g_mcu_dev.dev_type);
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevBootVer:%d",g_mcu_dev.dev_boot_ver);
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevAppVer:%d",g_mcu_dev.dev_app_ver);
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevNameLen:%d",g_mcu_dev.dev_name_len);
Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevName:%s",g_mcu_dev.dev_name);
#endif
return 0x00;
}
}
}
return 0x01;
}
/*******************************************************************************
* Function Name : EEPROM_WriteMCUDevInfo
* Description : 将设备信息写入到EEPROM中
*******************************************************************************/
U8_T EEPROM_WriteMCUDevInfo(E_MCU_DEV_INFO *info)
{
U8_T save_data[EEPROM_DATA_Size_Max + 6];
U16_T save_len = sizeof(E_MCU_DEV_INFO);
if(save_len >= EEPROM_DATA_Size_Max) save_len = EEPROM_DATA_Size_Max;
save_data[0] = EEPROM_SVAE_FLAG;
save_data[1] = save_len & 0xFF;
save_data[2] = (save_len >> 8) & 0xFF;
memcpy(&save_data[4],(uint8_t *)info,save_len);
save_data[3] = EEPROM_CheckSum(&save_data[4],save_len);
save_len+=4;
Page_ProgramData(EEPROM_MCUDevInfo_Address,save_len,save_data);
return 0;
}
/*******************************************************************************
* Function Name : EEPROM_Default_MCUDevInfo
* Description : EEPROM中参数恢复默认值且将默认参数保存至EEPROM中
*******************************************************************************/
void EEPROM_Default_MCUDevInfo(E_MCU_DEV_INFO *info)
{
#if (Project_Area == 0x01)
/*Boot 区域*/
info->dev_addr = 0x00;
info->dev_type = 0x00;
info->dev_app_ver = 0x00;
info->dev_boot_ver = Project_FW_Version;
info->dev_name_len = sizeof(Peoject_Name);
memset((char *)info->dev_name,0,EEPROM_DEV_NAME_Size);
memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len);
EEPROM_WriteMCUDevInfo(info);
#elif (Project_Area == 0x02)
/*APP 区域*/
info->dev_addr = 0x01;
info->dev_type = Project_Type;
info->dev_app_ver = Project_FW_Version;
info->dev_name_len = sizeof(Peoject_Name);
memset((char *)info->dev_name,0,EEPROM_DEV_NAME_Size);
memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len);
EEPROM_WriteMCUDevInfo(info);
#endif
}
/*******************************************************************************
* Function Name : EEPROM_Validate_MCUDevInfo
* Description : 校验从EEPROM 中读取的参数是否正确,如果不正确的话,便将当前正确的参数写入
APP区域中判断APP参数与EEPROM中记录的是否一致
Boot区域中判断Boot参数与EEPROM中记录的是否一致
*******************************************************************************/
void EEPROM_Validate_MCUDevInfo(E_MCU_DEV_INFO *info)
{
#if (Project_Area == 0x01)
/*Boot 区域*/
U8_T save_flag = 0;
if(info->dev_boot_ver != Project_FW_Version)
{
info->dev_boot_ver = Project_FW_Version;
save_flag = 0x01;
}
if(save_flag == 0x01)
{
EEPROM_WriteMCUDevInfo(info);
}
#elif (Project_Area == 0x02)
/*APP 区域*/
U8_T save_flag = 0;
if(info->dev_app_ver != Project_FW_Version)
{
info->dev_app_ver = Project_FW_Version;
save_flag = 0x01;
}
if(info->dev_type != Project_Type)
{
info->dev_type = Project_Type;
save_flag = 0x01;
}
if(info->dev_name_len != sizeof(Peoject_Name))
{
info->dev_name_len = sizeof(Peoject_Name);
save_flag = 0x01;
}
if(strncmp((char *)info->dev_name,(char *)Peoject_Name,sizeof(Peoject_Name)))
{
memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len);
save_flag = 0x01;
}
if(save_flag == 0x01)
{
EEPROM_WriteMCUDevInfo(info);
}
#endif
}