/** ****************************************************************************** * @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" /** @defgroup MEMSPI_Commands Memory SPI Commands * @brief Определения команд SPI-памяти * @{ */ #ifdef RUFLASH #define MEMSPI_READ_DATA (0x03) #define MEMSPI_ERASE_SECTOR (0xD8) #define MEMSPI_ERASE_CHIP (0x60) #define MEMSPI_WRITE_ENABLE (0x06) #define MEMSPI_WRITE_DISABLE (0x04) #define MEMSPI_PAGE_PROGRAM (0x02) #define MEMSPI_BYTE_PROGRAM (0x02) #define MEMSPI_WRITE_EEPROM (MEMSPI_PAGE_PROGRAM) #define MEMSPI_PROTECT_SECTOR (0x36) #define MEMSPI_UNPROTECT_SECTOR (0x39) #define MEMSPI_READ_PROTECT_REG (0x3C) #define MEMSPI_READ_STATUS_REG (0x05) #if defined(SEPARATED_STATUS_REGISTER) #define MEMSPI_READ_STATUS_REG_2 (0x35) #endif #define MEMSPI_WRITE_STATUS_REG (0x01) #define MEMSPI_READ_JEDEC_ID (0x9F) #define MEMSPI_READ_UNIQUE_ID (0x4B) #else #define MEMSPI_READ_DATA 0x03 ///< Чтение данных из памяти #define MEMSPI_ERASE_SECTOR 0x20 ///< Стирание одного сектора #define MEMSPI_WRITE_ENABLE 0x06 ///< Разрешение записи #define MEMSPI_WRITE_DISABLE 0x04 ///< Запрещение записи #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_WRITE_STATUS_REG 0x01 ///< Запись в регистр состояния #define MEMSPI_READ_JEDEC_ID 0x9F ///< Команда чтения JEDEC ID #define MEMSPI_READ_UNIQUE_ID 0x4B ///< Команда чтения уникального идентификатора #endif /** //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) // Exclusive (by name) RUFLASH SR bits #define MEMSPI_SR_EPE (1<<5) ///< Ошибка/стирания записи /** * @} */ ////////////////////////////---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 byte program in FLASH */ HAL_StatusTypeDef MEMSPI_CMD_FLASH_Byte_Program(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t Byte, 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 Unprotect Sector */ HAL_StatusTypeDef MEMSPI_CMD_Unprotect_Sector(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint32_t Timeout); /* Send command to Protect sector */ HAL_StatusTypeDef MEMSPI_CMD_Protect_Sector(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint32_t Timeout); /* Send command to read Sector Protection Register */ HAL_StatusTypeDef MEMSPI_CMD_Read_Sector_Protection(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pStatus, 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 * @} */ #ifndef local_time #define local_time() HAL_GetTick() ///< Локальное время #endif #ifndef printf_memspi #define printf_memspi(...) #endif #ifndef printf_memspi_err #define printf_memspi_err(...) #endif #endif // __SPI_MEMORY_CORE_H_ /** //MEMSPI_CORE * @} */