?? i2c.c
字號(hào):
/**************** (c) 2005 佛山菱電 *****************************************
PROJECT : 簡(jiǎn)易風(fēng)盤控制器
COMPILER : AVR ICC for m48
MODULE : i2c.c
VERSION : 1.0.0
DATE : 2005/12/12
AUTHOR : 朱坤
DESCRIPTION : EEPROM AT24C02 routine
MODIFICATIONS :
******************************************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include "lib.h"
#include "version.h"
#include "ports.h"
#include "main.h"
#include "timer.h"
#include "fan.h"
#include "i2c.h"
#ifdef EnEEPROM
u8 EEPTm; /* EEPROM 刷新時(shí)間間隔 20mS on 4mS */
u8 EEPCnt; /* 參數(shù)序號(hào),參數(shù)地址 * 2 */
u8 EEPBuf0; /* 緩沖區(qū) */
u8 EEPBuf1; /* 緩沖區(qū) */
/*-----------------------------------------------------------------------------
ROUTINE NAME : SaveToEEPROM
INPUT/OUTPUT :
EEPCnt: 參數(shù)代號(hào),每個(gè)參數(shù)在 EEPROM 中占 2 個(gè)字節(jié),因此,參數(shù)在 EEPROM
中的地址為:EEPcnt*2
EEPBuf: 緩沖區(qū)指針,存放待寫的參數(shù)值
EEPTm: 刷新時(shí)間間隔 20mS on 4mS
EEPIDMAX: 參數(shù)個(gè)數(shù)
DESCRIPTION:
在給定的時(shí)間間隔內(nèi),不停的刷新 EEPROM 中的參數(shù)
COMMENTS :
; 掉電記憶保存的內(nèi)容(共9項(xiàng))
; - 標(biāo)示字節(jié) 5D
; - 內(nèi)機(jī)配置字節(jié) SysConfig
; - 設(shè)定溫度 SetupTp
; - 內(nèi)機(jī)工作模式 RunMode
; - 內(nèi)機(jī)風(fēng)機(jī)風(fēng)速 FanStatus
; - 擺風(fēng)狀態(tài) FDoorUnit
; - 內(nèi)機(jī)功率 PowerConst
; - 制熱時(shí)內(nèi)機(jī)補(bǔ)償溫度 SetOffset
; - 內(nèi)機(jī)ID NeijiNo
-----------------------------------------------------------------------------*/
void SaveToEEPROM(void)
{
u8 i;
if (EEPTm++ >= 100){
EEPTm = 0; /* 清除間隔 */
if (++EEPCnt >= EEPIDMAX) EEPCnt = 0;
switch (EEPCnt){ /* 對(duì)參數(shù)進(jìn)行處理 */
case 0:
i = 0x5D; /* 標(biāo)示字節(jié) 5D */
break;
case 1:
i = SysConfig; /* 內(nèi)機(jī)配置字節(jié)*/
break;
case 2:
i = SetupTp; /* 設(shè)定溫度(0x00-0F) */
break;
case 3:
i = RunMode; /* 開關(guān)機(jī)標(biāo)志,內(nèi)機(jī)工作模式 */
break;
case 4:
i = FanStatus; /* 內(nèi)風(fēng)機(jī)風(fēng)速 */
break;
case 5:
#ifdef EnSWING
i = FDoorUnit; /* 掃風(fēng)模式 */
#else
i = 0;
#endif
break;
case 7:
#ifdef ChigoXG1
#ifndef ChigoXG1Set
i = SetOffset; /* 制熱時(shí)內(nèi)機(jī)補(bǔ)償溫度 */
#else
i = ChigoXG1Set;
#endif
#else
i = 0x80;
#endif
break;
case 8:
i = NeijiNo; /* 內(nèi)機(jī)ID */
break;
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);
{
wdt_reset(); /* 刷新看門狗 */
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* 等待 SPM 完成 */
while (SPMCSR & (1<<SELFPRGEN));
/* Set up address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
cli(); /* 禁止中斷 */
EECR |= (1<<EEMPE); /* Write logical one to EEMPE */
EECR |= (1<<EEPE); /* Start eeprom write by setting EEPE */
sei();
}
void EEPROMReadByte(u16 uiAddress);
{
wdt_reset(); /* 刷新看門狗 */
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* 等待 SPM 完成 */
while (SPMCSR & (1<<SELFPRGEN));
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)
{
//SPMCSR = 0x00; /* 禁止 SPM 中斷 */
SysConfig = (u8)(1 << fEnMemo);
RunMode = (u8)((1 << fLtdSwOn)|MODEAUTO);
FanStatus = FANAUTO_S;
#ifdef EnSWING
FDoorUnit = SWINGAUTO;
#endif
SetupTp = (u8)(0x80 + 24); /* 設(shè)置缺省值 24 */
NeijiNo = 1; /* 缺省 1# */
#ifdef ChigoXG1
#ifndef ChigoXG1Set
SetOffset = ChigoXG1Val;
#endif
#endif
#ifdef EnEEPROM
EEPCnt = 0;
while (EEPCnt < EEPIDMAX){
EEPBuf0 = EEPROMReadByte((u16)(EEPCnt << 1));
EEPBuf1 = EEPROMReadByte((u16)((EEPCnt << 1) + 1));
if (EEPBuf0 == EEPBuf1){
if (EEPBuf0 == 0x0FF){ /* 測(cè)試是否初始化 */
EEPCnt = EEPIDMAX;
}
switch(EEPCnt){ /* 對(duì)參數(shù)進(jìn)行處理 */
case 0:
if (EEPBuf0 != 0x5D) EEPCnt = EEPIDMAX;
break;
case 1:
if ((u8)(EEPBuf0 & ~SYSCONMASK) == 0){
SysConfig = EEPBuf0; /* 內(nèi)機(jī)配置字節(jié) */
}
break;
case 2: /* 設(shè)定溫度 */
SetupTp = (u8)(((EEPBuf0<SetupTpMIN) ||
(EEPBuf0>SetupTpMAX)) ? 0x98 : EEPBuf0);
break;
case 3: /* 開關(guān)機(jī)標(biāo)志,內(nèi)機(jī)工作模式 */
if (ValBit(SysConfig,fEnMemo)){ /* 1: 允許掉電記憶 */
RunMode = (u8)(EEPBuf0 & ((1<<fSysOnOff)|(1<<fLtdSwOn)|MODEMASK));
SetBit(Sysflag,fSysInit); /* 1:系統(tǒng)初始化標(biāo)志 */
} else {
RunMode = (u8)(EEPBuf0 & ((1<<fLtdSwOn)|MODEMASK));
}
break;
case 4:
FanStatus = (u8)(EEPBuf0 & FANMASK_S); /* 內(nèi)風(fēng)機(jī)風(fēng)速 */
break;
case 5:
#ifdef EnSWING
FDoorUnit = (u8)(EEPBuf0 & SWINGMASK); /* 掃風(fēng)模式 */
#endif
break;
// case 6:
// if (EEPBuf0 != 0) PowerConst = EEPBuf0; /* 內(nèi)機(jī)功率 */
// break;
case 7: /* 制熱時(shí)內(nèi)機(jī)補(bǔ)償溫度 */
#ifdef ChigoXG1
#ifndef ChigoXG1Set
SetOffset = (u8)(((EEPBuf0 < 118) ||
(EEPBuf0 > 138)) ? ChigoXG1Val : EEPBuf0);
#endif
#endif
break;
case 8:
NeijiNo = (u8)((((u8)(EEPBuf0 & NJNOMASK) < 1) ||
((u8)(EEPBuf0 & NJNOMASK) > 14)) ? 1 : EEPBuf0);
break;
default:
break;
}
}
EEPCnt++; /* 下一個(gè)參數(shù) */
}
#endif
}
/*** (c) 2005 佛山菱電 **************************** END OF FILE *************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -