一、模拟 EEPROM 数据存储器结构
HT66F0181的模拟 EEPROM 数据存储器容量为 32×15 位。该模拟 EEPROM 以页为单位进行擦操作,以 4 字为单位进行写操作,以 1 字为单位进行读操作。页的大小为 16 个字。注意,在执行写操作之前必须先执行擦操作。
二、EAR寄存器
1、擦除操作:只有EAR[4]有效,0代表0页/1代表1页;
2、写操作:只有EAR[4:2]有效,代表写单位0~7,每个写单位含有4个连续地址;
3、读操作:EAR[4:0]有效,代表地址0~31。
三、擦除模拟 EEPROM 中的数据
1、注意点
(1)擦除操作每次擦除一页,每页包含16个字;
(2)EEREN 先置为高,接着EER 位需立即置高以开始擦操作,这两条指令必须在两个指令周期内连续执行,且顺序不能颠倒;
(3)总中断位EMI 在擦周期开始前应当被清零,在一个有效的擦启动步骤完成之后再将其使能。
2、例程
void eraseEEPROM(unsigned char page) // page 0或1
{
bit flag_emi;
flag_emi = 0;
if(_emi == 1)
{
flag_emi = 1;
_emi = 0;
}
_ewrts1 = 0; _ewrts0 = 0; // 00:2ms 模拟 EEPROM 擦 / 写时间选择
_ear4 = page; // 擦除页:0
_eeren = 1;
_eer = 1;
while(_eer); // 0完成擦除,跳出循环
_eeren = 0;
if(flag_emi == 1) _emi = 1;
}
四、写数据到模拟 EEPROM
1、注意点
(1)写入操作每次写入 4 字,每个字包含15bit;
(2)EWREN 先置为高,接着 EWR 位需立即置高,这两条指令必须在两个指令周期内连续执行,且顺序不能颠倒;
(3)总中断位 EMI 在写周期开始前应当被清零,在一个有效的写启动步骤完成之后再将其使能;
(4)在执行写操作之前必须先执行擦操作!
2、单字节写例程
void writeEEPROM(unsigned char data) // 1次写4个字
{
bit flag_emi;
flag_emi = 0;
if(_emi == 1)
{
flag_emi = 1;
_emi = 0;
}
// 1次写4个字
_ed0l = data; // _ed0l max:255 _ed0h max:127
/*
// _edxl max:255 _edxh max:127
_ed0l = data0_l; _ed0h = data0_h;
_ed1l = data1_l; _ed1h = data1_h;
_ed2l = data2_l; _ed1h = data2_h;
_ed3l = data3_l; _ed1h = data3_h;
*/
_ear4 = 0; _ear3 = 0; _ear2 = 0; // 这边直接固定:写单位0,用户可根据实际使用做修改
_ewren = 1;
_ewr = 1;
while(_ewr); // 0完成写操作,跳出循环
_ewren = 0;
if(flag_emi == 1) _emi = 1;
}
五、从模拟 EEPROM 中读取数据
1、注意点
(1)读操作每次读1个字,每个字包含15bit;
(2)ERDEN 先置为高,接着ERD 位需立即置高,这两条指令必须在两个指令周期内连续执行,且顺序不能颠倒;
(3)总中断位 EMI 在写周期开始前应当被清零,在一个有效的写启动步骤完成之后再将其使能。
2、单字节读例程
unsigned char readEEPROM(unsigned char address)
{
u8 data;
bit flag_emi;
flag_emi = 0;
if(_emi == 1)
{
flag_emi = 1;
_emi = 0;
}
_ear = address;
_erden = 1;
_erd = 1;
while(_erd); // 0完成读取,跳出循环
_erden = 0;
if(flag_emi == 1) _emi = 1;
data = _ed0l;
return data;
}