/**
******************************************************************************
* @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_