首页 > 解决方案 > stm32f303re 将数据写入 st M95160w EEPROM 并读回写入的数据

问题描述

使用 stm32f303re 将数据写入 st M95160w EEPROM 并读回写入的数据。但问题是我无法使用 SPI 读写 eeprom。每次我在写入后尝试读取数据时,它都会显示 0。在写入操作之后,读取状态寄存器显示为零,读取操作也是如此。例如,我想写入 3 个字节的数据并接收 3 个字节的数据。输出变得像

写入后的状态 0x00 读取后的状态 0x00 数据 0x00 0x00 0x00

有人可以帮助我可能是什么原因。

SPI初始化代码在这里

hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

写入 eeprom 代码

uint8_t EEwrite_arry(uint16_t StartAddress, uint8_t* data, uint16_t size)
{
      while (EEPROM_SPI->State != HAL_SPI_STATE_READY)
        {
                HAL_Delay(5);
            }

        Write_Enable();
    
        uint8_t command[3];
        command[0] = EEPROM_WRITE;// Send "Write to Memory" instruction
        command[1] = StartAddress>>8;
        command[2] = StartAddress;
        //command[3] = data[size];
        EEPROM_CS_LOW();
        HAL_SPI_Transmit(EEPROM_SPI, (uint8_t*)command,3,100);

        HAL_SPI_Transmit(EEPROM_SPI,(uint8_t*) data, size, 100);
        EEPROM_CS_HIGH();
        EEPROM_SPI_WaitStandbyState();
        Write_Disable();
        uint8_t Status_byte=Read_Status_Register();
        return Status_byte;

}

从此处读取 EEPROM 代码:

uint8_t EEread_arry(uint16_t StartAddress,uint8_t* data, uint16_t size)
{
    while (EEPROM_SPI->State != HAL_SPI_STATE_READY)
            {
            HAL_Delay(5);
            }
             uint8_t command[3];

             command[0] = EEPROM_READ;    // Send "Read from Memory" instruction
             command[1] = StartAddress >> 8;  // Send 16-bit address
             command[2] = StartAddress;
            EEPROM_CS_LOW();// Select the EEPROM: Chip Select low
            HAL_SPI_Transmit(EEPROM_SPI, (uint8_t*)command,3, 100);
   while (HAL_SPI_Receive(EEPROM_SPI, (uint8_t*)data, size , 100) == HAL_BUSY)
              {
                      HAL_Delay(5);
               };
            // Deselect the EEPROM: Chip Select high
            EEPROM_CS_HIGH();
            uint8_t Status_byte=Read_Status_Register();
            return Status_byte;
}

标签: stm32spieeprom

解决方案


推荐阅读