EEPROM存储介绍

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博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43871650/article/details/105076265

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值