⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 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 + -