EEPROM
带电可擦可编程只读存储器
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
由于EPROM操作的不便,后来出的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程ROM)。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容的,而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROM Eraser和编程器的束缚。EEPROM在写入数据时,仍要利用一定的编程电压,此时,只需用厂商提供的专用刷新程序就可以轻而易举地改写内容,所以,它属于双电压芯片。借助于EEPROM芯片的双电压特性,可以使BIOS具有良好的防毒功能,在升级时,把跳线开关打至“on”的位置,即给芯片加上相应的编程电压,就可以方便地升级;平时使用时,则把跳线开关打至“off”的位置,防止CIH类的病毒对BIOS芯片的非法修改。所以,仍有不少主板采用EEPROM作为BIOS芯片并作为自己主板的一大特色.
EEPROM电路
AT24C02介绍:
下面的代码在设置完CubeMX后,在i2c.c里添加
/* USER CODE BEGIN 1 */
#define AT24C02_Write_ADD 0xA0
#define AT24C02_Read_ADD 0xA1
uint8_t I2C_Write_Buffer[256];
uint8_t I2C_Read_Buffer[256];
void AT24C02Test(void)
{
int i;
printf("\r\n **********STM32CubeMx IIC Test********** \r\n");
printf("\r\n I2C_Write_Buffer: \r\n");
/* 生成256byte数据 */
for(i = 0; i < 256; i++)
{
I2C_Write_Buffer[i] = i;
printf("%02X ", I2C_Write_Buffer[i]);
}
/* Write Data To AT24C02 */
for(i = 0; i < 256; i= i+8)
{
if(HAL_I2C_Mem_Write(&hi2c1,AT24C02_Write_ADD,i, I2C_MEMADD_SIZE_8BIT, &(I2C_Write_Buffer[i]), 8, 1000) == HAL_OK)
{
printf("\r\n Byte %02d to Byte %02d Write OK \r\n", i, i+8);
HAL_Delay(5);
}
else
{
printf("\r\n Byte %02d to Byte %02d Write Failed \r\n", i, i+8);
}
}
/* Read Data To AT24C02 */
printf("\r\n Read from AT24C02 \r\n");
HAL_I2C_Mem_Read(&hi2c1, AT24C02_Read_ADD, 0, I2C_MEMADD_SIZE_8BIT, I2C_Read_Buffer, 256, 1000);
for(i = 0; i < 256; i++)
{
printf("0x%02X ", I2C_Read_Buffer[i]);
}
}
/* USER CODE END 1 */
///
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("sys run\r\n");
AT24C02Test();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
///
//最为关键的两个函数
HAL_StatusTypeDef HAL_I2C_Mem_Write
(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
///
如果不想使用串口打印可以直接使用存储空间读取查看,具体代码如下:
以存入7个变量为例:
I2C.c代码
/* USER CODE BEGIN 1 */
#define AT24C02_Write_ADD 0XA0
#define AT24C02_Read_ADD 0XA1
uint8_t I2C_Write_Buffer[256];
uint8_t I2C_Read_Buffer[256];
extern int Number_Control_Board;
extern int Number_DCDC_Board;
extern int Number_Power_Board;
extern float Compute_AC_Curr_Floating; //计算交流电流的浮空值 1.6669
extern float Compute_AC_Curr_Multiple; //计算交流电压的倍数 20.1333
extern float Compute_AC_Volt_Floating; //计算交流电压的浮空值 0.9135
extern float Compute_AC_Volt_Multiple; //计算交流电流的倍数 846.91
//读取小数点前4位有效数字,小数点后4位有效数字
float Read_Storage_Algorithm(uint8_t i,uint8_t j,uint8_t m,uint8_t n)
{
float number;
number = (float)(i/10)*1000 + (float)(i%10)*100 + (float)(j/10)*10 + (float)(j%10) + ((float)(m/10)/10) + ((float)(m%10)/100) + ((float)(n/10)/1000) + ((float)(n%10)/10000);
return number;
}
//写入
void AT24C02_Write(void)
{
for(int i = 0; i < 256; i = i + 8)
{
if(HAL_I2C_Mem_Write(&hi2c2,AT24C02_Write_ADD,i,I2C_MEMADD_SIZE_8BIT,&(I2C_Write_Buffer[i]),8,1000) == HAL_OK)
{
HAL_Delay(5);
}
}
}
//读取
void AT24C02_Read(void)
{
HAL_I2C_Mem_Read(&hi2c2, AT24C02_Read_ADD, 0, I2C_MEMADD_SIZE_8BIT, I2C_Read_Buffer, 256, 1000);
}
//设置写入存储缓存
void AT24C02_Write_Init(void)
{
I2C_Write_Buffer[0] = 2;//控制板编号
I2C_Write_Buffer[1] = 4;//DC-DC板编号
I2C_Write_Buffer[2] = 3;//功率板编号
I2C_Write_Buffer[3] = 0;//存储交流电流的浮空值 Compute_AC_Curr_Floating
I2C_Write_Buffer[4] = 1;
I2C_Write_Buffer[5] = 66;
I2C_Write_Buffer[6] = 69;
I2C_Write_Buffer[7] = 0;//存储交流电流的倍数 Compute_AC_Curr_Multiple
I2C_Write_Buffer[8] = 20;
I2C_Write_Buffer[9] = 13;
I2C_Write_Buffer[10] = 33;
I2C_Write_Buffer[11] = 0;//存储交流电压的倍数 Compute_AC_Volt_Floating
I2C_Write_Buffer[12] = 0;
I2C_Write_Buffer[13] = 91;
I2C_Write_Buffer[14] = 35;
I2C_Write_Buffer[15] = 8;//存储交流电压的倍数 Compute_AC_Volt_Multiple
I2C_Write_Buffer[16] = 46;
I2C_Write_Buffer[17] = 91;
I2C_Write_Buffer[18] = 0;
}
//读取存储缓存信息
void AT24C02_Read_Init(void)
{
Number_Control_Board = I2C_Read_Buffer[0]; //读取控制板编号
Number_DCDC_Board = I2C_Read_Buffer[1]; //读取DC-DC板编号
Number_Power_Board = I2C_Read_Buffer[2]; //读取功率板编号
Compute_AC_Curr_Floating = Read_Storage_Algorithm(I2C_Read_Buffer[3],I2C_Read_Buffer[4],I2C_Read_Buffer[5],I2C_Read_Buffer[6]);//读取Compute_AC_Curr_Floating
Compute_AC_Curr_Multiple = Read_Storage_Algorithm(I2C_Read_Buffer[7],I2C_Read_Buffer[8],I2C_Read_Buffer[9],I2C_Read_Buffer[10]);//读取Compute_AC_Curr_Multiple
Compute_AC_Volt_Floating = Read_Storage_Algorithm(I2C_Read_Buffer[11],I2C_Read_Buffer[12],I2C_Read_Buffer[13],I2C_Read_Buffer[14]);//读取Compute_AC_Volt_Floating
Compute_AC_Volt_Multiple = Read_Storage_Algorithm(I2C_Read_Buffer[15],I2C_Read_Buffer[16],I2C_Read_Buffer[17],I2C_Read_Buffer[18]);//读取Compute_AC_Volt_Multiple
}
/* USER CODE END 1 */
///
主函数代码
// AT24C02_Write_Init();//写缓存
// AT24C02_Write(); //AT24C02写
AT24C02_Read(); //AT24C02读
AT24C02_Read_Init(); //读缓存
写在进入主函数循环之前。
EEPROM - AT24C02-CSDN博客https://blog.csdn.net/weixin_43871650/article/details/105076265