一、EEPROM 使用示例及理解
EEPROM(电可擦可编程只读存储器)在使用中主要有以下几种数据存储情况:
-
单字节存储:使用
unsigned char类型,用于存储单个字节的数据 -
多字节存储:如
unsigned int类型,存放时会自动占用两个连续位置,读取时每次只能读一个字节,需分别读取高低位再组合 -
数组存储:使用
unsigned char*,用于存储字节数组EEPROM函数理解
-
在单片机中,任何变量在复位后都会回到最初定义时的变量值,所以为了不会因为复位、下电或重新烧录而损失一些想要保存的数据,可以把该变量值存入EEPROM中,这样数据就不会因为复位而重置数值,只有重新覆盖该EEPROM位置的数据,之前的数据才消失。
-
EEPROM_Write(arr_input, 0, 5);此函数是指将arr_input数组的arr_input[0]、arr_input[1]、arr_input[2]、arr_input[3]、arr_input[4]的五个地址的数据分别写入EEPROM的五个地址中,传入参数的0表示是从EEPROM的地址0开始写入数据。 -
EEPROM_Read(arr_output, 0, 5);此函数是指把EEPROM中从地址0开始的五个地址数据写入arr_output数组中,EEPROM地址0的数据存入arr_output[0]中,其它依次类推,通过这样来实现将EEPROM中的保存数据读出的操作。一般都是在main函数的while循环之前就把之前存入EEPROM中的数据读取出来。由于板子之前的EEPROM中已经存入数据,所以其它项目烧录的一开始读出的数据是之前存入的数据,不准确,不用在意,因为在4T评测上没有问题。
相关代码示例
unsigned char arr_input[5]={1,2,3,4,5};unsigned char arr_output[5];EEPROM_Write(arr_input,0,5);EEPROM_Read(arr_output,0,5);
// 单字节存储示例unsigned char input = 5;unsigned char output;EEPROM_Write(&input,0,1);EEPROM_Read(&output,0,1);
// 多字节存储示例unsigned int input = 500;unsigned int output;unsigned char high,low;EEPROM_Write(&input,0,2);EEPROM_Read(&high,0,1);EEPROM_Read(&low,1,1);output = high<<8 | low;二、EEPROM 加锁机制与 4T 测试规范
-
问题背景
-
初始状态不确定性:新板载 EEPROM 初始值为随机值(非全 255) 。在 4T 测试时提供两种 EEPROM:指定存储位置的预写入有效数据;未指定存储位置的全 255 初始化。
-
数据污染风险:已写入数据的 EEPROM 无法自动清除,未加锁机制可能导致未知数据干扰系统初始化。
-
-
加锁机制设计
-
核心原理:使用未用地址存储校验标记(Lock Byte),通过校验值判断 EEPROM 是否已初始化 。
-
实现策略:unsigned char EEPROM_Lock = 5; // 校验标记值
void Key_Proc(){Key_Val = Key_Read();Key_Down = Key_Val & (Key_Val ^ Key_Old);Key_Up = ~Key_Val & (Key_Val ^ Key_Old);Key_Old = Key_Val;switch (Key_Down){case 12:AD_Para_10x = AD_Para_Ctrl_10x;EEPROM_Write(&AD_Para_10x, 0, 1); // 写入参数EEPROM_Write(&EEPROM_Lock, 8, 1); // 写入校验标记break;}} -
-
启动校验流程
void main(){unsigned char EEPROM_Temp;EEPROM_Read(&EEPROM_Temp, 8, 1); // 读取校验标记// 校验通过则加载存储参数if (EEPROM_Temp == EEPROM_Lock){EEPROM_Read(&AD_Para_10x, 0, 1);}}4.4T 测试应用规范
-
指定存储位置测试:EEPROM 预写入有效数据,无需加锁 。
-
未指定存储位置测试:EEPROM 全 255 初始化,必须启用加锁 。
5.操作准则
-
上板验证阶段:必须启用加锁机制防止数据污染,校验地址应选择未使用的 EEPROM 空间 。
-
提交题目阶段:根据 4T 测试类型动态调整加锁策略,指定存储位置测试需确保校验地址不冲突 。
-
三、EEPROM 连续读写注意事项
-
EEPROM 常通过 I2C 通信进行读写,I2C 时序要求严格,具体如下:
-
初始化顺序:必须在 EEPROM 上电读取操作完成后,再初始化定时器。否则定时器中断可能会破坏 I2C 的时序,导致读取失败。
【或者可以在代码前后加上(TRx = 0 和 TRx = 1 或者 EA = 0 和 EA = 1)来解除中断】
-
写入操作的可靠性:
-
写入过程由单片机(主机)主动控制 。
-
每个字节都有 ACK 应答确认机制 。
-
包含足够的延时保护 。
-
即使发生中断,也不会影响数据写入的正确性 。
-
-
读取操作的风险:
-
读取时需要等待 EEPROM(从机)发送数据 。
-
I2C 通过采样 SDA 线上的电平来判断数据 。
-
如果在采样过程中发生中断,可能导致数据读取错误 。
-
EEPROM 写入函数示例:
void EEPROM_Write(unsigned char *EEPROM_String, unsigned char addr, unsigned char num){ // 选择芯片为EEPROM,模式为写 I2CStart(); I2CSendByte(0xA0); I2CWaitAck();
I2CSendByte(addr); // 写入的数据的地址 I2CWaitAck();
while (num--) { I2CSendByte(*EEPROM_String++); I2CWaitAck(); I2C_Delay(200); // 单字节写入延时保护 } I2CStop(); // 写入完成后的延时保护 I2C_Delay(255); I2C_Delay(255); I2C_Delay(255); I2C_Delay(255); I2C_Delay(255); I2C_Delay(255);}void EEPROM_Read(unsigned char *EEPROM_String, unsignedchar addr, unsigned char num){ // 第一阶段: 设置读取地址 I2CStart(); I2CSendByte(0xA0); // EEPROM写模式 I2CWaitAck(); I2CSendByte(addr); // 设置起始地址 I2CWaitAck();
// 第二阶段: 读取数据 I2CStart(); I2CSendByte(0xA1); // EEPROM读模式 I2CWaitAck(); while (num--) { *EEPROM_String++ = I2CReceiveByte(); I2CSendAck(num? 0 : 1); // 最后一个字节发送NACK } I2CStop();}-
四、EEPROM 常用考点
1.数组存入和读取(第九届国赛题)
//存储数据EEPROM_String[0] = (unsigned char)(Voltage * 10);EEPROM_String[1] = Freq >> 8;//储存高八位EEPROM_String[2] = Freq & 0x00FF;//储存低八位EEPROM_String[3] = (unsigned int)(Temperature * 100) >> 8;//储存温度整数部分EEPROM_String[4] = (unsigned int)(Temperature * 100) & 0x00FF;//储存温度小数部分EEPROM_Write(EEPROM_String,0,5);//将数据写入EEPROM中//读取数据EEPROM_Read(EEPROM_String,0,5);//将EEPROM内的数据读取出来Old_Data_String[0] = EEPROM_String[0];Old_Data_String[1] = EEPROM_String[1] << 8 | EEPROM_String[2];Old_Data_String[2] = EEPROM_String[3] << 8 | EEPROM_String[4];
部分信息可能已经过时














