?? 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 + -