📄 i2c.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : AUX VRV 柜机/挂机
COMPILER : AVR GCC/ICC
MODULE : i2c.c
VERSION : 1.0.0
DATE : 2005/12/30
AUTHOR : 朱坤
DESCRIPTION : EEPROM routine
MODIFICATIONS :
******************************************************************************/
#include "i2c.h"
#include "ports.h"
#include "main.h"
#include "timer.h"
#include "swing.h"
#include "rem.h"
#include "fan.h"
#ifdef EnEEPROM
u8 EEPTm; /* EEPROM 刷新时间间隔 20mS on 4mS */
u8 EEPCnt; /* 参数序号,参数地址 * 2 */
u8 EEPBuf0; /* 缓冲区,双字节 */
u8 EEPBuf1;
#ifdef EnDEBUG
u8 EEPTBuf[EEPIDMAX];
#endif
/*-----------------------------------------------------------------------------
ROUTINE NAME : SaveToEEPROM
INPUT/OUTPUT :
EEPCnt: 参数代号,每个参数在 EEPROM 中占 2 个字节,因此,参数在 EEPROM
中的地址为:EEPcnt*2
EEPBuf: 缓冲区指针,存放待写的参数值
EEPTm: 刷新时间间隔 20mS on 4mS
EEPIDMAX: 参数个数
DESCRIPTION : 向 EEPROM 写参数,EEPMAX 定义每个参数字节数
在给定的时间间隔内,不停的刷新 EEPROM 中的参数
COMMENTS :
; 掉电记忆保存的内容(共15项)
; - 标示字节 5D
; - 内机配置字节 SysConfig
; - 设定温度 SetupTp
; - 内机工作模式 RunMode
; - 内机风机风速 FanStatus
; - 摆风状态 FDoorUnit
; - 内机功率 PowerConst
; - 摆风位置记忆 BjSaveL
; BjSaveH
; - 制热时内机补偿温度 SetOffset
; - 内机ID WJ_NJNo
; - 制冷调阀零点 SetOnCool
; - 制热调阀零点 SetOnHeat
; - 非调节温度 SetUnacc
; - 制热膨胀阀常开开度 SetOn
-----------------------------------------------------------------------------*/
void SaveToEEPROM(void)
{
u8 i;
if (EEPTm++ >= 100){
EEPTm = 0; /* 清除间隔 */
if (++EEPCnt >= EEPIDMAX) EEPCnt = 0;
/* 修改参数时不更新内机参数 */
//if ((AckTm >= 180) && (EEPCnt >= 6)) EEPCnt = 0;
switch (EEPCnt){ /* 对参数进行处理 */
case 0:
i = 0x5D; /* 标示字节 5D */
break;
case 1:
i = SysConfig; /* 内机配置字节*/
break;
case 2:
i = SetupTp; /* 设定温度(0x00-0F) */
break;
case 3:
i = RunMode; /* 开关机标志,内机工作模式 */
break;
case 4:
i = FanStatus; /* 内风机风速 */
break;
#ifdef EnSWING
case 5:
i = FDoorUnit; /* 扫风模式 */
break;
#endif
case 6:
i = PowerConst; /* 内机功率 */
break;
case 9:
#ifdef ChigoXG1
#ifndef ChigoXG1Set
i = SetOffset; /* 制热时内机补偿温度 */
#else
i = ChigoXG1Set;
#endif
#else
i = 0x80;
#endif
break;
#ifdef EnSTYLE5
case 10:
i = WJ_NJNo; /* 内机ID */
break;
case 11:
i = SetOnCool; /* 制冷调阀零点 */
break;
case 12:
i = SetOnHeat; /* 制热调阀零点 */
break;
case 13:
i = SetUnacc; /* 非调节温度 */
break;
case 14:
i = SetOn; /* 制热膨胀阀常开开度 */
break;
#endif /* EnSTYLE5 */
default:
i = 0;
break;
}
EEPBuf0 = EEPROMReadByte((u16)(EEPCnt << 1));
EEPBuf1 = EEPROMReadByte((u16)((EEPCnt << 1) + 1));
if ((i != EEPBuf0) || (i != EEPBuf1)){
EEPROMWriteByte((u16)(EEPCnt << 1), i); /* 刷新 */
EEPROMWriteByte((u16)((EEPCnt << 1) + 1), i);
}
}
}
void EEPROMWriteByte(u16 uiAddress, u8 ucData)
{
WWD_Refresh(); /* 刷新看门狗 */
/* Wait for completion of previous write */
/* EECR: - - - - EERIE EEMWE EEWE EERE */
while(EECR & (1<<EEWE));
/* 等待 SPM 完成 */
while (SPMCR & (1<<RWWSB));
/* Set up address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
DisableInterrupts(); /* 禁止中断 */
EECR |= (1<<EEMWE); /* Write logical one to EEMPE */
EECR |= (1<<EEWE); /* Start eeprom write by setting EEPE */
EnableInterrupts();
}
u8 EEPROMReadByte(u16 uiAddress)
{
WWD_Refresh(); /* 刷新看门狗 */
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* 等待 SPM 完成 */
while (SPMCR & (1<<RWWSB));
EEAR = uiAddress; /* Set up address register */
EECR |= (1<<EERE); /* Start eeprom read by writing EERE */
return EEDR; /* Return data from Data Register */
}
#endif
void GetFromEEPROM(void)
{
SysConfig = (u8)(1<<fEnMemo);
RunMode = (u8)((1<<fLtdSwOn)|MODEAUTO);
// FanStatus = FANAUTO_S;
// SetFDoorUnit(SWINGAUTO);
SetupTp = 0x80 + 24; /* 设置缺省值 24 */
#ifdef ChigoXG1
#ifndef ChigoXG1Set
SetOffset = ChigoXG1Val;
#endif
#endif
#ifdef EnSTYLE5
PowerConst = 5; /* 2500W */
SetOnCool = 0x81; /* 1 -10 - 10 */
SetOnHeat = 0x7F; /* -1 -10 - 10 */
WJ_NJNo = 1; /* 缺省 1# */
SetUnacc = 1; /* 1 0 - 10 */
SetOn = 100; /* 100 */
#else
#if (NJTYPE == 0)||(NJTYPE == 1)||(NJTYPE == 3)||(NJTYPE == 4)
PowerConst = 3; /* 1.5P */
#elif (NJTYPE == 2)||(NJTYPE == 5)
PowerConst = 6; /* 3P */
#endif
#endif /* EnSTYLE5 */
#ifdef EnEEPROM
EEPCnt = 0;
while (EEPCnt < EEPIDMAX){
EEPBuf0 = EEPROMReadByte((u16)(EEPCnt << 1));
EEPBuf1 = EEPROMReadByte((u16)((EEPCnt << 1) + 1));
if (EEPBuf0 == EEPBuf1){
if ((EEPCnt != 7) && (EEPBuf0 == 0x0FF)){
EEPCnt = EEPIDMAX;
}
switch(EEPCnt){ /* 对参数进行处理 */
case 0:
if (EEPBuf0 != 0x5D) EEPCnt = EEPIDMAX;
break;
case 1:
if ((u8)(EEPBuf0 & ~SYSCONMASK) == 0){
SysConfig = EEPBuf0; /* 内机配置字节 */
}
break;
case 2: /* 设定温度 */
if ((EEPBuf0 >= SetupTpMIN) &&
(EEPBuf0 <= SetupTpMAX)) SetupTp = EEPBuf0;
break;
case 3: /* 开关机标志,内机工作模式 */
if (ValBit(SysConfig,fEnMemo)){ /* 1: 允许掉电记忆 */
RunMode = (u8)(EEPBuf0 & ((1<<fSysOnOff)|(1<<fLtdSwOn)|MODEMASK));
SetBit(Sysflag,fSysInit); /* 1:系统初始化标志 */
} else {
RunMode = (u8)(EEPBuf0 & ((1<<fLtdSwOn)|MODEMASK));
}
break;
case 4:
FanStatus = (u8)(EEPBuf0 & FANMASK_S); /* 内风机风速 */
break;
#ifdef EnSWING
case 5:
FDoorUnit = (u8)(EEPBuf0 & SWINGMASK); /* 扫风模式 */
break;
#endif
case 6:
if (EEPBuf0 != 0) PowerConst = EEPBuf0; /* 内机功率 */
break;
#ifdef ChigoXG1
#ifndef ChigoXG1Set
case 9: /* 制热时内机补偿温度 */
if ((EEPBuf0 >= 118) &&
(EEPBuf0 <= 138)) SetOffset = EEPBuf0;
break;
#endif
#endif
#ifdef EnSTYLE5
case 10:
if (((EEPBuf0 & NJNOMASK) >= WJ_NJNoMIN) &&
((EEPBuf0 & NJNOMASK) <= WJ_NJNoMAX)){
WJ_NJNo = EEPBuf0;
}
break;
case 11: /* 制冷调阀零点 -10 - 10 */
if ((EEPBuf0 >= 118) &&
(EEPBuf0 <= 138)) SetOnCool = EEPBuf0;
break;
case 12: /* 制热调阀零点 -10 - 10 */
if ((EEPBuf0 >= 118) &&
(EEPBuf0 <= 138)) SetOnHeat = EEPBuf0;
break;
case 13: /* 非调节温度 0 - 10 */
if (EEPBuf0 <= 10) SetUnacc = EEPBuf0;
break;
case 14: /* 制热膨胀阀常开开度 */
if (EEPBuf0 >= 40) SetOn = EEPBuf0;
break;
#endif /* EnSTYLE5 */
default:
break;
}
}
EEPCnt++; /* 下一个参数 */
}
#endif /* EnEEPROM */
}
/*** (c) 2005 佛山菱电 **************************** END OF FILE *************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -