📄 eeprom.c
字号:
/********************************************************************************************************
* 文 件 名 : eeprom.c
* 程 序 员 : (CaiJie) hnclcj@gmail.com
* (c) Copyright 2007-2007, CaiJie
* All Rights Reserved
* 创建日期 : 2007-09-10
* 说 明 :
* 修改日期 :
* 修改版本 :
* 说 明 :
********************************************************************************************************/
#define EEP_GLOBALS
#include "includes.h"
/********************************************************************************************************
* 功 能 : 字节读
* 入 口 : 'Addr' 读数据的位置
* 返 回 : 读到的数据
* 说 明 : 无
********************************************************************************************************/
INT8U EEPROMByteRead (INT16U Addr)
{
INT8U result;
//while (EECR & (1<<EEWE)); // 等待上一次写操作
//OS_ENTER_CRITICAL(); // 进入临界
//EEAR = Addr; // 设置地址寄存器*
//EECR |= (1<<EERE); // 设置EERE 以启动
//result = EEDR; // 读EEPROM数据
//OS_EXIT_CRITICAL(); // 退出临界
return result; // 数据返回
}
/********************************************************************************************************
* 功 能 : 多字节读
* 入 口 : 'addr' 读数据的起始位置
* 'pRDat' 返回数据的指针
* 'ctr' 要读的数据个数
* 返 回 : 读到的数据
* 说 明 : 无
********************************************************************************************************/
#if EEPROM_READS_EN > 0
void EEPROMByteReads (INT16U Addr, INT8U *pRDat, INT16U Ctr)
{
while (Ctr != 0) {
*pRDat = EEPROMByteRead(Addr);
pRDat++;
Addr++;
Ctr--;
}
}
#endif
/********************************************************************************************************
* 功 能 : 字节编程并校验
* 入 口 : 'Addr' 待写入地址
* 'Dat' 待写入的数据
* 返 回 : 返回操作结果
* 说 明 : 1> 在此假设中断不会在执行这些函数的过程当中发生。(此条 通过临界解决)
* 2> 同时还假设软件没有Boot Loader。若Boot Loader 存在,则EEPROM 写函数还需要等待正在运行的SPM 命令的结束
* 3> 写EEPROM时间典型为8.5MS 1字节
********************************************************************************************************/
void EEPROMByteWrite (INT16U Addr, INT8U Dat)
{
while(EECR & (1<<EEWE)); // 等待上一次写操作结束
OS_ENTER_CRITICAL(); // 进入临界 (保证写操作时序)
EEAR = Addr; // 设置地址和数据寄存器
EEDR = Dat; // 写入数据
EECR |= (1<<EEMWE); // 置位EEMWE
EECR |= (1<<EEWE); // 置位EEWE 以启动写操作 (CPU4个周期内写此位 否则写失败)
OS_EXIT_CRITICAL(); // 退出临界
}
/********************************************************************************************************
* 功 能 : 字节写编程并校验
* 入 口 : 'addr' 待写入数据的起始地址
* 'pWDat' 待写入的数据的指针
* 'ctr' 待写入数据的长度
* 返 回 : 返回操作结果
* 说 明 :
********************************************************************************************************/
#if EEPROM_WRITES_EN > 0
void EEPROMByteWrites (INT16U Addr, INT8U *pWDat, INT16U Ctr)
{
while (Ctr != 0) {
EEPROMByteWrite(Addr, *pWDat); // 写入数据
Addr++;
pWDat++;
Ctr--;
}
}
#endif
/********************************************************************************************************
* End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -