STM32CubeWL/Drivers/BSP/Components/mx25l4006/mx25l4006.h

186 lines
9.3 KiB
C

/**
******************************************************************************
* @file mx25l4006.h
* @modify MCD Application Team
* @brief This file contains all the description of the
* MX25L4006 memory.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef MX25L4006_H
#define MX25L4006_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "mx25l4006_conf.h"
/** @defgroup MX25L4006_Exported_Constants MX25L4006 Exported Constants
* @{
*/
/* Device ID & Secure OTP length *********************************************/
#define MX25L4006_MANUFACTURER_ID ((uint8_t)0xC2)
#define MX25L4006_DEVICE_MEM_TYPE ((uint8_t)0x20)
#define MX25L4006_DEVICE_MEM_CAPACITY ((uint8_t)0x1A)
#define MX25L4006_SECURE_ID ((uint8_t)0x12)
#define MX25L4006_BLOCK_64K (uint32_t) (64 * 1024) /*!< 8 blocks of 64KBytes */
#define MX25L4006_BLOCK_32K (uint32_t) (32 * 1024) /*!< 16 blocks of 32KBytes */
#define MX25L4006_SECTOR_4K (uint32_t) (4 * 1024) /*!< 4096 sectors of 4KBytes */
#define MX25L4006_FLASH_SIZE (uint32_t) (4*1024*1024/8) /*!< 4 MBits => 512KBytes */
#define MX25L4006_SECTOR_SIZE MX25L4006_SECTOR_4K
#define MX25L4006_BLOCK_SIZE MX25L4006_BLOCK_64K
#define MX25L4006_PAGE_SIZE 256U /*!< 2048 pages of 256 Bytes */
/**
* @brief MX25L4006 Timing configuration
*/
#define MX25L4006_CHIP_ERASE_MAX_TIME 4000U /* time in millisecond to erase the full flash */
#define MX25L4006_BLOCK_ERASE_MAX_TIME 2000U /* time in millisecond to erase a block of 64K */
#define MX25L4006_SECTOR_ERASE_MAX_TIME 200U /* time in millisecond to erase a sector of 4K */
#define MX25L4006_WRITE_REG_MAX_TIME 40U /* time in millisecond to write to Status Register */
#define MX25L4006_PAGE_PROGRAM_MAX_TIME 3U /* time in millisecond to write a page of 256 bytes */
/* MX25L4006 Component Error codes *********************************************/
#define MX25L4006_OK 0
#define MX25L4006_ERROR_INIT -1
#define MX25L4006_ERROR_COMMAND -2
#define MX25L4006_ERROR_TRANSMIT -3
#define MX25L4006_ERROR_RECEIVE -4
#define MX25L4006_ERROR_AUTOPOLLING -5
#define MX25L4006_ERROR_MEMORYMAPPED -6
#define MX25L4006_ERROR_ADDRESS -7
/******************************************************************************
* @brief MX25L4006 Commands
****************************************************************************/
/***** Read/Write Array Commands (3 Byte Address Command Set) **************/
/* Read Operations */
#define MX25L4006_READ_CMD 0x03U /*!< READ, Normal Read 3 Byte Address; SPI 1-1-1 */
#define MX25L4006_FAST_READ_CMD 0x0BU /*!< FAST READ, Fast Read 3 Byte Address; SPI 1-1-1 */
/* Program Operations */
#define MX25L4006_PAGE_PROG_CMD 0x02U /*!< PP, Page Program 3 Byte Address; SPI 1-1-1 */
/* Erase Operations */
#define MX25L4006_SECTOR_ERASE_4K_CMD 0x20U /*!< SE, Sector Erase 4KB 3 Byte Address; SPI 1-1-0 */
#define MX25L4006_BLOCK_ERASE_64K_CMD 0xD8U /*!< BE, Block Erase 64KB 3 Byte Address; SPI 1-1-0 */
#define MX25L4006_CHIP_ERASE_CMD 0xC7U /*!< CE, Chip Erase 0 Byte Address; SPI 1-0-0 */
/***** Register/Setting Commands *********************************************/
#define MX25L4006_WRITE_ENABLE_CMD 0x06U /*!< WREN, Write Enable; SPI */
#define MX25L4006_WRITE_DISABLE_CMD 0x04U /*!< WRDI, Write Disable; SPI */
#define MX25L4006_READ_STATUS_REG_CMD 0x05U /*!< RDSR, Read Status Register; SPI */
#define MX25L4006_WRITE_STATUS_REG_CMD 0x01U /*!< WRSR, Write Status Register; SPI */
#define MX25L4006_DEEP_POWER_DOWN_CMD 0xB9U /*!< DP, Deep power down; SPI */
#define MX25L4006_RELEASE_FROM_DEEP_POWER_DOWN_CMD 0xABU /*!< RDP, Release from Deep Power down; SPI */
/***** ID/Security Commands **************************************************/
/* Identification Operations */
#define MX25L4006_READ_ID_CMD 0x9FU /*!< RDID, Read IDentification; SPI */
#define MX25L4006_READ_ELECTRONIC_ID_CMD 0xABU /*!< RES, Read Electronic ID; SPI */
#define MX25L4006_READ_ELECTRONIC_MANFACTURER_ID_CMD 0x90U /*!< REMS, Read Electronic Manufacturer ID & Device ID; SPI */
#define MX25L4006_READ_SERIAL_FLASH_DISCO_PARAM_CMD 0x5AU /*!< RDSFDP, Read Serial Flash Discoverable Parameter; SPI */
#define MX25L4006_DOUBLE_OUTPUT_MODE_CMD 0x3BU /*!< DREAD, Double Output Mode; SPI */
/******************************************************************************
* @brief MX25L4006 Registers
****************************************************************************/
/* Status Register */
#define MX25L4006_SR_WIP ((uint8_t)0x01) /*!< Write in progress */
#define MX25L4006_SR_WREN ((uint8_t)0x02) /*!< Write enable latch */
#define MX25L4006_SR_BLOCKPR ((uint8_t)0x1C) /*!< Block protected against program and erase operations */
#define MX25L4006_SR_SRWD ((uint8_t)0x80) /*!< Status register write enable/disable */
/**
* @}
*/
/** @defgroup MX25L4006_Exported_Types MX25L4006 Exported Types
* @{
*/
typedef struct
{
uint32_t FlashSize; /*!< Size of the flash */
uint32_t EraseSectorSize; /*!< Size of sectors for the erase operation */
uint32_t EraseSectorsNumber; /*!< Number of sectors for the erase operation */
uint32_t EraseSubSectorSize; /*!< Size of subsector for the erase operation */
uint32_t EraseSubSectorNumber; /*!< Number of subsector for the erase operation */
uint32_t EraseSubSector1Size; /*!< Size of subsector 1 for the erase operation */
uint32_t EraseSubSector1Number; /*!< Number of subsector 1 for the erase operation */
uint32_t ProgPageSize; /*!< Size of pages for the program operation */
uint32_t ProgPagesNumber; /*!< Number of pages for the program operation */
} MX25L4006_Info_t;
typedef enum
{
MX25L4006_ERASE_4K = 0, /*!< 4K size Sector erase */
MX25L4006_ERASE_64K, /*!< 64K size Block erase */
MX25L4006_ERASE_CHIP /*!< Whole chip erase */
} MX25L4006_Erase_t;
/**
* @}
*/
/** @defgroup MX25L4006_Exported_Functions MX25L4006 Exported Functions
* @{
*/
/* Function by commands combined */
int32_t MX25L4006_GetFlashInfo(MX25L4006_Info_t *pInfo);
int32_t MX25L4006_AutoPollingMemReady(SPI_HandleTypeDef *Ctx);
int32_t MX25L4006_AutoPollingMemReadyToWrite(SPI_HandleTypeDef *Ctx);
/* Read/Write Array Commands (3 Bytes Address Command Set) ********************/
int32_t MX25L4006_Read(SPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t ReadAddr, uint16_t Size);
int32_t MX25L4006_FastRead(SPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t ReadAddr, uint16_t Size);
int32_t MX25L4006_PageProgram(SPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t WriteAddr, uint16_t Size);
int32_t MX25L4006_SectorErase(SPI_HandleTypeDef *Ctx, uint32_t SectorAddress);
int32_t MX25L4006_BlockErase(SPI_HandleTypeDef *Ctx, uint32_t BlockAddress, MX25L4006_Erase_t BlockSize);
int32_t MX25L4006_ChipErase(SPI_HandleTypeDef *Ctx);
/* Register/Setting Commands *************************************************/
int32_t MX25L4006_WriteEnable(SPI_HandleTypeDef *Ctx);
int32_t MX25L4006_WriteDisable(SPI_HandleTypeDef *Ctx);
int32_t MX25L4006_ReadStatusRegister(SPI_HandleTypeDef *Ctx, uint8_t *Value);
int32_t MX25L4006_WriteStatusRegister(SPI_HandleTypeDef *Ctx, uint8_t Value);
int32_t MX25L4006_EnterDeepPowerDown(SPI_HandleTypeDef *Ctx);
int32_t MX25L4006_ReleaseDeepPowerDown(SPI_HandleTypeDef *Ctx);
/* ID/Security Commands ******************************************************/
int32_t MX25L4006_ReadID(SPI_HandleTypeDef *Ctx, uint8_t *ID);
int32_t MX25L4006_ReadSFDP(SPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t ReadAddr, uint16_t Size);
/**
* @}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* MX25L4006_H */