Чет работает
This commit is contained in:
76
AllLibs/ExtMemory/Inc/memspi.h
Normal file
76
AllLibs/ExtMemory/Inc/memspi.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file memspi.h
|
||||
* @brief Работа с внешней памятью
|
||||
******************************************************************************
|
||||
@defgroup MEMSPI API for Memory SPI
|
||||
@brief API для работы с внешней памятью
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль предоставляет API для удобной работы с FLASH/EEPROM по SPI:
|
||||
- @ref MEMSPI_Read_Memory Считывание внешней FLASH/EEPROM
|
||||
- @ref MEMSPI_EEPROM_Write Запись данных в внешнюю EEPROM
|
||||
- @ref MEMSPI_FLASH_Write Запись данных в внешнюю FLASH (функция сама очищает нужные сектора, и если надо сохраняет выбранные данные)
|
||||
- @ref MEMSPI_FLASH_Program Программирование внешней FLASH (выбранный участок FLASH должен быть очищен)
|
||||
- @ref MEMSPI_FLASH_Erase Очистка внешней FLASH
|
||||
|
||||
Также есть ряд вспомогательных функций:
|
||||
- @ref MEMSPI_EEPROM_Write_Page Запись страницы в EEPROM *есть более общая функция MEMSPI_EEPROM_Write, которая записывает участки больше страницы
|
||||
- @ref MEMSPI_FLASH_Erase_Sector Очистка сектора FLASH. *есть более общая функция MEMSPI_FLASH_Erase, которая может ощичать несколько секторов
|
||||
- @ref MEMSPI_FLASH_Program_Page Программирование страницы. *есть более общая функция MEMSPI_FLASH_Program, которая программирует участки больше страницы
|
||||
- @ref MEMSPI_WriteEnablingUntilTimeout Разрешение записи, пока не будет ответа или не истек таймаут
|
||||
- @ref MEMSPI_WaitOnFlagsUntilTimeout Ожидание флага пока не истек таймаута
|
||||
|
||||
@section Start Инструкция по подключению
|
||||
```c
|
||||
MEMSPI_HandleTypeDef hmemspi;
|
||||
HAL_StatusTypeDef MEMSPI_RES;
|
||||
|
||||
hmemspi.CS_GPIOx = GPIOC;
|
||||
hmemspi.CS_PIN = GPIO_PIN_4;
|
||||
MEMSPI_Base_Init(&hmemspi, &hspi3);
|
||||
|
||||
MEMSPI_RES = MEMSPI_EEPROM_Write(&hmemspi, mem_adr, write_buff, buff_size, Timeout, 1);
|
||||
MEMSPI_RES = MEMSPI_Read_Memory(&hmemspi, mem_adr, read_buff, buff_size, Timeout);
|
||||
```
|
||||
|
||||
******************************************************************************/
|
||||
#ifndef __SPI_MEMORY_H_
|
||||
#define __SPI_MEMORY_H_
|
||||
|
||||
#include "memspi_core.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////---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---//////////////////////
|
||||
|
||||
|
||||
#endif // __SPI_MEMORY_H_
|
||||
165
AllLibs/ExtMemory/Inc/memspi_core.h
Normal file
165
AllLibs/ExtMemory/Inc/memspi_core.h
Normal file
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @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
|
||||
* @}
|
||||
*/
|
||||
Reference in New Issue
Block a user