mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 532:fe11edbda85c 1 /**
mbed_official 532:fe11edbda85c 2 ******************************************************************************
mbed_official 532:fe11edbda85c 3 * @file stm32f4xx_hal_qspi.c
mbed_official 532:fe11edbda85c 4 * @author MCD Application Team
mbed_official 613:bc40b8d2aec4 5 * @version V1.3.2
mbed_official 613:bc40b8d2aec4 6 * @date 26-June-2015
mbed_official 532:fe11edbda85c 7 * @brief QSPI HAL module driver.
mbed_official 532:fe11edbda85c 8 *
mbed_official 532:fe11edbda85c 9 * This file provides firmware functions to manage the following
mbed_official 532:fe11edbda85c 10 * functionalities of the QuadSPI interface (QSPI).
mbed_official 532:fe11edbda85c 11 * + Initialization and de-initialization functions
mbed_official 532:fe11edbda85c 12 * + Indirect functional mode management
mbed_official 532:fe11edbda85c 13 * + Memory-mapped functional mode management
mbed_official 532:fe11edbda85c 14 * + Auto-polling functional mode management
mbed_official 532:fe11edbda85c 15 * + Interrupts and flags management
mbed_official 532:fe11edbda85c 16 * + DMA channel configuration for indirect functional mode
mbed_official 532:fe11edbda85c 17 * + Errors management and abort functionality
mbed_official 532:fe11edbda85c 18 *
mbed_official 532:fe11edbda85c 19 @verbatim
mbed_official 532:fe11edbda85c 20 ===============================================================================
mbed_official 532:fe11edbda85c 21 ##### How to use this driver #####
mbed_official 532:fe11edbda85c 22 ===============================================================================
mbed_official 532:fe11edbda85c 23 [..]
mbed_official 532:fe11edbda85c 24 *** Initialization ***
mbed_official 532:fe11edbda85c 25 ======================
mbed_official 532:fe11edbda85c 26 [..]
mbed_official 532:fe11edbda85c 27 (#) As prerequisite, fill in the HAL_QSPI_MspInit() :
mbed_official 532:fe11edbda85c 28 (+) Enable QuadSPI clock interface with __HAL_RCC_QSPI_CLK_ENABLE().
mbed_official 532:fe11edbda85c 29 (+) Reset QuadSPI IP with __HAL_RCC_QSPI_FORCE_RESET() and __HAL_RCC_QSPI_RELEASE_RESET().
mbed_official 532:fe11edbda85c 30 (+) Enable the clocks for the QuadSPI GPIOS with __HAL_RCC_GPIOx_CLK_ENABLE().
mbed_official 532:fe11edbda85c 31 (+) Configure these QuadSPI pins in alternate mode using HAL_GPIO_Init().
mbed_official 532:fe11edbda85c 32 (+) If interrupt mode is used, enable and configure QuadSPI global
mbed_official 532:fe11edbda85c 33 interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().
mbed_official 532:fe11edbda85c 34 (+) If DMA mode is used, enable the clocks for the QuadSPI DMA channel
mbed_official 532:fe11edbda85c 35 with __HAL_RCC_DMAx_CLK_ENABLE(), configure DMA with HAL_DMA_Init(),
mbed_official 532:fe11edbda85c 36 link it with QuadSPI handle using __HAL_LINKDMA(), enable and configure
mbed_official 532:fe11edbda85c 37 DMA channel global interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().
mbed_official 532:fe11edbda85c 38 (#) Configure the flash size, the clock prescaler, the fifo threshold, the
mbed_official 532:fe11edbda85c 39 clock mode, the sample shifting and the CS high time using the HAL_QSPI_Init() function.
mbed_official 532:fe11edbda85c 40
mbed_official 532:fe11edbda85c 41 *** Indirect functional mode ***
mbed_official 532:fe11edbda85c 42 ================================
mbed_official 532:fe11edbda85c 43 [..]
mbed_official 532:fe11edbda85c 44 (#) Configure the command sequence using the HAL_QSPI_Command() or HAL_QSPI_Command_IT()
mbed_official 532:fe11edbda85c 45 functions :
mbed_official 532:fe11edbda85c 46 (+) Instruction phase : the mode used and if present the instruction opcode.
mbed_official 532:fe11edbda85c 47 (+) Address phase : the mode used and if present the size and the address value.
mbed_official 532:fe11edbda85c 48 (+) Alternate-bytes phase : the mode used and if present the size and the alternate
mbed_official 532:fe11edbda85c 49 bytes values.
mbed_official 532:fe11edbda85c 50 (+) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).
mbed_official 532:fe11edbda85c 51 (+) Data phase : the mode used and if present the number of bytes.
mbed_official 532:fe11edbda85c 52 (+) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay
mbed_official 532:fe11edbda85c 53 if activated.
mbed_official 532:fe11edbda85c 54 (+) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.
mbed_official 532:fe11edbda85c 55 (#) If no data is required for the command, it is sent directly to the memory :
mbed_official 532:fe11edbda85c 56 (+) In polling mode, the output of the function is done when the transfer is complete.
mbed_official 532:fe11edbda85c 57 (+) In interrupt mode, HAL_QSPI_CmdCpltCallback() will be called when the transfer is complete.
mbed_official 532:fe11edbda85c 58 (#) For the indirect write mode, use HAL_QSPI_Transmit(), HAL_QSPI_Transmit_DMA() or
mbed_official 532:fe11edbda85c 59 HAL_QSPI_Transmit_IT() after the command configuration :
mbed_official 532:fe11edbda85c 60 (+) In polling mode, the output of the function is done when the transfer is complete.
mbed_official 532:fe11edbda85c 61 (+) In interrupt mode, HAL_QSPI_FifoThresholdCallback() will be called when the fifo threshold
mbed_official 532:fe11edbda85c 62 is reached and HAL_QSPI_TxCpltCallback() will be called when the transfer is complete.
mbed_official 532:fe11edbda85c 63 (+) In DMA mode, HAL_QSPI_TxHalfCpltCallback() will be called at the half transfer and
mbed_official 532:fe11edbda85c 64 HAL_QSPI_TxCpltCallback() will be called when the transfer is complete.
mbed_official 532:fe11edbda85c 65 (#) For the indirect read mode, use HAL_QSPI_Receive(), HAL_QSPI_Receive_DMA() or
mbed_official 532:fe11edbda85c 66 HAL_QSPI_Receive_IT() after the command configuration :
mbed_official 532:fe11edbda85c 67 (+) In polling mode, the output of the function is done when the transfer is complete.
mbed_official 532:fe11edbda85c 68 (+) In interrupt mode, HAL_QSPI_FifoThresholdCallback() will be called when the fifo threshold
mbed_official 532:fe11edbda85c 69 is reached and HAL_QSPI_RxCpltCallback() will be called when the transfer is complete.
mbed_official 532:fe11edbda85c 70 (+) In DMA mode, HAL_QSPI_RxHalfCpltCallback() will be called at the half transfer and
mbed_official 532:fe11edbda85c 71 HAL_QSPI_RxCpltCallback() will be called when the transfer is complete.
mbed_official 532:fe11edbda85c 72
mbed_official 532:fe11edbda85c 73 *** Auto-polling functional mode ***
mbed_official 532:fe11edbda85c 74 ====================================
mbed_official 532:fe11edbda85c 75 [..]
mbed_official 532:fe11edbda85c 76 (#) Configure the command sequence and the auto-polling functional mode using the
mbed_official 532:fe11edbda85c 77 HAL_QSPI_AutoPolling() or HAL_QSPI_AutoPolling_IT() functions :
mbed_official 532:fe11edbda85c 78 (+) Instruction phase : the mode used and if present the instruction opcode.
mbed_official 532:fe11edbda85c 79 (+) Address phase : the mode used and if present the size and the address value.
mbed_official 532:fe11edbda85c 80 (+) Alternate-bytes phase : the mode used and if present the size and the alternate
mbed_official 532:fe11edbda85c 81 bytes values.
mbed_official 532:fe11edbda85c 82 (+) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).
mbed_official 532:fe11edbda85c 83 (+) Data phase : the mode used.
mbed_official 532:fe11edbda85c 84 (+) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay
mbed_official 532:fe11edbda85c 85 if activated.
mbed_official 532:fe11edbda85c 86 (+) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.
mbed_official 532:fe11edbda85c 87 (+) The size of the status bytes, the match value, the mask used, the match mode (OR/AND),
mbed_official 532:fe11edbda85c 88 the polling interval and the automatic stop activation.
mbed_official 532:fe11edbda85c 89 (#) After the configuration :
mbed_official 532:fe11edbda85c 90 (+) In polling mode, the output of the function is done when the status match is reached. The
mbed_official 532:fe11edbda85c 91 automatic stop is activated to avoid an infinite loop.
mbed_official 532:fe11edbda85c 92 (+) In interrupt mode, HAL_QSPI_StatusMatchCallback() will be called each time the status match is reached.
mbed_official 532:fe11edbda85c 93
mbed_official 532:fe11edbda85c 94 *** Memory-mapped functional mode ***
mbed_official 532:fe11edbda85c 95 =====================================
mbed_official 532:fe11edbda85c 96 [..]
mbed_official 532:fe11edbda85c 97 (#) Configure the command sequence and the memory-mapped functional mode using the
mbed_official 532:fe11edbda85c 98 HAL_QSPI_MemoryMapped() functions :
mbed_official 532:fe11edbda85c 99 (+) Instruction phase : the mode used and if present the instruction opcode.
mbed_official 532:fe11edbda85c 100 (+) Address phase : the mode used and the size.
mbed_official 532:fe11edbda85c 101 (+) Alternate-bytes phase : the mode used and if present the size and the alternate
mbed_official 532:fe11edbda85c 102 bytes values.
mbed_official 532:fe11edbda85c 103 (+) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).
mbed_official 532:fe11edbda85c 104 (+) Data phase : the mode used.
mbed_official 532:fe11edbda85c 105 (+) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay
mbed_official 532:fe11edbda85c 106 if activated.
mbed_official 532:fe11edbda85c 107 (+) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.
mbed_official 532:fe11edbda85c 108 (+) The timeout activation and the timeout period.
mbed_official 532:fe11edbda85c 109 (#) After the configuration, the QuadSPI will be used as soon as an access on the AHB is done on
mbed_official 532:fe11edbda85c 110 the address range. HAL_QSPI_TimeOutCallback() will be called when the timeout expires.
mbed_official 532:fe11edbda85c 111
mbed_official 532:fe11edbda85c 112 *** Errors management and abort functionality ***
mbed_official 532:fe11edbda85c 113 ==================================================
mbed_official 532:fe11edbda85c 114 [..]
mbed_official 532:fe11edbda85c 115 (#) HAL_QSPI_GetError() function gives the error rised during the last operation.
mbed_official 532:fe11edbda85c 116 (#) HAL_QSPI_Abort() function aborts any on-going operation and flushes the fifo.
mbed_official 532:fe11edbda85c 117 (#) HAL_QSPI_GetState() function gives the current state of the HAL QuadSPI driver.
mbed_official 532:fe11edbda85c 118
mbed_official 532:fe11edbda85c 119 *** Workarounds linked to Silicon Limitation ***
mbed_official 532:fe11edbda85c 120 ====================================================
mbed_official 532:fe11edbda85c 121 [..]
mbed_official 532:fe11edbda85c 122 (#) Workarounds Implemented inside HAL Driver
mbed_official 532:fe11edbda85c 123 (+) Extra data written in the FIFO at the end of a read transfer
mbed_official 532:fe11edbda85c 124
mbed_official 532:fe11edbda85c 125 @endverbatim
mbed_official 532:fe11edbda85c 126 ******************************************************************************
mbed_official 532:fe11edbda85c 127 * @attention
mbed_official 532:fe11edbda85c 128 *
mbed_official 532:fe11edbda85c 129 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 532:fe11edbda85c 130 *
mbed_official 532:fe11edbda85c 131 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 532:fe11edbda85c 132 * are permitted provided that the following conditions are met:
mbed_official 532:fe11edbda85c 133 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 532:fe11edbda85c 134 * this list of conditions and the following disclaimer.
mbed_official 532:fe11edbda85c 135 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 532:fe11edbda85c 136 * this list of conditions and the following disclaimer in the documentation
mbed_official 532:fe11edbda85c 137 * and/or other materials provided with the distribution.
mbed_official 532:fe11edbda85c 138 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 532:fe11edbda85c 139 * may be used to endorse or promote products derived from this software
mbed_official 532:fe11edbda85c 140 * without specific prior written permission.
mbed_official 532:fe11edbda85c 141 *
mbed_official 532:fe11edbda85c 142 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 532:fe11edbda85c 143 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 532:fe11edbda85c 144 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 532:fe11edbda85c 145 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 532:fe11edbda85c 146 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 532:fe11edbda85c 147 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 532:fe11edbda85c 148 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 532:fe11edbda85c 149 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 532:fe11edbda85c 150 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 532:fe11edbda85c 151 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 532:fe11edbda85c 152 *
mbed_official 532:fe11edbda85c 153 ******************************************************************************
mbed_official 532:fe11edbda85c 154 */
mbed_official 532:fe11edbda85c 155
mbed_official 532:fe11edbda85c 156 /* Includes ------------------------------------------------------------------*/
mbed_official 532:fe11edbda85c 157 #include "stm32f4xx_hal.h"
mbed_official 532:fe11edbda85c 158
mbed_official 532:fe11edbda85c 159 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 532:fe11edbda85c 160 * @{
mbed_official 532:fe11edbda85c 161 */
mbed_official 532:fe11edbda85c 162
mbed_official 532:fe11edbda85c 163 /** @defgroup QSPI QSPI
mbed_official 532:fe11edbda85c 164 * @brief HAL QSPI module driver
mbed_official 532:fe11edbda85c 165 * @{
mbed_official 532:fe11edbda85c 166 */
mbed_official 532:fe11edbda85c 167 #ifdef HAL_QSPI_MODULE_ENABLED
mbed_official 532:fe11edbda85c 168
mbed_official 532:fe11edbda85c 169 #if defined(STM32F446xx)
mbed_official 532:fe11edbda85c 170
mbed_official 532:fe11edbda85c 171 /* Private typedef -----------------------------------------------------------*/
mbed_official 532:fe11edbda85c 172 /* Private define ------------------------------------------------------------*/
mbed_official 532:fe11edbda85c 173 /** @addtogroup QSPI_Private_Constants
mbed_official 532:fe11edbda85c 174 * @{
mbed_official 532:fe11edbda85c 175 */
mbed_official 532:fe11edbda85c 176 #define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE ((uint32_t)0x00000000) /*!<Indirect write mode*/
mbed_official 532:fe11edbda85c 177 #define QSPI_FUNCTIONAL_MODE_INDIRECT_READ ((uint32_t)QUADSPI_CCR_FMODE_0) /*!<Indirect read mode*/
mbed_official 532:fe11edbda85c 178 #define QSPI_FUNCTIONAL_MODE_AUTO_POLLING ((uint32_t)QUADSPI_CCR_FMODE_1) /*!<Automatic polling mode*/
mbed_official 532:fe11edbda85c 179 #define QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED ((uint32_t)QUADSPI_CCR_FMODE) /*!<Memory-mapped mode*/
mbed_official 532:fe11edbda85c 180 /**
mbed_official 532:fe11edbda85c 181 * @}
mbed_official 532:fe11edbda85c 182 */
mbed_official 532:fe11edbda85c 183
mbed_official 532:fe11edbda85c 184 /* Private macro -------------------------------------------------------------*/
mbed_official 532:fe11edbda85c 185 /** @addtogroup QSPI_Private_Macros QSPI Private Macros
mbed_official 532:fe11edbda85c 186 * @{
mbed_official 532:fe11edbda85c 187 */
mbed_official 532:fe11edbda85c 188 #define IS_QSPI_FUNCTIONAL_MODE(MODE) (((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE) || \
mbed_official 532:fe11edbda85c 189 ((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_READ) || \
mbed_official 532:fe11edbda85c 190 ((MODE) == QSPI_FUNCTIONAL_MODE_AUTO_POLLING) || \
mbed_official 532:fe11edbda85c 191 ((MODE) == QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
mbed_official 532:fe11edbda85c 192 /**
mbed_official 532:fe11edbda85c 193 * @}
mbed_official 532:fe11edbda85c 194 */
mbed_official 532:fe11edbda85c 195
mbed_official 532:fe11edbda85c 196 /* Private variables ---------------------------------------------------------*/
mbed_official 532:fe11edbda85c 197 /* Private function prototypes -----------------------------------------------*/
mbed_official 532:fe11edbda85c 198 /** @addtogroup QSPI_Private_Functions QSPI Private Functions
mbed_official 532:fe11edbda85c 199 * @{
mbed_official 532:fe11edbda85c 200 */
mbed_official 532:fe11edbda85c 201 static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma);
mbed_official 532:fe11edbda85c 202 static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma);
mbed_official 532:fe11edbda85c 203 static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 532:fe11edbda85c 204 static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 532:fe11edbda85c 205 static void QSPI_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 532:fe11edbda85c 206 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Timeout);
mbed_official 532:fe11edbda85c 207 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode);
mbed_official 532:fe11edbda85c 208 /**
mbed_official 532:fe11edbda85c 209 * @}
mbed_official 532:fe11edbda85c 210 */
mbed_official 532:fe11edbda85c 211
mbed_official 532:fe11edbda85c 212 /* Exported functions ---------------------------------------------------------*/
mbed_official 532:fe11edbda85c 213
mbed_official 532:fe11edbda85c 214 /** @defgroup QSPI_Exported_Functions QSPI Exported Functions
mbed_official 532:fe11edbda85c 215 * @{
mbed_official 532:fe11edbda85c 216 */
mbed_official 532:fe11edbda85c 217
mbed_official 532:fe11edbda85c 218 /** @defgroup QSPI_Exported_Functions_Group1 Initialization/de-initialization functions
mbed_official 532:fe11edbda85c 219 * @brief Initialization and Configuration functions
mbed_official 532:fe11edbda85c 220 *
mbed_official 532:fe11edbda85c 221 @verbatim
mbed_official 532:fe11edbda85c 222 ===============================================================================
mbed_official 532:fe11edbda85c 223 ##### Initialization and Configuration functions #####
mbed_official 532:fe11edbda85c 224 ===============================================================================
mbed_official 532:fe11edbda85c 225 [..]
mbed_official 532:fe11edbda85c 226 This subsection provides a set of functions allowing to :
mbed_official 532:fe11edbda85c 227 (+) Initialize the QuadSPI.
mbed_official 532:fe11edbda85c 228 (+) De-initialize the QuadSPI.
mbed_official 532:fe11edbda85c 229
mbed_official 532:fe11edbda85c 230 @endverbatim
mbed_official 532:fe11edbda85c 231 * @{
mbed_official 532:fe11edbda85c 232 */
mbed_official 532:fe11edbda85c 233
mbed_official 532:fe11edbda85c 234 /**
mbed_official 532:fe11edbda85c 235 * @brief Initializes the QSPI mode according to the specified parameters
mbed_official 532:fe11edbda85c 236 * in the QSPI_InitTypeDef and creates the associated handle.
mbed_official 532:fe11edbda85c 237 * @param hqspi: qspi handle
mbed_official 532:fe11edbda85c 238 * @retval HAL status
mbed_official 532:fe11edbda85c 239 */
mbed_official 532:fe11edbda85c 240 HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 241 {
mbed_official 532:fe11edbda85c 242 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 243
mbed_official 532:fe11edbda85c 244 /* Check the QSPI handle allocation */
mbed_official 532:fe11edbda85c 245 if(hqspi == NULL)
mbed_official 532:fe11edbda85c 246 {
mbed_official 532:fe11edbda85c 247 return HAL_ERROR;
mbed_official 532:fe11edbda85c 248 }
mbed_official 532:fe11edbda85c 249
mbed_official 532:fe11edbda85c 250 /* Check the parameters */
mbed_official 532:fe11edbda85c 251 assert_param(IS_QSPI_ALL_INSTANCE(hqspi->Instance));
mbed_official 532:fe11edbda85c 252 assert_param(IS_QSPI_CLOCK_PRESCALER(hqspi->Init.ClockPrescaler));
mbed_official 532:fe11edbda85c 253 assert_param(IS_QSPI_FIFO_THRESHOLD(hqspi->Init.FifoThreshold));
mbed_official 532:fe11edbda85c 254 assert_param(IS_QSPI_SSHIFT(hqspi->Init.SampleShifting));
mbed_official 532:fe11edbda85c 255 assert_param(IS_QSPI_FLASH_SIZE(hqspi->Init.FlashSize));
mbed_official 532:fe11edbda85c 256 assert_param(IS_QSPI_CS_HIGH_TIME(hqspi->Init.ChipSelectHighTime));
mbed_official 532:fe11edbda85c 257 assert_param(IS_QSPI_CLOCK_MODE(hqspi->Init.ClockMode));
mbed_official 532:fe11edbda85c 258 assert_param(IS_QSPI_DUAL_FLASH_MODE(hqspi->Init.DualFlash));
mbed_official 532:fe11edbda85c 259
mbed_official 532:fe11edbda85c 260 if (hqspi->Init.DualFlash != QSPI_DUALFLASH_ENABLE )
mbed_official 532:fe11edbda85c 261 {
mbed_official 532:fe11edbda85c 262 assert_param(IS_QSPI_FLASH_ID(hqspi->Init.FlashID));
mbed_official 532:fe11edbda85c 263 }
mbed_official 532:fe11edbda85c 264
mbed_official 532:fe11edbda85c 265 /* Process locked */
mbed_official 532:fe11edbda85c 266 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 267
mbed_official 532:fe11edbda85c 268 if(hqspi->State == HAL_QSPI_STATE_RESET)
mbed_official 532:fe11edbda85c 269 {
mbed_official 532:fe11edbda85c 270 /* Allocate lock resource and initialize it */
mbed_official 532:fe11edbda85c 271 hqspi->Lock = HAL_UNLOCKED;
mbed_official 532:fe11edbda85c 272
mbed_official 532:fe11edbda85c 273 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 532:fe11edbda85c 274 HAL_QSPI_MspInit(hqspi);
mbed_official 532:fe11edbda85c 275
mbed_official 532:fe11edbda85c 276 /* Configure the default timeout for the QSPI memory access */
mbed_official 532:fe11edbda85c 277 HAL_QSPI_SetTimeout(hqspi, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);
mbed_official 532:fe11edbda85c 278 }
mbed_official 532:fe11edbda85c 279
mbed_official 532:fe11edbda85c 280 /* Configure QSPI FIFO Threshold */
mbed_official 532:fe11edbda85c 281 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES, ((hqspi->Init.FifoThreshold - 1) << 8));
mbed_official 532:fe11edbda85c 282
mbed_official 532:fe11edbda85c 283 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 284 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
mbed_official 532:fe11edbda85c 285
mbed_official 532:fe11edbda85c 286 if(status == HAL_OK)
mbed_official 532:fe11edbda85c 287 {
mbed_official 532:fe11edbda85c 288
mbed_official 532:fe11edbda85c 289 /* Configure QSPI Clock Prescaler and Sample Shift */
mbed_official 532:fe11edbda85c 290 MODIFY_REG(hqspi->Instance->CR,(QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM), ((hqspi->Init.ClockPrescaler << 24)| hqspi->Init.SampleShifting | hqspi->Init.FlashID| hqspi->Init.DualFlash ));
mbed_official 532:fe11edbda85c 291
mbed_official 532:fe11edbda85c 292 /* Configure QSPI Flash Size, CS High Time and Clock Mode */
mbed_official 532:fe11edbda85c 293 MODIFY_REG(hqspi->Instance->DCR, (QUADSPI_DCR_FSIZE | QUADSPI_DCR_CSHT | QUADSPI_DCR_CKMODE),
mbed_official 532:fe11edbda85c 294 ((hqspi->Init.FlashSize << 16) | hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode));
mbed_official 532:fe11edbda85c 295
mbed_official 532:fe11edbda85c 296 /* Enable the QSPI peripheral */
mbed_official 532:fe11edbda85c 297 __HAL_QSPI_ENABLE(hqspi);
mbed_official 532:fe11edbda85c 298
mbed_official 532:fe11edbda85c 299 /* Set QSPI error code to none */
mbed_official 532:fe11edbda85c 300 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 301
mbed_official 532:fe11edbda85c 302 /* Initialize the QSPI state */
mbed_official 532:fe11edbda85c 303 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 304 }
mbed_official 532:fe11edbda85c 305
mbed_official 532:fe11edbda85c 306 /* Release Lock */
mbed_official 532:fe11edbda85c 307 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 308
mbed_official 532:fe11edbda85c 309 /* Return function status */
mbed_official 532:fe11edbda85c 310 return status;
mbed_official 532:fe11edbda85c 311 }
mbed_official 532:fe11edbda85c 312
mbed_official 532:fe11edbda85c 313 /**
mbed_official 532:fe11edbda85c 314 * @brief DeInitializes the QSPI peripheral
mbed_official 532:fe11edbda85c 315 * @param hqspi: qspi handle
mbed_official 532:fe11edbda85c 316 * @retval HAL status
mbed_official 532:fe11edbda85c 317 */
mbed_official 532:fe11edbda85c 318 HAL_StatusTypeDef HAL_QSPI_DeInit(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 319 {
mbed_official 532:fe11edbda85c 320 /* Check the QSPI handle allocation */
mbed_official 532:fe11edbda85c 321 if(hqspi == NULL)
mbed_official 532:fe11edbda85c 322 {
mbed_official 532:fe11edbda85c 323 return HAL_ERROR;
mbed_official 532:fe11edbda85c 324 }
mbed_official 532:fe11edbda85c 325
mbed_official 532:fe11edbda85c 326 /* Process locked */
mbed_official 532:fe11edbda85c 327 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 328
mbed_official 532:fe11edbda85c 329 /* Disable the QSPI Peripheral Clock */
mbed_official 532:fe11edbda85c 330 __HAL_QSPI_DISABLE(hqspi);
mbed_official 532:fe11edbda85c 331
mbed_official 532:fe11edbda85c 332 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
mbed_official 532:fe11edbda85c 333 HAL_QSPI_MspDeInit(hqspi);
mbed_official 532:fe11edbda85c 334
mbed_official 532:fe11edbda85c 335 /* Set QSPI error code to none */
mbed_official 532:fe11edbda85c 336 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 337
mbed_official 532:fe11edbda85c 338 /* Initialize the QSPI state */
mbed_official 532:fe11edbda85c 339 hqspi->State = HAL_QSPI_STATE_RESET;
mbed_official 532:fe11edbda85c 340
mbed_official 532:fe11edbda85c 341 /* Release Lock */
mbed_official 532:fe11edbda85c 342 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 343
mbed_official 532:fe11edbda85c 344 return HAL_OK;
mbed_official 532:fe11edbda85c 345 }
mbed_official 532:fe11edbda85c 346
mbed_official 532:fe11edbda85c 347 /**
mbed_official 532:fe11edbda85c 348 * @brief QSPI MSP Init
mbed_official 532:fe11edbda85c 349 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 350 * @retval None
mbed_official 532:fe11edbda85c 351 */
mbed_official 532:fe11edbda85c 352 __weak void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 353 {
mbed_official 532:fe11edbda85c 354 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 355 the HAL_QSPI_MspInit can be implemented in the user file
mbed_official 532:fe11edbda85c 356 */
mbed_official 532:fe11edbda85c 357 }
mbed_official 532:fe11edbda85c 358
mbed_official 532:fe11edbda85c 359 /**
mbed_official 532:fe11edbda85c 360 * @brief QSPI MSP DeInit
mbed_official 532:fe11edbda85c 361 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 362 * @retval None
mbed_official 532:fe11edbda85c 363 */
mbed_official 532:fe11edbda85c 364 __weak void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 365 {
mbed_official 532:fe11edbda85c 366 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 367 the HAL_QSPI_MspDeInit can be implemented in the user file
mbed_official 532:fe11edbda85c 368 */
mbed_official 532:fe11edbda85c 369 }
mbed_official 532:fe11edbda85c 370
mbed_official 532:fe11edbda85c 371 /**
mbed_official 532:fe11edbda85c 372 * @}
mbed_official 532:fe11edbda85c 373 */
mbed_official 532:fe11edbda85c 374
mbed_official 532:fe11edbda85c 375 /** @defgroup QSPI_Exported_Functions_Group2 IO operation functions
mbed_official 532:fe11edbda85c 376 * @brief QSPI Transmit/Receive functions
mbed_official 532:fe11edbda85c 377 *
mbed_official 532:fe11edbda85c 378 @verbatim
mbed_official 532:fe11edbda85c 379 ===============================================================================
mbed_official 532:fe11edbda85c 380 ##### I/O operation functions #####
mbed_official 532:fe11edbda85c 381 ===============================================================================
mbed_official 532:fe11edbda85c 382 [..]
mbed_official 532:fe11edbda85c 383 This subsection provides a set of functions allowing to :
mbed_official 532:fe11edbda85c 384 (+) Handle the interrupts.
mbed_official 532:fe11edbda85c 385 (+) Handle the command sequence.
mbed_official 532:fe11edbda85c 386 (+) Transmit data in blocking, interrupt or DMA mode.
mbed_official 532:fe11edbda85c 387 (+) Receive data in blocking, interrupt or DMA mode.
mbed_official 532:fe11edbda85c 388 (+) Manage the auto-polling functional mode.
mbed_official 532:fe11edbda85c 389 (+) Manage the memory-mapped functional mode.
mbed_official 532:fe11edbda85c 390
mbed_official 532:fe11edbda85c 391 @endverbatim
mbed_official 532:fe11edbda85c 392 * @{
mbed_official 532:fe11edbda85c 393 */
mbed_official 532:fe11edbda85c 394
mbed_official 532:fe11edbda85c 395 /**
mbed_official 532:fe11edbda85c 396 * @brief This function handles QSPI interrupt request.
mbed_official 532:fe11edbda85c 397 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 398 * @retval None.
mbed_official 532:fe11edbda85c 399 */
mbed_official 532:fe11edbda85c 400 void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 401 {
mbed_official 532:fe11edbda85c 402 __IO uint32_t *data_reg;
mbed_official 532:fe11edbda85c 403 uint32_t flag = 0, itsource = 0;
mbed_official 532:fe11edbda85c 404
mbed_official 532:fe11edbda85c 405 /* QSPI FIFO Threshold interrupt occurred ----------------------------------*/
mbed_official 532:fe11edbda85c 406 flag = __HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT);
mbed_official 532:fe11edbda85c 407 itsource = __HAL_QSPI_GET_IT_SOURCE(hqspi, QSPI_IT_FT);
mbed_official 532:fe11edbda85c 408
mbed_official 532:fe11edbda85c 409 if((flag != RESET) && (itsource != RESET))
mbed_official 532:fe11edbda85c 410 {
mbed_official 532:fe11edbda85c 411 data_reg = &hqspi->Instance->DR;
mbed_official 532:fe11edbda85c 412
mbed_official 532:fe11edbda85c 413 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
mbed_official 532:fe11edbda85c 414 {
mbed_official 532:fe11edbda85c 415 /* Transmission process */
mbed_official 532:fe11edbda85c 416 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0)
mbed_official 532:fe11edbda85c 417 {
mbed_official 532:fe11edbda85c 418 if (hqspi->TxXferCount > 0)
mbed_official 532:fe11edbda85c 419 {
mbed_official 532:fe11edbda85c 420 /* Fill the FIFO until it is full */
mbed_official 532:fe11edbda85c 421 *(__IO uint8_t *)data_reg = *hqspi->pTxBuffPtr++;
mbed_official 532:fe11edbda85c 422 hqspi->TxXferCount--;
mbed_official 532:fe11edbda85c 423 }
mbed_official 532:fe11edbda85c 424 else
mbed_official 532:fe11edbda85c 425 {
mbed_official 532:fe11edbda85c 426 /* No more data available for the transfer */
mbed_official 532:fe11edbda85c 427 break;
mbed_official 532:fe11edbda85c 428 }
mbed_official 532:fe11edbda85c 429 }
mbed_official 532:fe11edbda85c 430 }
mbed_official 532:fe11edbda85c 431 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
mbed_official 532:fe11edbda85c 432 {
mbed_official 532:fe11edbda85c 433 /* Receiving Process */
mbed_official 532:fe11edbda85c 434 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0)
mbed_official 532:fe11edbda85c 435 {
mbed_official 532:fe11edbda85c 436 if (hqspi->RxXferCount > 0)
mbed_official 532:fe11edbda85c 437 {
mbed_official 532:fe11edbda85c 438 /* Read the FIFO until it is empty */
mbed_official 532:fe11edbda85c 439 *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
mbed_official 532:fe11edbda85c 440 hqspi->RxXferCount--;
mbed_official 532:fe11edbda85c 441 }
mbed_official 532:fe11edbda85c 442 else
mbed_official 532:fe11edbda85c 443 {
mbed_official 532:fe11edbda85c 444 /* All data have been received for the transfer */
mbed_official 532:fe11edbda85c 445 break;
mbed_official 532:fe11edbda85c 446 }
mbed_official 532:fe11edbda85c 447 }
mbed_official 532:fe11edbda85c 448 }
mbed_official 532:fe11edbda85c 449
mbed_official 532:fe11edbda85c 450 /* FIFO Threshold callback */
mbed_official 532:fe11edbda85c 451 HAL_QSPI_FifoThresholdCallback(hqspi);
mbed_official 532:fe11edbda85c 452 }
mbed_official 532:fe11edbda85c 453
mbed_official 532:fe11edbda85c 454 /* QSPI Transfer Complete interrupt occurred -------------------------------*/
mbed_official 532:fe11edbda85c 455 flag = __HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 456 itsource = __HAL_QSPI_GET_IT_SOURCE(hqspi, QSPI_IT_TC);
mbed_official 532:fe11edbda85c 457
mbed_official 532:fe11edbda85c 458 if((flag != RESET) && (itsource != RESET))
mbed_official 532:fe11edbda85c 459 {
mbed_official 532:fe11edbda85c 460 /* Clear interrupt */
mbed_official 532:fe11edbda85c 461 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 462
mbed_official 532:fe11edbda85c 463 /* Disable the QSPI FIFO Threshold, Transfer Error and Transfer complete Interrupts */
mbed_official 532:fe11edbda85c 464 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
mbed_official 532:fe11edbda85c 465
mbed_official 532:fe11edbda85c 466 /* Transfer complete callback */
mbed_official 532:fe11edbda85c 467 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
mbed_official 532:fe11edbda85c 468 {
mbed_official 532:fe11edbda85c 469 /* Clear Busy bit */
mbed_official 532:fe11edbda85c 470 HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 471
mbed_official 532:fe11edbda85c 472 /* TX Complete callback */
mbed_official 532:fe11edbda85c 473 HAL_QSPI_TxCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 474 }
mbed_official 532:fe11edbda85c 475 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
mbed_official 532:fe11edbda85c 476 {
mbed_official 532:fe11edbda85c 477 data_reg = &hqspi->Instance->DR;
mbed_official 532:fe11edbda85c 478 while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0)
mbed_official 532:fe11edbda85c 479 {
mbed_official 532:fe11edbda85c 480 if (hqspi->RxXferCount > 0)
mbed_official 532:fe11edbda85c 481 {
mbed_official 532:fe11edbda85c 482 /* Read the last data received in the FIFO until it is empty */
mbed_official 532:fe11edbda85c 483 *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
mbed_official 532:fe11edbda85c 484 hqspi->RxXferCount--;
mbed_official 532:fe11edbda85c 485 }
mbed_official 532:fe11edbda85c 486 else
mbed_official 532:fe11edbda85c 487 {
mbed_official 532:fe11edbda85c 488 /* All data have been received for the transfer */
mbed_official 532:fe11edbda85c 489 break;
mbed_official 532:fe11edbda85c 490 }
mbed_official 532:fe11edbda85c 491 }
mbed_official 532:fe11edbda85c 492
mbed_official 532:fe11edbda85c 493 /* Workaround - Extra data written in the FIFO at the end of a read transfer */
mbed_official 532:fe11edbda85c 494 HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 495
mbed_official 532:fe11edbda85c 496 /* RX Complete callback */
mbed_official 532:fe11edbda85c 497 HAL_QSPI_RxCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 498 }
mbed_official 532:fe11edbda85c 499 else if(hqspi->State == HAL_QSPI_STATE_BUSY)
mbed_official 532:fe11edbda85c 500 {
mbed_official 532:fe11edbda85c 501 /* Command Complete callback */
mbed_official 532:fe11edbda85c 502 HAL_QSPI_CmdCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 503 }
mbed_official 532:fe11edbda85c 504
mbed_official 532:fe11edbda85c 505 /* Change state of QSPI */
mbed_official 532:fe11edbda85c 506 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 507 }
mbed_official 532:fe11edbda85c 508
mbed_official 532:fe11edbda85c 509 /* QSPI Status Match interrupt occurred ------------------------------------*/
mbed_official 532:fe11edbda85c 510 flag = __HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_SM);
mbed_official 532:fe11edbda85c 511 itsource = __HAL_QSPI_GET_IT_SOURCE(hqspi, QSPI_IT_SM);
mbed_official 532:fe11edbda85c 512
mbed_official 532:fe11edbda85c 513 if((flag != RESET) && (itsource != RESET))
mbed_official 532:fe11edbda85c 514 {
mbed_official 532:fe11edbda85c 515 /* Clear interrupt */
mbed_official 532:fe11edbda85c 516 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
mbed_official 532:fe11edbda85c 517
mbed_official 532:fe11edbda85c 518 /* Check if the automatic poll mode stop is activated */
mbed_official 532:fe11edbda85c 519 if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0)
mbed_official 532:fe11edbda85c 520 {
mbed_official 532:fe11edbda85c 521 /* Disable the QSPI FIFO Threshold, Transfer Error and Status Match Interrupts */
mbed_official 532:fe11edbda85c 522 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TE);
mbed_official 532:fe11edbda85c 523
mbed_official 532:fe11edbda85c 524 /* Change state of QSPI */
mbed_official 532:fe11edbda85c 525 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 526 }
mbed_official 532:fe11edbda85c 527
mbed_official 532:fe11edbda85c 528 /* Status match callback */
mbed_official 532:fe11edbda85c 529 HAL_QSPI_StatusMatchCallback(hqspi);
mbed_official 532:fe11edbda85c 530 }
mbed_official 532:fe11edbda85c 531
mbed_official 532:fe11edbda85c 532 /* QSPI Transfer Error interrupt occurred ----------------------------------*/
mbed_official 532:fe11edbda85c 533 flag = __HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_TE);
mbed_official 532:fe11edbda85c 534 itsource = __HAL_QSPI_GET_IT_SOURCE(hqspi, QSPI_IT_TE);
mbed_official 532:fe11edbda85c 535
mbed_official 532:fe11edbda85c 536 if((flag != RESET) && (itsource != RESET))
mbed_official 532:fe11edbda85c 537 {
mbed_official 532:fe11edbda85c 538 /* Clear interrupt */
mbed_official 532:fe11edbda85c 539 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE);
mbed_official 532:fe11edbda85c 540
mbed_official 532:fe11edbda85c 541 /* Disable all the QSPI Interrupts */
mbed_official 532:fe11edbda85c 542 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
mbed_official 532:fe11edbda85c 543
mbed_official 532:fe11edbda85c 544 /* Set error code */
mbed_official 532:fe11edbda85c 545 hqspi->ErrorCode |= HAL_QSPI_ERROR_TRANSFER;
mbed_official 532:fe11edbda85c 546
mbed_official 532:fe11edbda85c 547 /* Change state of QSPI */
mbed_official 532:fe11edbda85c 548 hqspi->State = HAL_QSPI_STATE_ERROR;
mbed_official 532:fe11edbda85c 549
mbed_official 532:fe11edbda85c 550 /* Error callback */
mbed_official 532:fe11edbda85c 551 HAL_QSPI_ErrorCallback(hqspi);
mbed_official 532:fe11edbda85c 552 }
mbed_official 532:fe11edbda85c 553
mbed_official 532:fe11edbda85c 554 /* QSPI Time out interrupt occurred -----------------------------------------*/
mbed_official 532:fe11edbda85c 555 flag = __HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_TO);
mbed_official 532:fe11edbda85c 556 itsource = __HAL_QSPI_GET_IT_SOURCE(hqspi, QSPI_IT_TO);
mbed_official 532:fe11edbda85c 557
mbed_official 532:fe11edbda85c 558 if((flag != RESET) && (itsource != RESET))
mbed_official 532:fe11edbda85c 559 {
mbed_official 532:fe11edbda85c 560 /* Clear interrupt */
mbed_official 532:fe11edbda85c 561 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
mbed_official 532:fe11edbda85c 562
mbed_official 532:fe11edbda85c 563 /* Time out callback */
mbed_official 532:fe11edbda85c 564 HAL_QSPI_TimeOutCallback(hqspi);
mbed_official 532:fe11edbda85c 565 }
mbed_official 532:fe11edbda85c 566 }
mbed_official 532:fe11edbda85c 567
mbed_official 532:fe11edbda85c 568 /**
mbed_official 532:fe11edbda85c 569 * @brief Sets the command configuration.
mbed_official 532:fe11edbda85c 570 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 571 * @param cmd : structure that contains the command configuration information
mbed_official 532:fe11edbda85c 572 * @param Timeout : Time out duration
mbed_official 532:fe11edbda85c 573 * @note This function is used only in Indirect Read or Write Modes
mbed_official 532:fe11edbda85c 574 * @retval HAL status
mbed_official 532:fe11edbda85c 575 */
mbed_official 532:fe11edbda85c 576 HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)
mbed_official 532:fe11edbda85c 577 {
mbed_official 532:fe11edbda85c 578 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 579
mbed_official 532:fe11edbda85c 580 /* Check the parameters */
mbed_official 532:fe11edbda85c 581 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
mbed_official 532:fe11edbda85c 582 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 583 {
mbed_official 532:fe11edbda85c 584 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
mbed_official 532:fe11edbda85c 585 }
mbed_official 532:fe11edbda85c 586
mbed_official 532:fe11edbda85c 587 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
mbed_official 532:fe11edbda85c 588 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 589 {
mbed_official 532:fe11edbda85c 590 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
mbed_official 532:fe11edbda85c 591 }
mbed_official 532:fe11edbda85c 592
mbed_official 532:fe11edbda85c 593 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
mbed_official 532:fe11edbda85c 594 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 595 {
mbed_official 532:fe11edbda85c 596 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
mbed_official 532:fe11edbda85c 597 }
mbed_official 532:fe11edbda85c 598
mbed_official 532:fe11edbda85c 599 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
mbed_official 532:fe11edbda85c 600 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
mbed_official 532:fe11edbda85c 601
mbed_official 532:fe11edbda85c 602 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
mbed_official 532:fe11edbda85c 603 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
mbed_official 532:fe11edbda85c 604 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
mbed_official 532:fe11edbda85c 605
mbed_official 532:fe11edbda85c 606 /* Process locked */
mbed_official 532:fe11edbda85c 607 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 608
mbed_official 532:fe11edbda85c 609 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 610 {
mbed_official 532:fe11edbda85c 611 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 612
mbed_official 532:fe11edbda85c 613 /* Update QSPI state */
mbed_official 532:fe11edbda85c 614 hqspi->State = HAL_QSPI_STATE_BUSY;
mbed_official 532:fe11edbda85c 615
mbed_official 532:fe11edbda85c 616 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 617 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, Timeout);
mbed_official 532:fe11edbda85c 618
mbed_official 532:fe11edbda85c 619 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 620 {
mbed_official 532:fe11edbda85c 621 /* Call the configuration function */
mbed_official 532:fe11edbda85c 622 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
mbed_official 532:fe11edbda85c 623
mbed_official 532:fe11edbda85c 624 if (cmd->DataMode == QSPI_DATA_NONE)
mbed_official 532:fe11edbda85c 625 {
mbed_official 532:fe11edbda85c 626 /* When there is no data phase, the transfer start as soon as the configuration is done
mbed_official 532:fe11edbda85c 627 so wait until TC flag is set to go back in idle state */
mbed_official 532:fe11edbda85c 628 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 629 {
mbed_official 532:fe11edbda85c 630 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 631 }
mbed_official 532:fe11edbda85c 632 else
mbed_official 532:fe11edbda85c 633 {
mbed_official 532:fe11edbda85c 634 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 635
mbed_official 532:fe11edbda85c 636 /* Update QSPI state */
mbed_official 532:fe11edbda85c 637 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 638 }
mbed_official 532:fe11edbda85c 639
mbed_official 532:fe11edbda85c 640 }
mbed_official 532:fe11edbda85c 641 else
mbed_official 532:fe11edbda85c 642 {
mbed_official 532:fe11edbda85c 643 /* Update QSPI state */
mbed_official 532:fe11edbda85c 644 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 645 }
mbed_official 532:fe11edbda85c 646 }
mbed_official 532:fe11edbda85c 647 }
mbed_official 532:fe11edbda85c 648 else
mbed_official 532:fe11edbda85c 649 {
mbed_official 532:fe11edbda85c 650 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 651 }
mbed_official 532:fe11edbda85c 652
mbed_official 532:fe11edbda85c 653 /* Process unlocked */
mbed_official 532:fe11edbda85c 654 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 655
mbed_official 532:fe11edbda85c 656 /* Return function status */
mbed_official 532:fe11edbda85c 657 return status;
mbed_official 532:fe11edbda85c 658 }
mbed_official 532:fe11edbda85c 659
mbed_official 532:fe11edbda85c 660 /**
mbed_official 532:fe11edbda85c 661 * @brief Sets the command configuration in interrupt mode.
mbed_official 532:fe11edbda85c 662 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 663 * @param cmd : structure that contains the command configuration information
mbed_official 532:fe11edbda85c 664 * @note This function is used only in Indirect Read or Write Modes
mbed_official 532:fe11edbda85c 665 * @retval HAL status
mbed_official 532:fe11edbda85c 666 */
mbed_official 532:fe11edbda85c 667 HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)
mbed_official 532:fe11edbda85c 668 {
mbed_official 532:fe11edbda85c 669 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 670
mbed_official 532:fe11edbda85c 671 /* Check the parameters */
mbed_official 532:fe11edbda85c 672 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
mbed_official 532:fe11edbda85c 673 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 674 {
mbed_official 532:fe11edbda85c 675 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
mbed_official 532:fe11edbda85c 676 }
mbed_official 532:fe11edbda85c 677
mbed_official 532:fe11edbda85c 678 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
mbed_official 532:fe11edbda85c 679 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 680 {
mbed_official 532:fe11edbda85c 681 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
mbed_official 532:fe11edbda85c 682 }
mbed_official 532:fe11edbda85c 683
mbed_official 532:fe11edbda85c 684 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
mbed_official 532:fe11edbda85c 685 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 686 {
mbed_official 532:fe11edbda85c 687 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
mbed_official 532:fe11edbda85c 688 }
mbed_official 532:fe11edbda85c 689
mbed_official 532:fe11edbda85c 690 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
mbed_official 532:fe11edbda85c 691 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
mbed_official 532:fe11edbda85c 692
mbed_official 532:fe11edbda85c 693 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
mbed_official 532:fe11edbda85c 694 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
mbed_official 532:fe11edbda85c 695 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
mbed_official 532:fe11edbda85c 696
mbed_official 532:fe11edbda85c 697 /* Process locked */
mbed_official 532:fe11edbda85c 698 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 699
mbed_official 532:fe11edbda85c 700 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 701 {
mbed_official 532:fe11edbda85c 702 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 703
mbed_official 532:fe11edbda85c 704 /* Update QSPI state */
mbed_official 532:fe11edbda85c 705 hqspi->State = HAL_QSPI_STATE_BUSY;
mbed_official 532:fe11edbda85c 706
mbed_official 532:fe11edbda85c 707 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 708 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
mbed_official 532:fe11edbda85c 709
mbed_official 532:fe11edbda85c 710 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 711 {
mbed_official 532:fe11edbda85c 712 if (cmd->DataMode == QSPI_DATA_NONE)
mbed_official 532:fe11edbda85c 713 {
mbed_official 532:fe11edbda85c 714 /* When there is no data phase, the transfer start as soon as the configuration is done
mbed_official 532:fe11edbda85c 715 so activate TC and TE interrupts */
mbed_official 532:fe11edbda85c 716 /* Enable the QSPI Transfer Error Interrupt */
mbed_official 532:fe11edbda85c 717 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);
mbed_official 532:fe11edbda85c 718 }
mbed_official 532:fe11edbda85c 719
mbed_official 532:fe11edbda85c 720 /* Call the configuration function */
mbed_official 532:fe11edbda85c 721 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
mbed_official 532:fe11edbda85c 722
mbed_official 532:fe11edbda85c 723 if (cmd->DataMode != QSPI_DATA_NONE)
mbed_official 532:fe11edbda85c 724 {
mbed_official 532:fe11edbda85c 725 /* Update QSPI state */
mbed_official 532:fe11edbda85c 726 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 727 }
mbed_official 532:fe11edbda85c 728 }
mbed_official 532:fe11edbda85c 729 }
mbed_official 532:fe11edbda85c 730 else
mbed_official 532:fe11edbda85c 731 {
mbed_official 532:fe11edbda85c 732 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 733 }
mbed_official 532:fe11edbda85c 734
mbed_official 532:fe11edbda85c 735 /* Process unlocked */
mbed_official 532:fe11edbda85c 736 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 737
mbed_official 532:fe11edbda85c 738 /* Return function status */
mbed_official 532:fe11edbda85c 739 return status;
mbed_official 532:fe11edbda85c 740 }
mbed_official 532:fe11edbda85c 741
mbed_official 532:fe11edbda85c 742 /**
mbed_official 532:fe11edbda85c 743 * @brief Transmit an amount of data in blocking mode.
mbed_official 532:fe11edbda85c 744 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 745 * @param pData: pointer to data buffer
mbed_official 532:fe11edbda85c 746 * @param Timeout : Time out duration
mbed_official 532:fe11edbda85c 747 * @note This function is used only in Indirect Write Mode
mbed_official 532:fe11edbda85c 748 * @retval HAL status
mbed_official 532:fe11edbda85c 749 */
mbed_official 532:fe11edbda85c 750 HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
mbed_official 532:fe11edbda85c 751 {
mbed_official 532:fe11edbda85c 752 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 753 __IO uint32_t *data_reg = &hqspi->Instance->DR;
mbed_official 532:fe11edbda85c 754
mbed_official 532:fe11edbda85c 755 /* Process locked */
mbed_official 532:fe11edbda85c 756 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 757
mbed_official 532:fe11edbda85c 758 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 759 {
mbed_official 532:fe11edbda85c 760 if(pData != NULL )
mbed_official 532:fe11edbda85c 761 {
mbed_official 532:fe11edbda85c 762 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 763
mbed_official 532:fe11edbda85c 764 /* Update state */
mbed_official 532:fe11edbda85c 765 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
mbed_official 532:fe11edbda85c 766
mbed_official 532:fe11edbda85c 767 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 768 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 769 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 770 hqspi->pTxBuffPtr = pData;
mbed_official 532:fe11edbda85c 771
mbed_official 532:fe11edbda85c 772 /* Configure QSPI: CCR register with functional as indirect write */
mbed_official 532:fe11edbda85c 773 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
mbed_official 532:fe11edbda85c 774
mbed_official 532:fe11edbda85c 775 while(hqspi->TxXferCount > 0)
mbed_official 532:fe11edbda85c 776 {
mbed_official 532:fe11edbda85c 777 /* Wait until FT flag is set to send data */
mbed_official 532:fe11edbda85c 778 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 779 {
mbed_official 532:fe11edbda85c 780 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 781 break;
mbed_official 532:fe11edbda85c 782 }
mbed_official 532:fe11edbda85c 783
mbed_official 532:fe11edbda85c 784 *(__IO uint8_t *)data_reg = *hqspi->pTxBuffPtr++;
mbed_official 532:fe11edbda85c 785 hqspi->TxXferCount--;
mbed_official 532:fe11edbda85c 786 }
mbed_official 532:fe11edbda85c 787
mbed_official 532:fe11edbda85c 788 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 789 {
mbed_official 532:fe11edbda85c 790 /* Wait until TC flag is set to go back in idle state */
mbed_official 532:fe11edbda85c 791 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 792 {
mbed_official 532:fe11edbda85c 793 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 794 }
mbed_official 532:fe11edbda85c 795 else
mbed_official 532:fe11edbda85c 796 {
mbed_official 532:fe11edbda85c 797 /* Clear Transfer Complete bit */
mbed_official 532:fe11edbda85c 798 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 799
mbed_official 532:fe11edbda85c 800 /* Clear Busy bit */
mbed_official 532:fe11edbda85c 801 status = HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 802 }
mbed_official 532:fe11edbda85c 803 }
mbed_official 532:fe11edbda85c 804
mbed_official 532:fe11edbda85c 805 /* Update QSPI state */
mbed_official 532:fe11edbda85c 806 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 807 }
mbed_official 532:fe11edbda85c 808 else
mbed_official 532:fe11edbda85c 809 {
mbed_official 532:fe11edbda85c 810 status = HAL_ERROR;
mbed_official 532:fe11edbda85c 811 }
mbed_official 532:fe11edbda85c 812 }
mbed_official 532:fe11edbda85c 813 else
mbed_official 532:fe11edbda85c 814 {
mbed_official 532:fe11edbda85c 815 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 816 }
mbed_official 532:fe11edbda85c 817
mbed_official 532:fe11edbda85c 818 /* Process unlocked */
mbed_official 532:fe11edbda85c 819 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 820
mbed_official 532:fe11edbda85c 821 return status;
mbed_official 532:fe11edbda85c 822 }
mbed_official 532:fe11edbda85c 823
mbed_official 532:fe11edbda85c 824
mbed_official 532:fe11edbda85c 825 /**
mbed_official 532:fe11edbda85c 826 * @brief Receive an amount of data in blocking mode
mbed_official 532:fe11edbda85c 827 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 828 * @param pData: pointer to data buffer
mbed_official 532:fe11edbda85c 829 * @param Timeout : Time out duration
mbed_official 532:fe11edbda85c 830 * @note This function is used only in Indirect Read Mode
mbed_official 532:fe11edbda85c 831 * @retval HAL status
mbed_official 532:fe11edbda85c 832 */
mbed_official 532:fe11edbda85c 833 HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
mbed_official 532:fe11edbda85c 834 {
mbed_official 532:fe11edbda85c 835 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 836 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
mbed_official 532:fe11edbda85c 837 __IO uint32_t *data_reg = &hqspi->Instance->DR;
mbed_official 532:fe11edbda85c 838
mbed_official 532:fe11edbda85c 839 /* Process locked */
mbed_official 532:fe11edbda85c 840 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 841
mbed_official 532:fe11edbda85c 842 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 843 {
mbed_official 532:fe11edbda85c 844 if(pData != NULL )
mbed_official 532:fe11edbda85c 845 {
mbed_official 532:fe11edbda85c 846 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 847
mbed_official 532:fe11edbda85c 848 /* Update state */
mbed_official 532:fe11edbda85c 849 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
mbed_official 532:fe11edbda85c 850
mbed_official 532:fe11edbda85c 851 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 852 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 853 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 854 hqspi->pRxBuffPtr = pData;
mbed_official 532:fe11edbda85c 855
mbed_official 532:fe11edbda85c 856 /* Configure QSPI: CCR register with functional as indirect read */
mbed_official 532:fe11edbda85c 857 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
mbed_official 532:fe11edbda85c 858
mbed_official 532:fe11edbda85c 859 /* Start the transfer by re-writing the address in AR register */
mbed_official 532:fe11edbda85c 860 WRITE_REG(hqspi->Instance->AR, addr_reg);
mbed_official 532:fe11edbda85c 861
mbed_official 532:fe11edbda85c 862 while(hqspi->RxXferCount > 0)
mbed_official 532:fe11edbda85c 863 {
mbed_official 532:fe11edbda85c 864 /* Wait until FT or TC flag is set to read received data */
mbed_official 532:fe11edbda85c 865 if(QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 866 {
mbed_official 532:fe11edbda85c 867 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 868 break;
mbed_official 532:fe11edbda85c 869 }
mbed_official 532:fe11edbda85c 870
mbed_official 532:fe11edbda85c 871 *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
mbed_official 532:fe11edbda85c 872 hqspi->RxXferCount--;
mbed_official 532:fe11edbda85c 873 }
mbed_official 532:fe11edbda85c 874
mbed_official 532:fe11edbda85c 875 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 876 {
mbed_official 532:fe11edbda85c 877 /* Wait until TC flag is set to go back in idle state */
mbed_official 532:fe11edbda85c 878 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 879 {
mbed_official 532:fe11edbda85c 880 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 881 }
mbed_official 532:fe11edbda85c 882 else
mbed_official 532:fe11edbda85c 883 {
mbed_official 532:fe11edbda85c 884 /* Clear Transfer Complete bit */
mbed_official 532:fe11edbda85c 885 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 886
mbed_official 532:fe11edbda85c 887 /* Workaround - Extra data written in the FIFO at the end of a read transfer */
mbed_official 532:fe11edbda85c 888 status = HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 889 }
mbed_official 532:fe11edbda85c 890 }
mbed_official 532:fe11edbda85c 891
mbed_official 532:fe11edbda85c 892 /* Update QSPI state */
mbed_official 532:fe11edbda85c 893 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 894 }
mbed_official 532:fe11edbda85c 895 else
mbed_official 532:fe11edbda85c 896 {
mbed_official 532:fe11edbda85c 897 status = HAL_ERROR;
mbed_official 532:fe11edbda85c 898 }
mbed_official 532:fe11edbda85c 899 }
mbed_official 532:fe11edbda85c 900 else
mbed_official 532:fe11edbda85c 901 {
mbed_official 532:fe11edbda85c 902 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 903 }
mbed_official 532:fe11edbda85c 904
mbed_official 532:fe11edbda85c 905 /* Process unlocked */
mbed_official 532:fe11edbda85c 906 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 907
mbed_official 532:fe11edbda85c 908 return status;
mbed_official 532:fe11edbda85c 909 }
mbed_official 532:fe11edbda85c 910
mbed_official 532:fe11edbda85c 911 /**
mbed_official 532:fe11edbda85c 912 * @brief Send an amount of data in interrupt mode
mbed_official 532:fe11edbda85c 913 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 914 * @param pData: pointer to data buffer
mbed_official 532:fe11edbda85c 915 * @note This function is used only in Indirect Write Mode
mbed_official 532:fe11edbda85c 916 * @retval HAL status
mbed_official 532:fe11edbda85c 917 */
mbed_official 532:fe11edbda85c 918 HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
mbed_official 532:fe11edbda85c 919 {
mbed_official 532:fe11edbda85c 920 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 921
mbed_official 532:fe11edbda85c 922 /* Process locked */
mbed_official 532:fe11edbda85c 923 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 924
mbed_official 532:fe11edbda85c 925 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 926 {
mbed_official 532:fe11edbda85c 927 if(pData != NULL )
mbed_official 532:fe11edbda85c 928 {
mbed_official 532:fe11edbda85c 929 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 930
mbed_official 532:fe11edbda85c 931 /* Update state */
mbed_official 532:fe11edbda85c 932 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
mbed_official 532:fe11edbda85c 933
mbed_official 532:fe11edbda85c 934 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 935 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 936 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 937 hqspi->pTxBuffPtr = pData;
mbed_official 532:fe11edbda85c 938
mbed_official 532:fe11edbda85c 939 /* Configure QSPI: CCR register with functional as indirect write */
mbed_official 532:fe11edbda85c 940 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
mbed_official 532:fe11edbda85c 941
mbed_official 532:fe11edbda85c 942 /* Enable the QSPI transfer error, FIFO threshold and transfert complete Interrupts */
mbed_official 532:fe11edbda85c 943 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
mbed_official 532:fe11edbda85c 944
mbed_official 532:fe11edbda85c 945 }
mbed_official 532:fe11edbda85c 946 else
mbed_official 532:fe11edbda85c 947 {
mbed_official 532:fe11edbda85c 948 status = HAL_ERROR;
mbed_official 532:fe11edbda85c 949 }
mbed_official 532:fe11edbda85c 950 }
mbed_official 532:fe11edbda85c 951 else
mbed_official 532:fe11edbda85c 952 {
mbed_official 532:fe11edbda85c 953 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 954 }
mbed_official 532:fe11edbda85c 955
mbed_official 532:fe11edbda85c 956 /* Process unlocked */
mbed_official 532:fe11edbda85c 957 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 958
mbed_official 532:fe11edbda85c 959 return status;
mbed_official 532:fe11edbda85c 960 }
mbed_official 532:fe11edbda85c 961
mbed_official 532:fe11edbda85c 962 /**
mbed_official 532:fe11edbda85c 963 * @brief Receive an amount of data in no-blocking mode with Interrupt
mbed_official 532:fe11edbda85c 964 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 965 * @param pData: pointer to data buffer
mbed_official 532:fe11edbda85c 966 * @note This function is used only in Indirect Read Mode
mbed_official 532:fe11edbda85c 967 * @retval HAL status
mbed_official 532:fe11edbda85c 968 */
mbed_official 532:fe11edbda85c 969 HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
mbed_official 532:fe11edbda85c 970 {
mbed_official 532:fe11edbda85c 971 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 972 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
mbed_official 532:fe11edbda85c 973
mbed_official 532:fe11edbda85c 974 /* Process locked */
mbed_official 532:fe11edbda85c 975 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 976
mbed_official 532:fe11edbda85c 977 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 978 {
mbed_official 532:fe11edbda85c 979 if(pData != NULL )
mbed_official 532:fe11edbda85c 980 {
mbed_official 532:fe11edbda85c 981 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 982
mbed_official 532:fe11edbda85c 983 /* Update state */
mbed_official 532:fe11edbda85c 984 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
mbed_official 532:fe11edbda85c 985
mbed_official 532:fe11edbda85c 986 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 987 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 988 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 989 hqspi->pRxBuffPtr = pData;
mbed_official 532:fe11edbda85c 990
mbed_official 532:fe11edbda85c 991 /* Configure QSPI: CCR register with functional as indirect read */
mbed_official 532:fe11edbda85c 992 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
mbed_official 532:fe11edbda85c 993
mbed_official 532:fe11edbda85c 994 /* Start the transfer by re-writing the address in AR register */
mbed_official 532:fe11edbda85c 995 WRITE_REG(hqspi->Instance->AR, addr_reg);
mbed_official 532:fe11edbda85c 996
mbed_official 532:fe11edbda85c 997 /* Enable the QSPI transfer error, FIFO threshold and transfert complete Interrupts */
mbed_official 532:fe11edbda85c 998 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
mbed_official 532:fe11edbda85c 999 }
mbed_official 532:fe11edbda85c 1000 else
mbed_official 532:fe11edbda85c 1001 {
mbed_official 532:fe11edbda85c 1002 status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1003 }
mbed_official 532:fe11edbda85c 1004 }
mbed_official 532:fe11edbda85c 1005 else
mbed_official 532:fe11edbda85c 1006 {
mbed_official 532:fe11edbda85c 1007 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1008 }
mbed_official 532:fe11edbda85c 1009
mbed_official 532:fe11edbda85c 1010 /* Process unlocked */
mbed_official 532:fe11edbda85c 1011 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1012
mbed_official 532:fe11edbda85c 1013 return status;
mbed_official 532:fe11edbda85c 1014 }
mbed_official 532:fe11edbda85c 1015
mbed_official 532:fe11edbda85c 1016 /**
mbed_official 532:fe11edbda85c 1017 * @brief Sends an amount of data in non blocking mode with DMA.
mbed_official 532:fe11edbda85c 1018 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1019 * @param pData: pointer to data buffer
mbed_official 532:fe11edbda85c 1020 * @note This function is used only in Indirect Write Mode
mbed_official 532:fe11edbda85c 1021 * @retval HAL status
mbed_official 532:fe11edbda85c 1022 */
mbed_official 532:fe11edbda85c 1023 HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
mbed_official 532:fe11edbda85c 1024 {
mbed_official 532:fe11edbda85c 1025 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 1026 uint32_t *tmp;
mbed_official 532:fe11edbda85c 1027
mbed_official 532:fe11edbda85c 1028 /* Process locked */
mbed_official 532:fe11edbda85c 1029 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 1030
mbed_official 532:fe11edbda85c 1031 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 1032 {
mbed_official 532:fe11edbda85c 1033 if(pData != NULL )
mbed_official 532:fe11edbda85c 1034 {
mbed_official 532:fe11edbda85c 1035 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 1036
mbed_official 532:fe11edbda85c 1037 /* Update state */
mbed_official 532:fe11edbda85c 1038 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
mbed_official 532:fe11edbda85c 1039
mbed_official 532:fe11edbda85c 1040 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 1041 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 1042 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 1043 hqspi->pTxBuffPtr = pData;
mbed_official 532:fe11edbda85c 1044
mbed_official 532:fe11edbda85c 1045 /* Configure QSPI: CCR register with functional mode as indirect write */
mbed_official 532:fe11edbda85c 1046 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
mbed_official 532:fe11edbda85c 1047
mbed_official 532:fe11edbda85c 1048 /* Set the QSPI DMA transfer complete callback */
mbed_official 532:fe11edbda85c 1049 hqspi->hdma->XferCpltCallback = QSPI_DMATxCplt;
mbed_official 532:fe11edbda85c 1050
mbed_official 532:fe11edbda85c 1051 /* Set the QSPI DMA Half transfer complete callback */
mbed_official 532:fe11edbda85c 1052 hqspi->hdma->XferHalfCpltCallback = QSPI_DMATxHalfCplt;
mbed_official 532:fe11edbda85c 1053
mbed_official 532:fe11edbda85c 1054 /* Set the DMA error callback */
mbed_official 532:fe11edbda85c 1055 hqspi->hdma->XferErrorCallback = QSPI_DMAError;
mbed_official 532:fe11edbda85c 1056
mbed_official 532:fe11edbda85c 1057 /* Configure the direction of the DMA */
mbed_official 532:fe11edbda85c 1058 hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
mbed_official 532:fe11edbda85c 1059 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
mbed_official 532:fe11edbda85c 1060
mbed_official 532:fe11edbda85c 1061 /* Enable the QSPI transmit DMA Channel */
mbed_official 532:fe11edbda85c 1062 tmp = (uint32_t*)&pData;
mbed_official 532:fe11edbda85c 1063 HAL_DMA_Start_IT(hqspi->hdma, *(uint32_t*)tmp, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize);
mbed_official 532:fe11edbda85c 1064
mbed_official 532:fe11edbda85c 1065 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
mbed_official 532:fe11edbda85c 1066 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
mbed_official 532:fe11edbda85c 1067 }
mbed_official 532:fe11edbda85c 1068 else
mbed_official 532:fe11edbda85c 1069 {
mbed_official 532:fe11edbda85c 1070 status = HAL_OK;
mbed_official 532:fe11edbda85c 1071 }
mbed_official 532:fe11edbda85c 1072 }
mbed_official 532:fe11edbda85c 1073 else
mbed_official 532:fe11edbda85c 1074 {
mbed_official 532:fe11edbda85c 1075 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1076 }
mbed_official 532:fe11edbda85c 1077
mbed_official 532:fe11edbda85c 1078 /* Process unlocked */
mbed_official 532:fe11edbda85c 1079 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1080
mbed_official 532:fe11edbda85c 1081 return status;
mbed_official 532:fe11edbda85c 1082 }
mbed_official 532:fe11edbda85c 1083
mbed_official 532:fe11edbda85c 1084 /**
mbed_official 532:fe11edbda85c 1085 * @brief Receives an amount of data in non blocking mode with DMA.
mbed_official 532:fe11edbda85c 1086 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1087 * @param pData: pointer to data buffer.
mbed_official 532:fe11edbda85c 1088 * @note This function is used only in Indirect Read Mode
mbed_official 532:fe11edbda85c 1089 * @retval HAL status
mbed_official 532:fe11edbda85c 1090 */
mbed_official 532:fe11edbda85c 1091 HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
mbed_official 532:fe11edbda85c 1092 {
mbed_official 532:fe11edbda85c 1093 HAL_StatusTypeDef status = HAL_OK;
mbed_official 532:fe11edbda85c 1094 uint32_t *tmp;
mbed_official 532:fe11edbda85c 1095 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
mbed_official 532:fe11edbda85c 1096
mbed_official 532:fe11edbda85c 1097 /* Process locked */
mbed_official 532:fe11edbda85c 1098 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 1099
mbed_official 532:fe11edbda85c 1100 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 1101 {
mbed_official 532:fe11edbda85c 1102 if(pData != NULL )
mbed_official 532:fe11edbda85c 1103 {
mbed_official 532:fe11edbda85c 1104 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 1105
mbed_official 532:fe11edbda85c 1106 /* Update state */
mbed_official 532:fe11edbda85c 1107 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
mbed_official 532:fe11edbda85c 1108
mbed_official 532:fe11edbda85c 1109 /* Configure counters and size of the handle */
mbed_official 532:fe11edbda85c 1110 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 1111 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
mbed_official 532:fe11edbda85c 1112 hqspi->pRxBuffPtr = pData;
mbed_official 532:fe11edbda85c 1113
mbed_official 532:fe11edbda85c 1114 /* Set the QSPI DMA transfer complete callback */
mbed_official 532:fe11edbda85c 1115 hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;
mbed_official 532:fe11edbda85c 1116
mbed_official 532:fe11edbda85c 1117 /* Set the QSPI DMA Half transfer complete callback */
mbed_official 532:fe11edbda85c 1118 hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;
mbed_official 532:fe11edbda85c 1119
mbed_official 532:fe11edbda85c 1120 /* Set the DMA error callback */
mbed_official 532:fe11edbda85c 1121 hqspi->hdma->XferErrorCallback = QSPI_DMAError;
mbed_official 532:fe11edbda85c 1122
mbed_official 532:fe11edbda85c 1123 /* Configure the direction of the DMA */
mbed_official 532:fe11edbda85c 1124 hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
mbed_official 532:fe11edbda85c 1125 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
mbed_official 532:fe11edbda85c 1126
mbed_official 532:fe11edbda85c 1127 /* Enable the DMA Channel */
mbed_official 532:fe11edbda85c 1128 tmp = (uint32_t*)&pData;
mbed_official 532:fe11edbda85c 1129 HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, *(uint32_t*)tmp, hqspi->RxXferSize);
mbed_official 532:fe11edbda85c 1130
mbed_official 532:fe11edbda85c 1131 /* Configure QSPI: CCR register with functional as indirect read */
mbed_official 532:fe11edbda85c 1132 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
mbed_official 532:fe11edbda85c 1133
mbed_official 532:fe11edbda85c 1134 /* Start the transfer by re-writing the address in AR register */
mbed_official 532:fe11edbda85c 1135 WRITE_REG(hqspi->Instance->AR, addr_reg);
mbed_official 532:fe11edbda85c 1136
mbed_official 532:fe11edbda85c 1137 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
mbed_official 532:fe11edbda85c 1138 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
mbed_official 532:fe11edbda85c 1139 }
mbed_official 532:fe11edbda85c 1140 else
mbed_official 532:fe11edbda85c 1141 {
mbed_official 532:fe11edbda85c 1142 status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1143 }
mbed_official 532:fe11edbda85c 1144 }
mbed_official 532:fe11edbda85c 1145 else
mbed_official 532:fe11edbda85c 1146 {
mbed_official 532:fe11edbda85c 1147 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1148 }
mbed_official 532:fe11edbda85c 1149
mbed_official 532:fe11edbda85c 1150 /* Process unlocked */
mbed_official 532:fe11edbda85c 1151 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1152
mbed_official 532:fe11edbda85c 1153 return status;
mbed_official 532:fe11edbda85c 1154 }
mbed_official 532:fe11edbda85c 1155
mbed_official 532:fe11edbda85c 1156 /**
mbed_official 532:fe11edbda85c 1157 * @brief Configure the QSPI Automatic Polling Mode in blocking mode.
mbed_official 532:fe11edbda85c 1158 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1159 * @param cmd: structure that contains the command configuration information.
mbed_official 532:fe11edbda85c 1160 * @param cfg: structure that contains the polling configuration information.
mbed_official 532:fe11edbda85c 1161 * @param Timeout : Time out duration
mbed_official 532:fe11edbda85c 1162 * @note This function is used only in Automatic Polling Mode
mbed_official 532:fe11edbda85c 1163 * @retval HAL status
mbed_official 532:fe11edbda85c 1164 */
mbed_official 532:fe11edbda85c 1165 HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
mbed_official 532:fe11edbda85c 1166 {
mbed_official 532:fe11edbda85c 1167 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1168
mbed_official 532:fe11edbda85c 1169 /* Check the parameters */
mbed_official 532:fe11edbda85c 1170 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
mbed_official 532:fe11edbda85c 1171 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 1172 {
mbed_official 532:fe11edbda85c 1173 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
mbed_official 532:fe11edbda85c 1174 }
mbed_official 532:fe11edbda85c 1175
mbed_official 532:fe11edbda85c 1176 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
mbed_official 532:fe11edbda85c 1177 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1178 {
mbed_official 532:fe11edbda85c 1179 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
mbed_official 532:fe11edbda85c 1180 }
mbed_official 532:fe11edbda85c 1181
mbed_official 532:fe11edbda85c 1182 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
mbed_official 532:fe11edbda85c 1183 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 1184 {
mbed_official 532:fe11edbda85c 1185 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
mbed_official 532:fe11edbda85c 1186 }
mbed_official 532:fe11edbda85c 1187
mbed_official 532:fe11edbda85c 1188 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
mbed_official 532:fe11edbda85c 1189 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
mbed_official 532:fe11edbda85c 1190
mbed_official 532:fe11edbda85c 1191 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
mbed_official 532:fe11edbda85c 1192 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
mbed_official 532:fe11edbda85c 1193 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
mbed_official 532:fe11edbda85c 1194
mbed_official 532:fe11edbda85c 1195 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
mbed_official 532:fe11edbda85c 1196 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
mbed_official 532:fe11edbda85c 1197 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
mbed_official 532:fe11edbda85c 1198
mbed_official 532:fe11edbda85c 1199 /* Process locked */
mbed_official 532:fe11edbda85c 1200 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 1201
mbed_official 532:fe11edbda85c 1202 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 1203 {
mbed_official 532:fe11edbda85c 1204
mbed_official 532:fe11edbda85c 1205 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 1206
mbed_official 532:fe11edbda85c 1207 /* Update state */
mbed_official 532:fe11edbda85c 1208 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
mbed_official 532:fe11edbda85c 1209
mbed_official 532:fe11edbda85c 1210 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 1211 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, Timeout);
mbed_official 532:fe11edbda85c 1212
mbed_official 532:fe11edbda85c 1213 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 1214 {
mbed_official 532:fe11edbda85c 1215 /* Configure QSPI: PSMAR register with the status match value */
mbed_official 532:fe11edbda85c 1216 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
mbed_official 532:fe11edbda85c 1217
mbed_official 532:fe11edbda85c 1218 /* Configure QSPI: PSMKR register with the status mask value */
mbed_official 532:fe11edbda85c 1219 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
mbed_official 532:fe11edbda85c 1220
mbed_official 532:fe11edbda85c 1221 /* Configure QSPI: PIR register with the interval value */
mbed_official 532:fe11edbda85c 1222 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
mbed_official 532:fe11edbda85c 1223
mbed_official 532:fe11edbda85c 1224 /* Configure QSPI: CR register with Match mode and Automatic stop enabled
mbed_official 532:fe11edbda85c 1225 (otherwise there will be an infinite loop in blocking mode) */
mbed_official 532:fe11edbda85c 1226 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
mbed_official 532:fe11edbda85c 1227 (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));
mbed_official 532:fe11edbda85c 1228
mbed_official 532:fe11edbda85c 1229 /* Call the configuration function */
mbed_official 532:fe11edbda85c 1230 cmd->NbData = cfg->StatusBytesSize;
mbed_official 532:fe11edbda85c 1231 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
mbed_official 532:fe11edbda85c 1232
mbed_official 532:fe11edbda85c 1233 /* Wait until SM flag is set to go back in idle state */
mbed_official 532:fe11edbda85c 1234 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 1235 {
mbed_official 532:fe11edbda85c 1236 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 1237 }
mbed_official 532:fe11edbda85c 1238 else
mbed_official 532:fe11edbda85c 1239 {
mbed_official 532:fe11edbda85c 1240 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
mbed_official 532:fe11edbda85c 1241
mbed_official 532:fe11edbda85c 1242 /* Update state */
mbed_official 532:fe11edbda85c 1243 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 1244 }
mbed_official 532:fe11edbda85c 1245 }
mbed_official 532:fe11edbda85c 1246 }
mbed_official 532:fe11edbda85c 1247 else
mbed_official 532:fe11edbda85c 1248 {
mbed_official 532:fe11edbda85c 1249 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1250 }
mbed_official 532:fe11edbda85c 1251 /* Process unlocked */
mbed_official 532:fe11edbda85c 1252 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1253
mbed_official 532:fe11edbda85c 1254 /* Return function status */
mbed_official 532:fe11edbda85c 1255 return status;
mbed_official 532:fe11edbda85c 1256 }
mbed_official 532:fe11edbda85c 1257
mbed_official 532:fe11edbda85c 1258 /**
mbed_official 532:fe11edbda85c 1259 * @brief Configure the QSPI Automatic Polling Mode in non-blocking mode.
mbed_official 532:fe11edbda85c 1260 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1261 * @param cmd: structure that contains the command configuration information.
mbed_official 532:fe11edbda85c 1262 * @param cfg: structure that contains the polling configuration information.
mbed_official 532:fe11edbda85c 1263 * @note This function is used only in Automatic Polling Mode
mbed_official 532:fe11edbda85c 1264 * @retval HAL status
mbed_official 532:fe11edbda85c 1265 */
mbed_official 532:fe11edbda85c 1266 HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
mbed_official 532:fe11edbda85c 1267 {
mbed_official 532:fe11edbda85c 1268 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1269
mbed_official 532:fe11edbda85c 1270 /* Check the parameters */
mbed_official 532:fe11edbda85c 1271 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
mbed_official 532:fe11edbda85c 1272 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 1273 {
mbed_official 532:fe11edbda85c 1274 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
mbed_official 532:fe11edbda85c 1275 }
mbed_official 532:fe11edbda85c 1276
mbed_official 532:fe11edbda85c 1277 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
mbed_official 532:fe11edbda85c 1278 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1279 {
mbed_official 532:fe11edbda85c 1280 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
mbed_official 532:fe11edbda85c 1281 }
mbed_official 532:fe11edbda85c 1282
mbed_official 532:fe11edbda85c 1283 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
mbed_official 532:fe11edbda85c 1284 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 1285 {
mbed_official 532:fe11edbda85c 1286 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
mbed_official 532:fe11edbda85c 1287 }
mbed_official 532:fe11edbda85c 1288
mbed_official 532:fe11edbda85c 1289 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
mbed_official 532:fe11edbda85c 1290 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
mbed_official 532:fe11edbda85c 1291
mbed_official 532:fe11edbda85c 1292 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
mbed_official 532:fe11edbda85c 1293 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
mbed_official 532:fe11edbda85c 1294 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
mbed_official 532:fe11edbda85c 1295
mbed_official 532:fe11edbda85c 1296 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
mbed_official 532:fe11edbda85c 1297 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
mbed_official 532:fe11edbda85c 1298 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
mbed_official 532:fe11edbda85c 1299 assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));
mbed_official 532:fe11edbda85c 1300
mbed_official 532:fe11edbda85c 1301 /* Process locked */
mbed_official 532:fe11edbda85c 1302 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 1303
mbed_official 532:fe11edbda85c 1304 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 1305 {
mbed_official 532:fe11edbda85c 1306 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 1307
mbed_official 532:fe11edbda85c 1308 /* Update state */
mbed_official 532:fe11edbda85c 1309 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
mbed_official 532:fe11edbda85c 1310
mbed_official 532:fe11edbda85c 1311 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 1312 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
mbed_official 532:fe11edbda85c 1313
mbed_official 532:fe11edbda85c 1314 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 1315 {
mbed_official 532:fe11edbda85c 1316 /* Configure QSPI: PSMAR register with the status match value */
mbed_official 532:fe11edbda85c 1317 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
mbed_official 532:fe11edbda85c 1318
mbed_official 532:fe11edbda85c 1319 /* Configure QSPI: PSMKR register with the status mask value */
mbed_official 532:fe11edbda85c 1320 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
mbed_official 532:fe11edbda85c 1321
mbed_official 532:fe11edbda85c 1322 /* Configure QSPI: PIR register with the interval value */
mbed_official 532:fe11edbda85c 1323 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
mbed_official 532:fe11edbda85c 1324
mbed_official 532:fe11edbda85c 1325 /* Configure QSPI: CR register with Match mode and Automatic stop mode */
mbed_official 532:fe11edbda85c 1326 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
mbed_official 532:fe11edbda85c 1327 (cfg->MatchMode | cfg->AutomaticStop));
mbed_official 532:fe11edbda85c 1328
mbed_official 532:fe11edbda85c 1329 /* Call the configuration function */
mbed_official 532:fe11edbda85c 1330 cmd->NbData = cfg->StatusBytesSize;
mbed_official 532:fe11edbda85c 1331 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
mbed_official 532:fe11edbda85c 1332
mbed_official 532:fe11edbda85c 1333 /* Enable the QSPI Transfer Error, FIFO threshold and status match Interrupt */
mbed_official 532:fe11edbda85c 1334 __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_FT | QSPI_IT_SM | QSPI_IT_TE));
mbed_official 532:fe11edbda85c 1335 }
mbed_official 532:fe11edbda85c 1336 }
mbed_official 532:fe11edbda85c 1337 else
mbed_official 532:fe11edbda85c 1338 {
mbed_official 532:fe11edbda85c 1339 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1340 }
mbed_official 532:fe11edbda85c 1341
mbed_official 532:fe11edbda85c 1342 /* Process unlocked */
mbed_official 532:fe11edbda85c 1343 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1344
mbed_official 532:fe11edbda85c 1345 /* Return function status */
mbed_official 532:fe11edbda85c 1346 return status;
mbed_official 532:fe11edbda85c 1347 }
mbed_official 532:fe11edbda85c 1348
mbed_official 532:fe11edbda85c 1349 /**
mbed_official 532:fe11edbda85c 1350 * @brief Configure the Memory Mapped mode.
mbed_official 532:fe11edbda85c 1351 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1352 * @param cmd: structure that contains the command configuration information.
mbed_official 532:fe11edbda85c 1353 * @param cfg: structure that contains the memory mapped configuration information.
mbed_official 532:fe11edbda85c 1354 * @note This function is used only in Memory mapped Mode
mbed_official 532:fe11edbda85c 1355 * @retval HAL status
mbed_official 532:fe11edbda85c 1356 */
mbed_official 532:fe11edbda85c 1357 HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
mbed_official 532:fe11edbda85c 1358 {
mbed_official 532:fe11edbda85c 1359 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1360
mbed_official 532:fe11edbda85c 1361 /* Check the parameters */
mbed_official 532:fe11edbda85c 1362 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
mbed_official 532:fe11edbda85c 1363 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 1364 {
mbed_official 532:fe11edbda85c 1365 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
mbed_official 532:fe11edbda85c 1366 }
mbed_official 532:fe11edbda85c 1367
mbed_official 532:fe11edbda85c 1368 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
mbed_official 532:fe11edbda85c 1369 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1370 {
mbed_official 532:fe11edbda85c 1371 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
mbed_official 532:fe11edbda85c 1372 }
mbed_official 532:fe11edbda85c 1373
mbed_official 532:fe11edbda85c 1374 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
mbed_official 532:fe11edbda85c 1375 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 1376 {
mbed_official 532:fe11edbda85c 1377 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
mbed_official 532:fe11edbda85c 1378 }
mbed_official 532:fe11edbda85c 1379
mbed_official 532:fe11edbda85c 1380 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
mbed_official 532:fe11edbda85c 1381 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
mbed_official 532:fe11edbda85c 1382
mbed_official 532:fe11edbda85c 1383 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
mbed_official 532:fe11edbda85c 1384 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
mbed_official 532:fe11edbda85c 1385 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
mbed_official 532:fe11edbda85c 1386
mbed_official 532:fe11edbda85c 1387 assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));
mbed_official 532:fe11edbda85c 1388
mbed_official 532:fe11edbda85c 1389 /* Process locked */
mbed_official 532:fe11edbda85c 1390 __HAL_LOCK(hqspi);
mbed_official 532:fe11edbda85c 1391
mbed_official 532:fe11edbda85c 1392 if(hqspi->State == HAL_QSPI_STATE_READY)
mbed_official 532:fe11edbda85c 1393 {
mbed_official 532:fe11edbda85c 1394 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
mbed_official 532:fe11edbda85c 1395
mbed_official 532:fe11edbda85c 1396 /* Update state */
mbed_official 532:fe11edbda85c 1397 hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;
mbed_official 532:fe11edbda85c 1398
mbed_official 532:fe11edbda85c 1399 /* Wait till BUSY flag reset */
mbed_official 532:fe11edbda85c 1400 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
mbed_official 532:fe11edbda85c 1401
mbed_official 532:fe11edbda85c 1402 if (status == HAL_OK)
mbed_official 532:fe11edbda85c 1403 {
mbed_official 532:fe11edbda85c 1404 /* Configure QSPI: CR register with time out counter enable */
mbed_official 532:fe11edbda85c 1405 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);
mbed_official 532:fe11edbda85c 1406
mbed_official 532:fe11edbda85c 1407 if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)
mbed_official 532:fe11edbda85c 1408 {
mbed_official 532:fe11edbda85c 1409 assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));
mbed_official 532:fe11edbda85c 1410
mbed_official 532:fe11edbda85c 1411 /* Configure QSPI: LPTR register with the low-power time out value */
mbed_official 532:fe11edbda85c 1412 WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
mbed_official 532:fe11edbda85c 1413
mbed_official 532:fe11edbda85c 1414 /* Enable the QSPI TimeOut Interrupt */
mbed_official 532:fe11edbda85c 1415 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);
mbed_official 532:fe11edbda85c 1416 }
mbed_official 532:fe11edbda85c 1417
mbed_official 532:fe11edbda85c 1418 /* Call the configuration function */
mbed_official 532:fe11edbda85c 1419 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
mbed_official 532:fe11edbda85c 1420
mbed_official 532:fe11edbda85c 1421 }
mbed_official 532:fe11edbda85c 1422 }
mbed_official 532:fe11edbda85c 1423 else
mbed_official 532:fe11edbda85c 1424 {
mbed_official 532:fe11edbda85c 1425 status = HAL_BUSY;
mbed_official 532:fe11edbda85c 1426
mbed_official 532:fe11edbda85c 1427 }
mbed_official 532:fe11edbda85c 1428
mbed_official 532:fe11edbda85c 1429 /* Process unlocked */
mbed_official 532:fe11edbda85c 1430 __HAL_UNLOCK(hqspi);
mbed_official 532:fe11edbda85c 1431
mbed_official 532:fe11edbda85c 1432 /* Return function status */
mbed_official 532:fe11edbda85c 1433 return status;
mbed_official 532:fe11edbda85c 1434 }
mbed_official 532:fe11edbda85c 1435
mbed_official 532:fe11edbda85c 1436 /**
mbed_official 532:fe11edbda85c 1437 * @brief Transfer Error callbacks
mbed_official 532:fe11edbda85c 1438 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1439 * @retval None
mbed_official 532:fe11edbda85c 1440 */
mbed_official 532:fe11edbda85c 1441 __weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1442 {
mbed_official 532:fe11edbda85c 1443 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1444 the HAL_QSPI_ErrorCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1445 */
mbed_official 532:fe11edbda85c 1446 }
mbed_official 532:fe11edbda85c 1447
mbed_official 532:fe11edbda85c 1448 /**
mbed_official 532:fe11edbda85c 1449 * @brief Command completed callbacks.
mbed_official 532:fe11edbda85c 1450 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1451 * @retval None
mbed_official 532:fe11edbda85c 1452 */
mbed_official 532:fe11edbda85c 1453 __weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1454 {
mbed_official 532:fe11edbda85c 1455 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1456 the HAL_QSPI_CmdCpltCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1457 */
mbed_official 532:fe11edbda85c 1458 }
mbed_official 532:fe11edbda85c 1459
mbed_official 532:fe11edbda85c 1460 /**
mbed_official 532:fe11edbda85c 1461 * @brief Rx Transfer completed callbacks.
mbed_official 532:fe11edbda85c 1462 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1463 * @retval None
mbed_official 532:fe11edbda85c 1464 */
mbed_official 532:fe11edbda85c 1465 __weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1466 {
mbed_official 532:fe11edbda85c 1467 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1468 the HAL_QSPI_RxCpltCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1469 */
mbed_official 532:fe11edbda85c 1470 }
mbed_official 532:fe11edbda85c 1471
mbed_official 532:fe11edbda85c 1472 /**
mbed_official 532:fe11edbda85c 1473 * @brief Tx Transfer completed callbacks.
mbed_official 532:fe11edbda85c 1474 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1475 * @retval None
mbed_official 532:fe11edbda85c 1476 */
mbed_official 532:fe11edbda85c 1477 __weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1478 {
mbed_official 532:fe11edbda85c 1479 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1480 the HAL_QSPI_TxCpltCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1481 */
mbed_official 532:fe11edbda85c 1482 }
mbed_official 532:fe11edbda85c 1483
mbed_official 532:fe11edbda85c 1484 /**
mbed_official 532:fe11edbda85c 1485 * @brief Rx Half Transfer completed callbacks.
mbed_official 532:fe11edbda85c 1486 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1487 * @retval None
mbed_official 532:fe11edbda85c 1488 */
mbed_official 532:fe11edbda85c 1489 __weak void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1490 {
mbed_official 532:fe11edbda85c 1491 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1492 the HAL_QSPI_RxHalfCpltCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1493 */
mbed_official 532:fe11edbda85c 1494 }
mbed_official 532:fe11edbda85c 1495
mbed_official 532:fe11edbda85c 1496 /**
mbed_official 532:fe11edbda85c 1497 * @brief Tx Half Transfer completed callbacks.
mbed_official 532:fe11edbda85c 1498 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1499 * @retval None
mbed_official 532:fe11edbda85c 1500 */
mbed_official 532:fe11edbda85c 1501 __weak void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1502 {
mbed_official 532:fe11edbda85c 1503 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1504 the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1505 */
mbed_official 532:fe11edbda85c 1506 }
mbed_official 532:fe11edbda85c 1507
mbed_official 532:fe11edbda85c 1508 /**
mbed_official 532:fe11edbda85c 1509 * @brief FIFO Threshold callbacks
mbed_official 532:fe11edbda85c 1510 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1511 * @retval None
mbed_official 532:fe11edbda85c 1512 */
mbed_official 532:fe11edbda85c 1513 __weak void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1514 {
mbed_official 532:fe11edbda85c 1515 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1516 the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1517 */
mbed_official 532:fe11edbda85c 1518 }
mbed_official 532:fe11edbda85c 1519
mbed_official 532:fe11edbda85c 1520 /**
mbed_official 532:fe11edbda85c 1521 * @brief Status Match callbacks
mbed_official 532:fe11edbda85c 1522 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1523 * @retval None
mbed_official 532:fe11edbda85c 1524 */
mbed_official 532:fe11edbda85c 1525 __weak void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1526 {
mbed_official 532:fe11edbda85c 1527 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1528 the HAL_QSPI_StatusMatchCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1529 */
mbed_official 532:fe11edbda85c 1530 }
mbed_official 532:fe11edbda85c 1531
mbed_official 532:fe11edbda85c 1532 /**
mbed_official 532:fe11edbda85c 1533 * @brief Timeout callbacks
mbed_official 532:fe11edbda85c 1534 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1535 * @retval None
mbed_official 532:fe11edbda85c 1536 */
mbed_official 532:fe11edbda85c 1537 __weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1538 {
mbed_official 532:fe11edbda85c 1539 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 1540 the HAL_QSPI_TimeOutCallback could be implemented in the user file
mbed_official 532:fe11edbda85c 1541 */
mbed_official 532:fe11edbda85c 1542 }
mbed_official 532:fe11edbda85c 1543
mbed_official 532:fe11edbda85c 1544 /**
mbed_official 532:fe11edbda85c 1545 * @}
mbed_official 532:fe11edbda85c 1546 */
mbed_official 532:fe11edbda85c 1547
mbed_official 532:fe11edbda85c 1548 /** @defgroup QSPI_Exported_Functions_Group3 Peripheral Control and State functions
mbed_official 532:fe11edbda85c 1549 * @brief QSPI control and State functions
mbed_official 532:fe11edbda85c 1550 *
mbed_official 532:fe11edbda85c 1551 @verbatim
mbed_official 532:fe11edbda85c 1552 ===============================================================================
mbed_official 532:fe11edbda85c 1553 ##### Peripheral Control and State functions #####
mbed_official 532:fe11edbda85c 1554 ===============================================================================
mbed_official 532:fe11edbda85c 1555 [..]
mbed_official 532:fe11edbda85c 1556 This subsection provides a set of functions allowing to :
mbed_official 532:fe11edbda85c 1557 (+) Check in run-time the state of the driver.
mbed_official 532:fe11edbda85c 1558 (+) Check the error code set during last operation.
mbed_official 532:fe11edbda85c 1559 (+) Abort any operation.
mbed_official 532:fe11edbda85c 1560 .....
mbed_official 532:fe11edbda85c 1561 @endverbatim
mbed_official 532:fe11edbda85c 1562 * @{
mbed_official 532:fe11edbda85c 1563 */
mbed_official 532:fe11edbda85c 1564
mbed_official 532:fe11edbda85c 1565 /**
mbed_official 532:fe11edbda85c 1566 * @brief Return the QSPI state.
mbed_official 532:fe11edbda85c 1567 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1568 * @retval HAL state
mbed_official 532:fe11edbda85c 1569 */
mbed_official 532:fe11edbda85c 1570 HAL_QSPI_StateTypeDef HAL_QSPI_GetState(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1571 {
mbed_official 532:fe11edbda85c 1572 return hqspi->State;
mbed_official 532:fe11edbda85c 1573 }
mbed_official 532:fe11edbda85c 1574
mbed_official 532:fe11edbda85c 1575 /**
mbed_official 532:fe11edbda85c 1576 * @brief Return the QSPI error code
mbed_official 532:fe11edbda85c 1577 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1578 * @retval QSPI Error Code
mbed_official 532:fe11edbda85c 1579 */
mbed_official 532:fe11edbda85c 1580 uint32_t HAL_QSPI_GetError(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1581 {
mbed_official 532:fe11edbda85c 1582 return hqspi->ErrorCode;
mbed_official 532:fe11edbda85c 1583 }
mbed_official 532:fe11edbda85c 1584
mbed_official 532:fe11edbda85c 1585 /**
mbed_official 532:fe11edbda85c 1586 * @brief Abort the current transmission
mbed_official 532:fe11edbda85c 1587 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1588 * @retval HAL status
mbed_official 532:fe11edbda85c 1589 */
mbed_official 532:fe11edbda85c 1590 HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
mbed_official 532:fe11edbda85c 1591 {
mbed_official 532:fe11edbda85c 1592 HAL_StatusTypeDef status = HAL_ERROR;
mbed_official 532:fe11edbda85c 1593
mbed_official 532:fe11edbda85c 1594 /* Configure QSPI: CR register with Abort request */
mbed_official 532:fe11edbda85c 1595 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
mbed_official 532:fe11edbda85c 1596
mbed_official 532:fe11edbda85c 1597 /* Wait until TC flag is set to go back in idle state */
mbed_official 532:fe11edbda85c 1598 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, hqspi->Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 1599 {
mbed_official 532:fe11edbda85c 1600 status = HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 1601 }
mbed_official 532:fe11edbda85c 1602 else
mbed_official 532:fe11edbda85c 1603 {
mbed_official 532:fe11edbda85c 1604 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 1605
mbed_official 532:fe11edbda85c 1606 /* Wait until BUSY flag is reset */
mbed_official 532:fe11edbda85c 1607 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
mbed_official 532:fe11edbda85c 1608
mbed_official 532:fe11edbda85c 1609 /* Update state */
mbed_official 532:fe11edbda85c 1610 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 1611 }
mbed_official 532:fe11edbda85c 1612
mbed_official 532:fe11edbda85c 1613 return status;
mbed_official 532:fe11edbda85c 1614 }
mbed_official 532:fe11edbda85c 1615
mbed_official 532:fe11edbda85c 1616 /** @brief Set QSPI timeout
mbed_official 532:fe11edbda85c 1617 * @param hqspi: QSPI handle.
mbed_official 532:fe11edbda85c 1618 * @param Timeout: Timeout for the QSPI memory access.
mbed_official 532:fe11edbda85c 1619 * @retval None
mbed_official 532:fe11edbda85c 1620 */
mbed_official 532:fe11edbda85c 1621 void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
mbed_official 532:fe11edbda85c 1622 {
mbed_official 532:fe11edbda85c 1623 hqspi->Timeout = Timeout;
mbed_official 532:fe11edbda85c 1624 }
mbed_official 532:fe11edbda85c 1625
mbed_official 532:fe11edbda85c 1626 /**
mbed_official 532:fe11edbda85c 1627 * @}
mbed_official 532:fe11edbda85c 1628 */
mbed_official 532:fe11edbda85c 1629
mbed_official 532:fe11edbda85c 1630 /* Private functions ---------------------------------------------------------*/
mbed_official 532:fe11edbda85c 1631
mbed_official 532:fe11edbda85c 1632 /**
mbed_official 532:fe11edbda85c 1633 * @brief DMA QSPI receive process complete callback.
mbed_official 532:fe11edbda85c 1634 * @param hdma: DMA handle
mbed_official 532:fe11edbda85c 1635 * @retval None
mbed_official 532:fe11edbda85c 1636 */
mbed_official 532:fe11edbda85c 1637 static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)
mbed_official 532:fe11edbda85c 1638 {
mbed_official 532:fe11edbda85c 1639 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 532:fe11edbda85c 1640 hqspi->RxXferCount = 0;
mbed_official 532:fe11edbda85c 1641
mbed_official 532:fe11edbda85c 1642 /* Wait for QSPI TC Flag */
mbed_official 532:fe11edbda85c 1643 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, hqspi->Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 1644 {
mbed_official 532:fe11edbda85c 1645 /* Time out Occurred */
mbed_official 532:fe11edbda85c 1646 HAL_QSPI_ErrorCallback(hqspi);
mbed_official 532:fe11edbda85c 1647 }
mbed_official 532:fe11edbda85c 1648 else
mbed_official 532:fe11edbda85c 1649 {
mbed_official 532:fe11edbda85c 1650 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
mbed_official 532:fe11edbda85c 1651 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
mbed_official 532:fe11edbda85c 1652
mbed_official 532:fe11edbda85c 1653 /* Disable the DMA channel */
mbed_official 532:fe11edbda85c 1654 HAL_DMA_Abort(hdma);
mbed_official 532:fe11edbda85c 1655
mbed_official 532:fe11edbda85c 1656 /* Clear Transfer Complete bit */
mbed_official 532:fe11edbda85c 1657 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 1658
mbed_official 532:fe11edbda85c 1659 /* Workaround - Extra data written in the FIFO at the end of a read transfer */
mbed_official 532:fe11edbda85c 1660 HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 1661
mbed_official 532:fe11edbda85c 1662 /* Update state */
mbed_official 532:fe11edbda85c 1663 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 1664
mbed_official 532:fe11edbda85c 1665 HAL_QSPI_RxCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 1666 }
mbed_official 532:fe11edbda85c 1667 }
mbed_official 532:fe11edbda85c 1668
mbed_official 532:fe11edbda85c 1669 /**
mbed_official 532:fe11edbda85c 1670 * @brief DMA QSPI transmit process complete callback.
mbed_official 532:fe11edbda85c 1671 * @param hdma: DMA handle
mbed_official 532:fe11edbda85c 1672 * @retval None
mbed_official 532:fe11edbda85c 1673 */
mbed_official 532:fe11edbda85c 1674 static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)
mbed_official 532:fe11edbda85c 1675 {
mbed_official 532:fe11edbda85c 1676 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 532:fe11edbda85c 1677 hqspi->TxXferCount = 0;
mbed_official 532:fe11edbda85c 1678
mbed_official 532:fe11edbda85c 1679 /* Wait for QSPI TC Flag */
mbed_official 532:fe11edbda85c 1680 if(QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, hqspi->Timeout) != HAL_OK)
mbed_official 532:fe11edbda85c 1681 {
mbed_official 532:fe11edbda85c 1682 /* Time out Occurred */
mbed_official 532:fe11edbda85c 1683 HAL_QSPI_ErrorCallback(hqspi);
mbed_official 532:fe11edbda85c 1684 }
mbed_official 532:fe11edbda85c 1685 else
mbed_official 532:fe11edbda85c 1686 {
mbed_official 532:fe11edbda85c 1687 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
mbed_official 532:fe11edbda85c 1688 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
mbed_official 532:fe11edbda85c 1689
mbed_official 532:fe11edbda85c 1690 /* Disable the DMA channel */
mbed_official 532:fe11edbda85c 1691 HAL_DMA_Abort(hdma);
mbed_official 532:fe11edbda85c 1692
mbed_official 532:fe11edbda85c 1693 /* Clear Transfer Complete bit */
mbed_official 532:fe11edbda85c 1694 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
mbed_official 532:fe11edbda85c 1695
mbed_official 532:fe11edbda85c 1696 /* Clear Busy bit */
mbed_official 532:fe11edbda85c 1697 HAL_QSPI_Abort(hqspi);
mbed_official 532:fe11edbda85c 1698
mbed_official 532:fe11edbda85c 1699 /* Update state */
mbed_official 532:fe11edbda85c 1700 hqspi->State = HAL_QSPI_STATE_READY;
mbed_official 532:fe11edbda85c 1701
mbed_official 532:fe11edbda85c 1702 HAL_QSPI_TxCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 1703 }
mbed_official 532:fe11edbda85c 1704 }
mbed_official 532:fe11edbda85c 1705
mbed_official 532:fe11edbda85c 1706 /**
mbed_official 532:fe11edbda85c 1707 * @brief DMA QSPI receive process half complete callback
mbed_official 532:fe11edbda85c 1708 * @param hdma : DMA handle
mbed_official 532:fe11edbda85c 1709 * @retval None
mbed_official 532:fe11edbda85c 1710 */
mbed_official 532:fe11edbda85c 1711 static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 532:fe11edbda85c 1712 {
mbed_official 532:fe11edbda85c 1713 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 532:fe11edbda85c 1714
mbed_official 532:fe11edbda85c 1715 HAL_QSPI_RxHalfCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 1716 }
mbed_official 532:fe11edbda85c 1717
mbed_official 532:fe11edbda85c 1718 /**
mbed_official 532:fe11edbda85c 1719 * @brief DMA QSPI transmit process half complete callback
mbed_official 532:fe11edbda85c 1720 * @param hdma : DMA handle
mbed_official 532:fe11edbda85c 1721 * @retval None
mbed_official 532:fe11edbda85c 1722 */
mbed_official 532:fe11edbda85c 1723 static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 532:fe11edbda85c 1724 {
mbed_official 532:fe11edbda85c 1725 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 532:fe11edbda85c 1726
mbed_official 532:fe11edbda85c 1727 HAL_QSPI_TxHalfCpltCallback(hqspi);
mbed_official 532:fe11edbda85c 1728 }
mbed_official 532:fe11edbda85c 1729
mbed_official 532:fe11edbda85c 1730 /**
mbed_official 532:fe11edbda85c 1731 * @brief DMA QSPI communication error callback.
mbed_official 532:fe11edbda85c 1732 * @param hdma: DMA handle
mbed_official 532:fe11edbda85c 1733 * @retval None
mbed_official 532:fe11edbda85c 1734 */
mbed_official 532:fe11edbda85c 1735 static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 532:fe11edbda85c 1736 {
mbed_official 532:fe11edbda85c 1737 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 532:fe11edbda85c 1738
mbed_official 532:fe11edbda85c 1739 hqspi->RxXferCount = 0;
mbed_official 532:fe11edbda85c 1740 hqspi->TxXferCount = 0;
mbed_official 532:fe11edbda85c 1741 hqspi->State = HAL_QSPI_STATE_ERROR;
mbed_official 532:fe11edbda85c 1742 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
mbed_official 532:fe11edbda85c 1743
mbed_official 532:fe11edbda85c 1744 HAL_QSPI_ErrorCallback(hqspi);
mbed_official 532:fe11edbda85c 1745 }
mbed_official 532:fe11edbda85c 1746
mbed_official 532:fe11edbda85c 1747 /**
mbed_official 532:fe11edbda85c 1748 * @brief This function wait a flag state until time out.
mbed_official 532:fe11edbda85c 1749 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1750 * @param Flag: Flag checked
mbed_official 532:fe11edbda85c 1751 * @param State: Value of the flag expected
mbed_official 532:fe11edbda85c 1752 * @param Timeout: Duration of the time out
mbed_official 532:fe11edbda85c 1753 * @retval HAL status
mbed_official 532:fe11edbda85c 1754 */
mbed_official 532:fe11edbda85c 1755 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,
mbed_official 532:fe11edbda85c 1756 FlagStatus State, uint32_t Timeout)
mbed_official 532:fe11edbda85c 1757 {
mbed_official 532:fe11edbda85c 1758 uint32_t tickstart = HAL_GetTick();
mbed_official 532:fe11edbda85c 1759
mbed_official 532:fe11edbda85c 1760 /* Wait until flag is in expected state */
mbed_official 532:fe11edbda85c 1761 while((FlagStatus)(__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)
mbed_official 532:fe11edbda85c 1762 {
mbed_official 532:fe11edbda85c 1763 /* Check for the Timeout */
mbed_official 532:fe11edbda85c 1764 if (Timeout != HAL_MAX_DELAY)
mbed_official 532:fe11edbda85c 1765 {
mbed_official 532:fe11edbda85c 1766 if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
mbed_official 532:fe11edbda85c 1767 {
mbed_official 532:fe11edbda85c 1768 hqspi->State = HAL_QSPI_STATE_ERROR;
mbed_official 532:fe11edbda85c 1769 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
mbed_official 532:fe11edbda85c 1770
mbed_official 532:fe11edbda85c 1771 return HAL_TIMEOUT;
mbed_official 532:fe11edbda85c 1772 }
mbed_official 532:fe11edbda85c 1773 }
mbed_official 532:fe11edbda85c 1774 }
mbed_official 532:fe11edbda85c 1775 return HAL_OK;
mbed_official 532:fe11edbda85c 1776 }
mbed_official 532:fe11edbda85c 1777
mbed_official 532:fe11edbda85c 1778 /**
mbed_official 532:fe11edbda85c 1779 * @brief This function configures the communication registers
mbed_official 532:fe11edbda85c 1780 * @param hqspi: QSPI handle
mbed_official 532:fe11edbda85c 1781 * @param cmd: structure that contains the command configuration information
mbed_official 532:fe11edbda85c 1782 * @param FunctionalMode: functional mode to configured
mbed_official 532:fe11edbda85c 1783 * This parameter can be one of the following values:
mbed_official 532:fe11edbda85c 1784 * @arg QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE: Indirect write mode
mbed_official 532:fe11edbda85c 1785 * @arg QSPI_FUNCTIONAL_MODE_INDIRECT_READ: Indirect read mode
mbed_official 532:fe11edbda85c 1786 * @arg QSPI_FUNCTIONAL_MODE_AUTO_POLLING: Automatic polling mode
mbed_official 532:fe11edbda85c 1787 * @arg QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED: Memory-mapped mode
mbed_official 532:fe11edbda85c 1788 * @retval None
mbed_official 532:fe11edbda85c 1789 */
mbed_official 532:fe11edbda85c 1790 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
mbed_official 532:fe11edbda85c 1791 {
mbed_official 532:fe11edbda85c 1792 assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));
mbed_official 532:fe11edbda85c 1793
mbed_official 532:fe11edbda85c 1794 if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
mbed_official 532:fe11edbda85c 1795 {
mbed_official 532:fe11edbda85c 1796 /* Configure QSPI: DLR register with the number of data to read or write */
mbed_official 532:fe11edbda85c 1797 WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1));
mbed_official 532:fe11edbda85c 1798 }
mbed_official 532:fe11edbda85c 1799
mbed_official 532:fe11edbda85c 1800 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
mbed_official 532:fe11edbda85c 1801 {
mbed_official 532:fe11edbda85c 1802 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 1803 {
mbed_official 532:fe11edbda85c 1804 /* Configure QSPI: ABR register with alternate bytes value */
mbed_official 532:fe11edbda85c 1805 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
mbed_official 532:fe11edbda85c 1806
mbed_official 532:fe11edbda85c 1807 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1808 {
mbed_official 532:fe11edbda85c 1809 /*---- Command with instruction, address and alternate bytes ----*/
mbed_official 532:fe11edbda85c 1810 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1811 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1812 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
mbed_official 532:fe11edbda85c 1813 cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
mbed_official 532:fe11edbda85c 1814 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
mbed_official 532:fe11edbda85c 1815
mbed_official 532:fe11edbda85c 1816 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
mbed_official 532:fe11edbda85c 1817 {
mbed_official 532:fe11edbda85c 1818 /* Configure QSPI: AR register with address value */
mbed_official 532:fe11edbda85c 1819 WRITE_REG(hqspi->Instance->AR, cmd->Address);
mbed_official 532:fe11edbda85c 1820 }
mbed_official 532:fe11edbda85c 1821 }
mbed_official 532:fe11edbda85c 1822 else
mbed_official 532:fe11edbda85c 1823 {
mbed_official 532:fe11edbda85c 1824 /*---- Command with instruction and alternate bytes ----*/
mbed_official 532:fe11edbda85c 1825 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1826 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1827 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
mbed_official 532:fe11edbda85c 1828 cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode |
mbed_official 532:fe11edbda85c 1829 cmd->Instruction | FunctionalMode));
mbed_official 532:fe11edbda85c 1830 }
mbed_official 532:fe11edbda85c 1831 }
mbed_official 532:fe11edbda85c 1832 else
mbed_official 532:fe11edbda85c 1833 {
mbed_official 532:fe11edbda85c 1834 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1835 {
mbed_official 532:fe11edbda85c 1836 /*---- Command with instruction and address ----*/
mbed_official 532:fe11edbda85c 1837 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1838 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1839 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
mbed_official 532:fe11edbda85c 1840 cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
mbed_official 532:fe11edbda85c 1841 cmd->Instruction | FunctionalMode));
mbed_official 532:fe11edbda85c 1842
mbed_official 532:fe11edbda85c 1843 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
mbed_official 532:fe11edbda85c 1844 {
mbed_official 532:fe11edbda85c 1845 /* Configure QSPI: AR register with address value */
mbed_official 532:fe11edbda85c 1846 WRITE_REG(hqspi->Instance->AR, cmd->Address);
mbed_official 532:fe11edbda85c 1847 }
mbed_official 532:fe11edbda85c 1848 }
mbed_official 532:fe11edbda85c 1849 else
mbed_official 532:fe11edbda85c 1850 {
mbed_official 532:fe11edbda85c 1851 /*---- Command with only instruction ----*/
mbed_official 532:fe11edbda85c 1852 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1853 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1854 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
mbed_official 532:fe11edbda85c 1855 cmd->AddressMode | cmd->InstructionMode | cmd->Instruction |
mbed_official 532:fe11edbda85c 1856 FunctionalMode));
mbed_official 532:fe11edbda85c 1857 }
mbed_official 532:fe11edbda85c 1858 }
mbed_official 532:fe11edbda85c 1859 }
mbed_official 532:fe11edbda85c 1860 else
mbed_official 532:fe11edbda85c 1861 {
mbed_official 532:fe11edbda85c 1862 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
mbed_official 532:fe11edbda85c 1863 {
mbed_official 532:fe11edbda85c 1864 /* Configure QSPI: ABR register with alternate bytes value */
mbed_official 532:fe11edbda85c 1865 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
mbed_official 532:fe11edbda85c 1866
mbed_official 532:fe11edbda85c 1867 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1868 {
mbed_official 532:fe11edbda85c 1869 /*---- Command with address and alternate bytes ----*/
mbed_official 532:fe11edbda85c 1870 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1871 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1872 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
mbed_official 532:fe11edbda85c 1873 cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
mbed_official 532:fe11edbda85c 1874 cmd->InstructionMode | FunctionalMode));
mbed_official 532:fe11edbda85c 1875
mbed_official 532:fe11edbda85c 1876 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
mbed_official 532:fe11edbda85c 1877 {
mbed_official 532:fe11edbda85c 1878 /* Configure QSPI: AR register with address value */
mbed_official 532:fe11edbda85c 1879 WRITE_REG(hqspi->Instance->AR, cmd->Address);
mbed_official 532:fe11edbda85c 1880 }
mbed_official 532:fe11edbda85c 1881 }
mbed_official 532:fe11edbda85c 1882 else
mbed_official 532:fe11edbda85c 1883 {
mbed_official 532:fe11edbda85c 1884 /*---- Command with only alternate bytes ----*/
mbed_official 532:fe11edbda85c 1885 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1886 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1887 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
mbed_official 532:fe11edbda85c 1888 cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode |
mbed_official 532:fe11edbda85c 1889 FunctionalMode));
mbed_official 532:fe11edbda85c 1890 }
mbed_official 532:fe11edbda85c 1891 }
mbed_official 532:fe11edbda85c 1892 else
mbed_official 532:fe11edbda85c 1893 {
mbed_official 532:fe11edbda85c 1894 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
mbed_official 532:fe11edbda85c 1895 {
mbed_official 532:fe11edbda85c 1896 /*---- Command with only address ----*/
mbed_official 532:fe11edbda85c 1897 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1898 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1899 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
mbed_official 532:fe11edbda85c 1900 cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
mbed_official 532:fe11edbda85c 1901 FunctionalMode));
mbed_official 532:fe11edbda85c 1902
mbed_official 532:fe11edbda85c 1903 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
mbed_official 532:fe11edbda85c 1904 {
mbed_official 532:fe11edbda85c 1905 /* Configure QSPI: AR register with address value */
mbed_official 532:fe11edbda85c 1906 WRITE_REG(hqspi->Instance->AR, cmd->Address);
mbed_official 532:fe11edbda85c 1907 }
mbed_official 532:fe11edbda85c 1908 }
mbed_official 532:fe11edbda85c 1909 else
mbed_official 532:fe11edbda85c 1910 {
mbed_official 532:fe11edbda85c 1911 /*---- Command with only data phase ----*/
mbed_official 532:fe11edbda85c 1912 if (cmd->DataMode != QSPI_DATA_NONE)
mbed_official 532:fe11edbda85c 1913 {
mbed_official 532:fe11edbda85c 1914 /* Configure QSPI: CCR register with all communications parameters */
mbed_official 532:fe11edbda85c 1915 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
mbed_official 532:fe11edbda85c 1916 cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
mbed_official 532:fe11edbda85c 1917 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
mbed_official 532:fe11edbda85c 1918 }
mbed_official 532:fe11edbda85c 1919 }
mbed_official 532:fe11edbda85c 1920 }
mbed_official 532:fe11edbda85c 1921 }
mbed_official 532:fe11edbda85c 1922 }
mbed_official 532:fe11edbda85c 1923
mbed_official 532:fe11edbda85c 1924 /**
mbed_official 532:fe11edbda85c 1925 * @}
mbed_official 532:fe11edbda85c 1926 */
mbed_official 532:fe11edbda85c 1927
mbed_official 532:fe11edbda85c 1928 /**
mbed_official 532:fe11edbda85c 1929 * @}
mbed_official 532:fe11edbda85c 1930 */
mbed_official 532:fe11edbda85c 1931 #endif /* STM32F446xx */
mbed_official 532:fe11edbda85c 1932
mbed_official 532:fe11edbda85c 1933 #endif /* HAL_QSPI_MODULE_ENABLED */
mbed_official 532:fe11edbda85c 1934 /**
mbed_official 532:fe11edbda85c 1935 * @}
mbed_official 532:fe11edbda85c 1936 */
mbed_official 532:fe11edbda85c 1937
mbed_official 532:fe11edbda85c 1938 /**
mbed_official 532:fe11edbda85c 1939 * @}
mbed_official 532:fe11edbda85c 1940 */
mbed_official 532:fe11edbda85c 1941
mbed_official 532:fe11edbda85c 1942 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/