EEPROM写函数AVR

由于库函数的EEPROM写函数占据太长的系统时间

1> EEPROM.h: 

#ifndef _EEPROM_H_ 
#define _EEPROM_H_ 

#ifdef  _EEPROM_C_ 
#define EXTERN 
#else 
#define EXTERN  extern 
#endif 

typedef enum 

    EEPROM_WRITE_STAT_EMPTY,  // no data in the EEPROM Write buf 
    EEPROM_WRITE_STAT_FILL,   // have data in the EEPROM Write but not full 
    EEPROM_WRITE_STAT_FULL    // EEPROM Write buf full 
}EEPROM_WRITE_STAT; 

typedef enum 

    EEPROM_SERVER_STAT_NULL, 
    EEPROM_SERVER_STAT_WRITING 
}EEPROM_SERVER_STAT; 

typedef struct 

    unsigned int  wAddress; 
    unsigned char bVal; 
}S_EEPROM_POSITION; 

#define EEPROM_WRITE_BUF_SIZE   16 
EXTERN S_EEPROM_POSITION _sEEPROMBuf[EEPROM_WRITE_BUF_SIZE]; 
EXTERN volatile EEPROM_WRITE_STAT _eEEPROMWriteStat; 
EXTERN volatile U8  _bEEPROMWritePoint; 
EXTERN volatile U8  _bEEPROMReadPoint; 
EXTERN volatile EEPROM_SERVER_STAT _eEEPROMServerStat; 

EXTERN U8 WriteDataToEEPROM(U16 wAddress, U8 bVal); 
EXTERN U8 ReadDataFromEEPROM(U16 wAddress, U8 *pbVal); 
EXTERN void EEPROMServer(void); 
EXTERN void InitEEPROM(void); 

#undef  EXTERN 
#endif 

2> EEPROM.c 

#define _EEPROM_C_ 

#include    "DrvHead.h" 

#pragma interrupt_handler EE_READY:iv_EE_READY 
void EE_READY(void) 

    if(_eEEPROMWriteStat != EEPROM_WRITE_STAT_EMPTY) 
    { 
        EEAR = _sEEPROMBuf[_bEEPROMReadPoint].wAddress; 
        EEDR = _sEEPROMBuf[_bEEPROMReadPoint].bVal; 
        EECR |= BIT(EEMWE); 
        EECR |= BIT(EEWE); 
        _eEEPROMServerStat = EEPROM_SERVER_STAT_WRITING; 
        _bEEPROMReadPoint++; 
        if(_bEEPROMReadPoint >= EEPROM_WRITE_BUF_SIZE) 
        { 
            _bEEPROMReadPoint = 0; 
        } 
        if(_bEEPROMReadPoint == _bEEPROMWritePoint) 
        { 
            _eEEPROMWriteStat = EEPROM_WRITE_STAT_EMPTY; 
        } 
        else 
        { 
            _eEEPROMWriteStat = EEPROM_WRITE_STAT_FILL; 
        } 
    } 
    else 
    { 
        EECR &= ~BIT(EERIE); 
        _eEEPROMServerStat = EEPROM_SERVER_STAT_NULL; 
    } 



U8 WriteDataToEEPROM(U16 wAddress, U8 bVal) 

    if(_eEEPROMWriteStat == EEPROM_WRITE_STAT_FULL) 
    { 
        return RET_BUSY; 
    } 
    _sEEPROMBuf[_bEEPROMWritePoint].wAddress = wAddress; 
    _sEEPROMBuf[_bEEPROMWritePoint].bVal = bVal; 
    _bEEPROMWritePoint++; 
    if(_bEEPROMWritePoint >= EEPROM_WRITE_BUF_SIZE) 
    { 
        _bEEPROMWritePoint = 0; 
    } 
    if(_bEEPROMWritePoint == _bEEPROMReadPoint) 
    { 
        _eEEPROMWriteStat = EEPROM_WRITE_STAT_FULL; 
    } 
    else 
    { 
        _eEEPROMWriteStat = EEPROM_WRITE_STAT_FILL; 
    } 
    return RET_SUCCESS; 



U8 ReadDataFromEEPROM(U16 wAddress, U8 *pbVal) 

    if(EECR & BIT(EEWE)) 
    { 
        return RET_BUSY; 
    } 
    EEAR = wAddress; 
    EECR |= BIT(EERE); 
    *pbVal = EEDR; 
    return RET_SUCCESS; 



void EEPROMServer(void) 

    if( (_eEEPROMServerStat == EEPROM_SERVER_STAT_NULL) 
        && (_eEEPROMWriteStat != EEPROM_WRITE_STAT_EMPTY) ) 
    { 
        EECR |= BIT(EERIE); 
    } 



void InitEEPROM(void) 

    _eEEPROMWriteStat = EEPROM_WRITE_STAT_EMPTY; 
    _bEEPROMWritePoint = 0; 
    _bEEPROMReadPoint = 0; 
    _eEEPROMServerStat = EEPROM_SERVER_STAT_NULL; 
    EECR = 0x00; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值