204 lines
12 KiB
C
204 lines
12 KiB
C
/********************************SPI MEMORY*********************************
|
||
Данный файл содержит инклюды и дефайны для общения с FLASH/EEPROM по SPI.
|
||
***************************************************************************/
|
||
#ifndef __SPI_MEMORY_H_
|
||
#define __SPI_MEMORY_H_
|
||
|
||
#include "stm32f4xx_hal.h"
|
||
|
||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||
//#define EXT_FLASH
|
||
#define EXT_EEPROM
|
||
|
||
#if defined(EXT_FLASH) & defined(EXT_EEPROM)
|
||
#error Choose only one memory
|
||
#endif
|
||
|
||
//#define SEPARATED_STATUS_REGISTER
|
||
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
////////////////////////////---DEFINES---////////////////////////////
|
||
/**
|
||
* @brief SPI Transmit.
|
||
* @param _hmemspi_ - указатель на хендл внешней памяти.
|
||
* @param _data_ - указатель на данные для отправки.
|
||
* @param _size_ - размер данных для отправки.
|
||
* @param _timeout_ - время, за которое должна быть осуществлена отправка.
|
||
* @note Здесь вызывается только функция HAL, и ничего больше.
|
||
*/
|
||
#define MEMSPI_SPI_Transmit(_hmemspi_, _data_, _size_, _timeout_) HAL_SPI_Transmit(_hmemspi_->hspi, _data_, _size_, _timeout_)
|
||
/**
|
||
* @brief SPI Receive.
|
||
* @param _hmemspi_ - указатель на хендл внешней памяти.
|
||
* @param _data_ - указатель на буффер для прниема данных.
|
||
* @param _size_ - размер данных для приема.
|
||
* @param _timeout_ - время, за которое должен быть осуществлен прием.
|
||
* @note Здесь вызывается только функция HAL, и ничего больше.
|
||
*/
|
||
#define MEMSPI_SPI_Receive(_hmemspi_, _data_, _size_, _timeout_) HAL_SPI_Receive(_hmemspi_->hspi, _data_, _size_, _timeout_)
|
||
|
||
/**
|
||
* @brief Select MEMORY chip.
|
||
*/
|
||
#define MEMSPI_Select(_hmemspi_) (_hmemspi_->CS_GPIOx->BSRR = _hmemspi_->CS_PIN << 16)
|
||
/**
|
||
* @brief Deselect MEMORY chip.
|
||
*/
|
||
#define MEMSPI_Deselect(_hmemspi_) (_hmemspi_->CS_GPIOx->BSRR = _hmemspi_->CS_PIN)
|
||
#define MEMSPI_SECTOR_SIZE (0x1000) ///< Размер одного сектора памяти (4096 байт)
|
||
#define MEMSPI_PAGE_SIZE (0x100) ///< Размер одной страницы памяти (256 байт)
|
||
|
||
/** @defgroup MEMSPI_Commands Команды SPI-памяти
|
||
* @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(SEPARATED_STATUS_REGISTER)
|
||
#define MEMSPI_READ_STATUS_REG_2 0x35 ///< Чтение второго регистра состояния (если поддерживается)
|
||
#endif
|
||
|
||
#define MEMSPI_READ_DATA 0x03 ///< Чтение данных из памяти
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|
||
/** @defgroup MEMSPI_StatusFlags Флаги регистра состояния памяти
|
||
* @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---//////////////////////
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
///////////////////////---FUNCTIONS FOR USER---//////////////////////
|
||
/* Initialize SPI and GPIO for MEMSPI FLASH */
|
||
void MEMSPI_Base_Init(MEMSPI_HandleTypeDef *hmemspi, SPI_HandleTypeDef *hspi);
|
||
/* Read external FLASH */
|
||
HAL_StatusTypeDef MEMSPI_Read_Memory(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size, uint32_t Timeout);
|
||
/* Write external EEPROM */
|
||
HAL_StatusTypeDef MEMSPI_EEPROM_Write(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t Timeout, uint8_t WaitForEnd);
|
||
/* Write external FLASH */
|
||
HAL_StatusTypeDef MEMSPI_FLASH_Write(MEMSPI_HandleTypeDef *hmemspi, MEMSPI_WriteInitTypeDef *WriteInit, uint32_t Timeout, uint8_t WaitForEnd);
|
||
/* Program external FLASH */
|
||
HAL_StatusTypeDef MEMSPI_FLASH_Program(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t Timeout, uint8_t WaitForEnd);
|
||
/* Erase external FLASH */
|
||
HAL_StatusTypeDef MEMSPI_FLASH_Erase(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint16_t Size, uint32_t Timeout, uint8_t WaitForEnd);
|
||
///////////////////////---FUNCTIONS FOR USER---//////////////////////
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
////////////////////////---SERVICE FUNCTIONS---//////////////////////
|
||
/* Write page in external EEPROM */
|
||
HAL_StatusTypeDef MEMSPI_EEPROM_Write_Page(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t *Timeout, uint32_t *tickstart, uint8_t WaitForEnd);
|
||
/* Erase external FLASH Sector */
|
||
HAL_StatusTypeDef MEMSPI_FLASH_Erase_Sector(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint32_t *Timeout, uint32_t *tickstart, uint8_t WaitForEnd);
|
||
/* Program page in external FLASH */
|
||
HAL_StatusTypeDef MEMSPI_FLASH_Program_Page(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size, uint32_t *Timeout, uint32_t *tickstart, uint8_t WaitForEnd);
|
||
/* Setting WEL bit until it setted or until timeout */
|
||
HAL_StatusTypeDef MEMSPI_WriteEnablingUntilTimeout(MEMSPI_HandleTypeDef *hmemspi, uint32_t *Timeout, uint32_t *tickstart);
|
||
/* Wait for flag until timeout */
|
||
HAL_StatusTypeDef MEMSPI_WaitOnFlagsUntilTimeout(MEMSPI_HandleTypeDef *hmemspi, uint16_t FlagMask, uint16_t FlagStatus, uint32_t *Timeout, uint32_t *tickstart);
|
||
/* Update Timeout variables */
|
||
void MEMSPI_Update_Timeout_Variables(uint32_t *Timeout, uint32_t *tickstart);
|
||
////////////////////////---SERVICE FUNCTIONS---//////////////////////
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
|
||
/* 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---/////////////////////
|
||
|
||
|
||
#endif // __SPI_MEMORY_H_
|