📄 i2c.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : 简易风盘控制器
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 刷新时间间隔 20mS on 4mS */
u8 EEPCnt; /* 参数序号,参数地址 * 2 */
u8 EEPBuf0; /* 缓冲区 */
u8 EEPBuf1; /* 缓冲区 */
/*-----------------------------------------------------------------------------
ROUTINE NAME : SaveToEEPROM
INPUT/OUTPUT :
EEPCnt: 参数代号,每个参数在 EEPROM 中占 2 个字节,因此,参数在 EEPROM
中的地址为:EEPcnt*2
EEPBuf: 缓冲区指针,存放待写的参数值
EEPTm: 刷新时间间隔 20mS on 4mS
EEPIDMAX: 参数个数
DESCRIPTION:
在给定的时间间隔内,不停的刷新 EEPROM 中的参数
COMMENTS :
; 掉电记忆保存的内容(共9项)
; - 标示字节 5D
; - 内机配置字节 SysConfig
; - 设定温度 SetupTp
; - 内机工作模式 RunMode
; - 内机风机风速 FanStatus
; - 摆风状态 FDoorUnit
; - 内机功率 PowerConst
; - 制热时内机补偿温度 SetOffset
; - 内机ID NeijiNo
-----------------------------------------------------------------------------*/
void SaveToEEPROM(void)
{
u8 i;
if (EEPTm++ >= 100){
EEPTm = 0; /* 清除间隔 */
if (++EEPCnt >= EEPIDMAX) 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;
case 5:
#ifdef EnSWING
i = FDoorUnit; /* 扫风模式 */
#else
i = 0;
#endif
break;
case 7:
#ifdef ChigoXG1
#ifndef ChigoXG1Set
i = SetOffset; /* 制热时内机补偿温度 */
#else
i = ChigoXG1Set;
#endif
#else
i = 0x80;
#endif
break;
case 8:
i = NeijiNo; /* 内机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); /* 设置缺省值 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){ /* 测试是否初始化 */
EEPCnt = EEPIDMAX;
}
switch(EEPCnt){ /* 对参数进行处理 */
case 0:
if (EEPBuf0 != 0x5D) EEPCnt = EEPIDMAX;
break;
case 1:
if ((u8)(EEPBuf0 & ~SYSCONMASK) == 0){
SysConfig = EEPBuf0; /* 内机配置字节 */
}
break;
case 2: /* 设定温度 */
SetupTp = (u8)(((EEPBuf0<SetupTpMIN) ||
(EEPBuf0>SetupTpMAX)) ? 0x98 : 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;
case 5:
#ifdef EnSWING
FDoorUnit = (u8)(EEPBuf0 & SWINGMASK); /* 扫风模式 */
#endif
break;
// case 6:
// if (EEPBuf0 != 0) PowerConst = EEPBuf0; /* 内机功率 */
// break;
case 7: /* 制热时内机补偿温度 */
#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++; /* 下一个参数 */
}
#endif
}
/*** (c) 2005 佛山菱电 **************************** END OF FILE *************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -