Files
STM32_MemorySPI/Inc/memspi_core.h

165 lines
8.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
******************************************************************************
* @file memspi_core.h
* @brief Работа с командами для внешней памяти
******************************************************************************
@defgroup MEMSPI_CORE Memory SPI Core
@brief Ядро библиотеки
@{
******************************************************************************
* @details
Модуль предоставляет функции и макросы для работы с FLASH/EEPROM по SPI
на уровне отдельных команд:
- @ref MEMSPI_CMD_Read_Status_Register Отправка комманды Read Status Register / Read Status Register 2 (0x05h / 0x35h)
- @ref MEMSPI_CMD_Write_Status_Register Отправка комманды Write Status Register (0x01h)
- @ref MEMSPI_CMD_Write_Enable Отправка комманды Write Enable (0x06h)
- @ref MEMSPI_CMD_Read_Data Отправка комманды Read Data (0x03h)
- @ref MEMSPI_CMD_EEPROM_Write Отправка комманды Write (eeprom) (0x02h)
- @ref MEMSPI_CMD_FLASH_Page_Program Отправка комманды Page Program (flash) (0x02h)
- @ref MEMSPI_CMD_FLASH_Erase_Sector Отправка комманды Erase Sector (flash) (0x20h)
- @ref MEMSPI_CMD_Read_JEDEC_ID Отправка комманды Read JEDEC ID (0x4Bh)
- @ref MEMSPI_CMD_Read_Device_ID Отправка комманды Read Manufacture / Device Id (0x90)
******************************************************************************/
#ifndef __SPI_MEMORY_CORE_H_
#define __SPI_MEMORY_CORE_H_
#include "memspi_config.h"
#ifndef local_time
#define local_time() HAL_GetTick() ///< Локальное время
#endif
/** @defgroup MEMSPI_Commands Memory SPI Commands
* @brief Определения команд SPI-памяти
* @{
*/
#define MEMSPI_READ_JEDEC_ID 0x9F ///< Команда чтения JEDEC ID
#define MEMSPI_READ_UNIQUE_ID 0x4B ///< Команда чтения уникального идентификатора
#define MEMSPI_WRITE_ENABLE 0x06 ///< Разрешение записи
#define MEMSPI_WRITE_DISABLE 0x04 ///< Запрещение записи
#define MEMSPI_WRITE_STATUS_REG 0x01 ///< Запись в регистр состояния
#define MEMSPI_ERASE_SECTOR 0x20 ///< Стирание одного сектора
#define MEMSPI_PAGE_PROGRAM 0x02 ///< Программирование одной страницы
#define MEMSPI_WRITE_EEPROM MEMSPI_PAGE_PROGRAM ///< Псевдоним для программирования EEPROM
#define MEMSPI_READ_STATUS_REG 0x05 ///< Чтение регистра состояния
#if defined(MEMSPI_SEPARATED_STATUS_REGISTER)
#define MEMSPI_READ_STATUS_REG_2 0x35 ///< Чтение второго регистра состояния (если поддерживается)
#endif
#define MEMSPI_READ_DATA 0x03 ///< Чтение данных из памяти
/** //MEMSPI_Commands
* @}
*/
/** @defgroup MEMSPI_StatusFlags Statur Register Flags
* @brief Определения битов регистра состояния памяти
* @{
*/
/**
* @brief Get Flag of Status Register
*/
#define MEMSPI_Get_Flag(_hmemspi_,_flag_) (((MEMSPI_StatusRegisterTypeDef)(_hmemspi_->SR))._flag_)
#define MEMSPI_SR_SUS (1<<15) ///< Suspend (приостановка операций)
#define MEMSPI_SR_QE (1<<9) ///< Quad Enable (разрешение четырехпроводного интерфейса)
#define MEMSPI_SR_SRP1 (1<<8) ///< Status Register Protect 1
#define MEMSPI_SR_SRP0 (1<<7) ///< Status Register Protect 0 / SRWD
#define MEMSPI_SR_SEC (1<<6) ///< Sector Protect (защита сектора)
#define MEMSPI_SR_TB (1<<5) ///< Top/Bottom Protect
#define MEMSPI_SR_BP2 (1<<4) ///< Block Protect бит 2
#define MEMSPI_SR_BP1 (1<<3) ///< Block Protect бит 1
#define MEMSPI_SR_BP0 (1<<2) ///< Block Protect бит 0
#define MEMSPI_SR_WEL (1<<1) ///< Write Enable Latch (бит разрешения записи)
#define MEMSPI_SR_BUSY (1<<0) ///< Занято (операция в процессе выполнения)
// Exclusive (by name) EEPROM SR bits
#define MEMSPI_SR_SRWD MEMSPI_SR_SRP0 ///< Status Register Write Disable (аналог SRP0)
#define MEMSPI_SR_WIP MEMSPI_SR_WEL ///< Write-In-Progress (используется в некоторых EEPROM)
/**
* @}
*/
////////////////////////////---DEFINES---////////////////////////////
/////////////////////////////////////////////////////////////////////
///////////////////////---STRUCTURES & ENUMS---//////////////////////
/**
* @brief Структура параметров инициализации записи в память MEMSPI.
*/
typedef struct
{
uint8_t *pDataPtr; ///< Указатель на буфер данных, которые будут записаны
uint32_t Data_Address; ///< Начальный адрес записи в памяти
uint32_t Data_Size; ///< Размер данных для записи в байтах
uint32_t Sector_Address; ///< Адрес начала сектора, в который будет производиться запись
uint32_t Sector_Size; ///< Размер сектора, который может быть затронут при записи
unsigned fSavePrevoisData:1; ///< Флаг: сохранять ли предыдущие данные сектора (до стирания)
} MEMSPI_WriteInitTypeDef;
/**
* @brief Основная структура управления MEMSPI.
*/
typedef struct
{
uint16_t SR; ///< Регистра состояния микросхемы
SPI_HandleTypeDef *hspi; ///< Указатель на дескриптор SPI, используемый для обмена с памятью
GPIO_TypeDef *CS_GPIOx; ///< Порт GPIO для вывода управления CS (chip select)
uint32_t CS_PIN; ///< Номер вывода (пина) для CS
uint32_t hNextAddr; ///< Следующий адрес для автоматической записи/чтения
uint16_t hNextPage; ///< Следующая страница памяти
uint16_t hNextSector; ///< Следующий сектор памяти
} MEMSPI_HandleTypeDef;
///////////////////////---STRUCTURES & ENUMS---//////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
/** @defgroup MEMSPI_CmdFunctiins Functions for Memory SPI CMD
* @brief Функции для отправки комманд для памяти по SPI
* @{
*/
/* Send command to read Status Register */
HAL_StatusTypeDef MEMSPI_CMD_Read_Status_Register(MEMSPI_HandleTypeDef *hmemspi, uint16_t RequestedBits, uint8_t EndCMD, uint32_t Timeout);
/* Send command to write bits in Status Register */
HAL_StatusTypeDef MEMSPI_CMD_Write_Status_Register(MEMSPI_HandleTypeDef *hmemspi, uint16_t WrittenBits, uint32_t Timeout);
/* Send command to set Write Enable Latch (WEL) in Status Register */
HAL_StatusTypeDef MEMSPI_CMD_Write_Enable(MEMSPI_HandleTypeDef *hmemspi, uint32_t Timeout);
/* Send command to read data from FLASH/EEPROM */
HAL_StatusTypeDef MEMSPI_CMD_Read_Data(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size, uint32_t Timeout);
/* Send command to write eeprom */
HAL_StatusTypeDef MEMSPI_CMD_EEPROM_Write(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* Send command to page program in FLASH */
HAL_StatusTypeDef MEMSPI_CMD_FLASH_Page_Program(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* Send command to erase sector of FLASH */
HAL_StatusTypeDef MEMSPI_CMD_FLASH_Erase_Sector(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint32_t Timeout);
/* Send command to read JEDEC ID */
uint32_t MEMSPI_CMD_Read_JEDEC_ID(MEMSPI_HandleTypeDef *hmemspi, uint32_t Timeout);
/* Send command to read JEDEC ID */
uint64_t MEMSPI_CMD_Read_Device_ID(MEMSPI_HandleTypeDef *hmemspi, uint32_t Timeout);
/*Send command to fast read data from FLASH */
HAL_StatusTypeDef MEMSPI_CMD_Fast_Read(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size, uint32_t Timeout);
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
/** //MEMSPI_CmdFunctiins
* @}
*/
#endif // __SPI_MEMORY_CORE_H_
/** //MEMSPI_CORE
* @}
*/