mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Jun 19 09:15:11 2015 +0100
Revision:
573:ad23fe03a082
Synchronized with git revision d47834cd4d729e5b36b4c1ad4650f8b8f6a9ab86

Full URL: https://github.com/mbedmicro/mbed/commit/d47834cd4d729e5b36b4c1ad4650f8b8f6a9ab86/

DISCO_F746NG - Add new target

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 573:ad23fe03a082 1 /**
mbed_official 573:ad23fe03a082 2 ******************************************************************************
mbed_official 573:ad23fe03a082 3 * @file stm32f7xx_hal_i2s.c
mbed_official 573:ad23fe03a082 4 * @author MCD Application Team
mbed_official 573:ad23fe03a082 5 * @version V1.0.0
mbed_official 573:ad23fe03a082 6 * @date 12-May-2015
mbed_official 573:ad23fe03a082 7 * @brief I2S HAL module driver.
mbed_official 573:ad23fe03a082 8 * This file provides firmware functions to manage the following
mbed_official 573:ad23fe03a082 9 * functionalities of the Integrated Interchip Sound (I2S) peripheral:
mbed_official 573:ad23fe03a082 10 * + Initialization and de-initialization functions
mbed_official 573:ad23fe03a082 11 * + IO operation functions
mbed_official 573:ad23fe03a082 12 * + Peripheral State and Errors functions
mbed_official 573:ad23fe03a082 13 @verbatim
mbed_official 573:ad23fe03a082 14 ===============================================================================
mbed_official 573:ad23fe03a082 15 ##### How to use this driver #####
mbed_official 573:ad23fe03a082 16 ===============================================================================
mbed_official 573:ad23fe03a082 17 [..]
mbed_official 573:ad23fe03a082 18 The I2S HAL driver can be used as follows:
mbed_official 573:ad23fe03a082 19
mbed_official 573:ad23fe03a082 20 (#) Declare a I2S_HandleTypeDef handle structure.
mbed_official 573:ad23fe03a082 21 (#) Initialize the I2S low level resources by implement the HAL_I2S_MspInit() API:
mbed_official 573:ad23fe03a082 22 (##) Enable the SPIx interface clock.
mbed_official 573:ad23fe03a082 23 (##) I2S pins configuration:
mbed_official 573:ad23fe03a082 24 (+++) Enable the clock for the I2S GPIOs.
mbed_official 573:ad23fe03a082 25 (+++) Configure these I2S pins as alternate function pull-up.
mbed_official 573:ad23fe03a082 26 (##) NVIC configuration if you need to use interrupt process (HAL_I2S_Transmit_IT()
mbed_official 573:ad23fe03a082 27 and HAL_I2S_Receive_IT() APIs).
mbed_official 573:ad23fe03a082 28 (+++) Configure the I2Sx interrupt priority.
mbed_official 573:ad23fe03a082 29 (+++) Enable the NVIC I2S IRQ handle.
mbed_official 573:ad23fe03a082 30 (##) DMA Configuration if you need to use DMA process (HAL_I2S_Transmit_DMA()
mbed_official 573:ad23fe03a082 31 and HAL_I2S_Receive_DMA() APIs:
mbed_official 573:ad23fe03a082 32 (+++) Declare a DMA handle structure for the Tx/Rx channel.
mbed_official 573:ad23fe03a082 33 (+++) Enable the DMAx interface clock.
mbed_official 573:ad23fe03a082 34 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 573:ad23fe03a082 35 (+++) Configure the DMA Tx/Rx Channel.
mbed_official 573:ad23fe03a082 36 (+++) Associate the initialized DMA handle to the I2S DMA Tx/Rx handle.
mbed_official 573:ad23fe03a082 37 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the
mbed_official 573:ad23fe03a082 38 DMA Tx/Rx Channel.
mbed_official 573:ad23fe03a082 39
mbed_official 573:ad23fe03a082 40 (#) Program the Mode, Standard, Data Format, MCLK Output, Audio frequency and Polarity
mbed_official 573:ad23fe03a082 41 using HAL_I2S_Init() function.
mbed_official 573:ad23fe03a082 42
mbed_official 573:ad23fe03a082 43 -@- The specific I2S interrupts (Transmission complete interrupt,
mbed_official 573:ad23fe03a082 44 RXNE interrupt and Error Interrupts) will be managed using the macros
mbed_official 573:ad23fe03a082 45 __HAL_I2S_ENABLE_IT() and __HAL_I2S_DISABLE_IT() inside the transmit and receive process.
mbed_official 573:ad23fe03a082 46 -@- Make sure that either:
mbed_official 573:ad23fe03a082 47 (+@) I2S clock is configured based on SYSCLK or
mbed_official 573:ad23fe03a082 48 (+@) External clock source is configured after setting correctly
mbed_official 573:ad23fe03a082 49 the define constant EXTERNAL_CLOCK_VALUE in the stm32f3xx_hal_conf.h file.
mbed_official 573:ad23fe03a082 50
mbed_official 573:ad23fe03a082 51 (#) Three mode of operations are available within this driver :
mbed_official 573:ad23fe03a082 52
mbed_official 573:ad23fe03a082 53 *** Polling mode IO operation ***
mbed_official 573:ad23fe03a082 54 =================================
mbed_official 573:ad23fe03a082 55 [..]
mbed_official 573:ad23fe03a082 56 (+) Send an amount of data in blocking mode using HAL_I2S_Transmit()
mbed_official 573:ad23fe03a082 57 (+) Receive an amount of data in blocking mode using HAL_I2S_Receive()
mbed_official 573:ad23fe03a082 58
mbed_official 573:ad23fe03a082 59 *** Interrupt mode IO operation ***
mbed_official 573:ad23fe03a082 60 ===================================
mbed_official 573:ad23fe03a082 61 [..]
mbed_official 573:ad23fe03a082 62 (+) Send an amount of data in non blocking mode using HAL_I2S_Transmit_IT()
mbed_official 573:ad23fe03a082 63 (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 64 add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback
mbed_official 573:ad23fe03a082 65 (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 66 add his own code by customization of function pointer HAL_I2S_TxCpltCallback
mbed_official 573:ad23fe03a082 67 (+) Receive an amount of data in non blocking mode using HAL_I2S_Receive_IT()
mbed_official 573:ad23fe03a082 68 (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 69 add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback
mbed_official 573:ad23fe03a082 70 (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 71 add his own code by customization of function pointer HAL_I2S_RxCpltCallback
mbed_official 573:ad23fe03a082 72 (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can
mbed_official 573:ad23fe03a082 73 add his own code by customization of function pointer HAL_I2S_ErrorCallback
mbed_official 573:ad23fe03a082 74
mbed_official 573:ad23fe03a082 75 *** DMA mode IO operation ***
mbed_official 573:ad23fe03a082 76 ==============================
mbed_official 573:ad23fe03a082 77 [..]
mbed_official 573:ad23fe03a082 78 (+) Send an amount of data in non blocking mode (DMA) using HAL_I2S_Transmit_DMA()
mbed_official 573:ad23fe03a082 79 (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 80 add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback
mbed_official 573:ad23fe03a082 81 (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 82 add his own code by customization of function pointer HAL_I2S_TxCpltCallback
mbed_official 573:ad23fe03a082 83 (+) Receive an amount of data in non blocking mode (DMA) using HAL_I2S_Receive_DMA()
mbed_official 573:ad23fe03a082 84 (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 85 add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback
mbed_official 573:ad23fe03a082 86 (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can
mbed_official 573:ad23fe03a082 87 add his own code by customization of function pointer HAL_I2S_RxCpltCallback
mbed_official 573:ad23fe03a082 88 (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can
mbed_official 573:ad23fe03a082 89 add his own code by customization of function pointer HAL_I2S_ErrorCallback
mbed_official 573:ad23fe03a082 90 (+) Pause the DMA Transfer using HAL_I2S_DMAPause()
mbed_official 573:ad23fe03a082 91 (+) Resume the DMA Transfer using HAL_I2S_DMAResume()
mbed_official 573:ad23fe03a082 92 (+) Stop the DMA Transfer using HAL_I2S_DMAStop()
mbed_official 573:ad23fe03a082 93
mbed_official 573:ad23fe03a082 94 *** I2S HAL driver macros list ***
mbed_official 573:ad23fe03a082 95 =============================================
mbed_official 573:ad23fe03a082 96 [..]
mbed_official 573:ad23fe03a082 97 Below the list of most used macros in I2S HAL driver.
mbed_official 573:ad23fe03a082 98
mbed_official 573:ad23fe03a082 99 (+) __HAL_I2S_ENABLE: Enable the specified SPI peripheral (in I2S mode)
mbed_official 573:ad23fe03a082 100 (+) __HAL_I2S_DISABLE: Disable the specified SPI peripheral (in I2S mode)
mbed_official 573:ad23fe03a082 101 (+) __HAL_I2S_ENABLE_IT : Enable the specified I2S interrupts
mbed_official 573:ad23fe03a082 102 (+) __HAL_I2S_DISABLE_IT : Disable the specified I2S interrupts
mbed_official 573:ad23fe03a082 103 (+) __HAL_I2S_GET_FLAG: Check whether the specified I2S flag is set or not
mbed_official 573:ad23fe03a082 104
mbed_official 573:ad23fe03a082 105 [..]
mbed_official 573:ad23fe03a082 106 (@) You can refer to the I2S HAL driver header file for more useful macros
mbed_official 573:ad23fe03a082 107
mbed_official 573:ad23fe03a082 108 @endverbatim
mbed_official 573:ad23fe03a082 109 ******************************************************************************
mbed_official 573:ad23fe03a082 110 * @attention
mbed_official 573:ad23fe03a082 111 *
mbed_official 573:ad23fe03a082 112 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 573:ad23fe03a082 113 *
mbed_official 573:ad23fe03a082 114 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 573:ad23fe03a082 115 * are permitted provided that the following conditions are met:
mbed_official 573:ad23fe03a082 116 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 573:ad23fe03a082 117 * this list of conditions and the following disclaimer.
mbed_official 573:ad23fe03a082 118 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 573:ad23fe03a082 119 * this list of conditions and the following disclaimer in the documentation
mbed_official 573:ad23fe03a082 120 * and/or other materials provided with the distribution.
mbed_official 573:ad23fe03a082 121 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 573:ad23fe03a082 122 * may be used to endorse or promote products derived from this software
mbed_official 573:ad23fe03a082 123 * without specific prior written permission.
mbed_official 573:ad23fe03a082 124 *
mbed_official 573:ad23fe03a082 125 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 573:ad23fe03a082 126 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 573:ad23fe03a082 127 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 573:ad23fe03a082 128 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 573:ad23fe03a082 129 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 573:ad23fe03a082 130 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 573:ad23fe03a082 131 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 573:ad23fe03a082 132 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 573:ad23fe03a082 133 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 573:ad23fe03a082 134 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 573:ad23fe03a082 135 *
mbed_official 573:ad23fe03a082 136 ******************************************************************************
mbed_official 573:ad23fe03a082 137 */
mbed_official 573:ad23fe03a082 138
mbed_official 573:ad23fe03a082 139 /* Includes ------------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 140 #include "stm32f7xx_hal.h"
mbed_official 573:ad23fe03a082 141
mbed_official 573:ad23fe03a082 142 /** @addtogroup STM32F7xx_HAL_Driver
mbed_official 573:ad23fe03a082 143 * @{
mbed_official 573:ad23fe03a082 144 */
mbed_official 573:ad23fe03a082 145
mbed_official 573:ad23fe03a082 146 /** @defgroup I2S I2S
mbed_official 573:ad23fe03a082 147 * @brief I2S HAL module driver
mbed_official 573:ad23fe03a082 148 * @{
mbed_official 573:ad23fe03a082 149 */
mbed_official 573:ad23fe03a082 150
mbed_official 573:ad23fe03a082 151 #ifdef HAL_I2S_MODULE_ENABLED
mbed_official 573:ad23fe03a082 152
mbed_official 573:ad23fe03a082 153 /* Private typedef -----------------------------------------------------------*/
mbed_official 573:ad23fe03a082 154 /* Private define ------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 155 /* Private macro -------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 156 /* Private variables ---------------------------------------------------------*/
mbed_official 573:ad23fe03a082 157 /* Private function prototypes -----------------------------------------------*/
mbed_official 573:ad23fe03a082 158 /** @defgroup I2S_Private_Functions I2S Private Functions
mbed_official 573:ad23fe03a082 159 * @{
mbed_official 573:ad23fe03a082 160 */
mbed_official 573:ad23fe03a082 161 static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma);
mbed_official 573:ad23fe03a082 162 static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 573:ad23fe03a082 163 static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma);
mbed_official 573:ad23fe03a082 164 static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 573:ad23fe03a082 165 static void I2S_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 573:ad23fe03a082 166 static void I2S_Transmit_IT(I2S_HandleTypeDef *hi2s);
mbed_official 573:ad23fe03a082 167 static void I2S_Receive_IT(I2S_HandleTypeDef *hi2s);
mbed_official 573:ad23fe03a082 168 static uint32_t I2S_GetClockFreq(I2S_HandleTypeDef *hi2s);
mbed_official 573:ad23fe03a082 169 static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t State, uint32_t Timeout);
mbed_official 573:ad23fe03a082 170 /**
mbed_official 573:ad23fe03a082 171 * @}
mbed_official 573:ad23fe03a082 172 */
mbed_official 573:ad23fe03a082 173
mbed_official 573:ad23fe03a082 174 /* Exported functions ---------------------------------------------------------*/
mbed_official 573:ad23fe03a082 175
mbed_official 573:ad23fe03a082 176 /** @defgroup I2S_Exported_Functions I2S Exported Functions
mbed_official 573:ad23fe03a082 177 * @{
mbed_official 573:ad23fe03a082 178 */
mbed_official 573:ad23fe03a082 179
mbed_official 573:ad23fe03a082 180 /** @defgroup I2S_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 573:ad23fe03a082 181 * @brief Initialization and Configuration functions
mbed_official 573:ad23fe03a082 182 *
mbed_official 573:ad23fe03a082 183 @verbatim
mbed_official 573:ad23fe03a082 184 ===============================================================================
mbed_official 573:ad23fe03a082 185 ##### Initialization and de-initialization functions #####
mbed_official 573:ad23fe03a082 186 ===============================================================================
mbed_official 573:ad23fe03a082 187 [..] This subsection provides a set of functions allowing to initialize and
mbed_official 573:ad23fe03a082 188 de-initialize the I2Sx peripheral in simplex mode:
mbed_official 573:ad23fe03a082 189
mbed_official 573:ad23fe03a082 190 (+) User must Implement HAL_I2S_MspInit() function in which he configures
mbed_official 573:ad23fe03a082 191 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
mbed_official 573:ad23fe03a082 192
mbed_official 573:ad23fe03a082 193 (+) Call the function HAL_I2S_Init() to configure the selected device with
mbed_official 573:ad23fe03a082 194 the selected configuration:
mbed_official 573:ad23fe03a082 195 (++) Mode
mbed_official 573:ad23fe03a082 196 (++) Standard
mbed_official 573:ad23fe03a082 197 (++) Data Format
mbed_official 573:ad23fe03a082 198 (++) MCLK Output
mbed_official 573:ad23fe03a082 199 (++) Audio frequency
mbed_official 573:ad23fe03a082 200 (++) Polarity
mbed_official 573:ad23fe03a082 201 (++) Full duplex mode
mbed_official 573:ad23fe03a082 202
mbed_official 573:ad23fe03a082 203 (+) Call the function HAL_I2S_DeInit() to restore the default configuration
mbed_official 573:ad23fe03a082 204 of the selected I2Sx peripheral.
mbed_official 573:ad23fe03a082 205 @endverbatim
mbed_official 573:ad23fe03a082 206 * @{
mbed_official 573:ad23fe03a082 207 */
mbed_official 573:ad23fe03a082 208
mbed_official 573:ad23fe03a082 209 /**
mbed_official 573:ad23fe03a082 210 * @brief Initializes the I2S according to the specified parameters
mbed_official 573:ad23fe03a082 211 * in the I2S_InitTypeDef and create the associated handle.
mbed_official 573:ad23fe03a082 212 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 213 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 214 * @retval HAL status
mbed_official 573:ad23fe03a082 215 */
mbed_official 573:ad23fe03a082 216 HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 217 {
mbed_official 573:ad23fe03a082 218 uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1;
mbed_official 573:ad23fe03a082 219 uint32_t tmp = 0, i2sclk = 0;
mbed_official 573:ad23fe03a082 220
mbed_official 573:ad23fe03a082 221 /* Check the I2S handle allocation */
mbed_official 573:ad23fe03a082 222 if(hi2s == NULL)
mbed_official 573:ad23fe03a082 223 {
mbed_official 573:ad23fe03a082 224 return HAL_ERROR;
mbed_official 573:ad23fe03a082 225 }
mbed_official 573:ad23fe03a082 226
mbed_official 573:ad23fe03a082 227 /* Check the parameters */
mbed_official 573:ad23fe03a082 228 assert_param(IS_I2S_ALL_INSTANCE(hi2s->Instance));
mbed_official 573:ad23fe03a082 229 assert_param(IS_I2S_MODE(hi2s->Init.Mode));
mbed_official 573:ad23fe03a082 230 assert_param(IS_I2S_STANDARD(hi2s->Init.Standard));
mbed_official 573:ad23fe03a082 231 assert_param(IS_I2S_DATA_FORMAT(hi2s->Init.DataFormat));
mbed_official 573:ad23fe03a082 232 assert_param(IS_I2S_MCLK_OUTPUT(hi2s->Init.MCLKOutput));
mbed_official 573:ad23fe03a082 233 assert_param(IS_I2S_AUDIO_FREQ(hi2s->Init.AudioFreq));
mbed_official 573:ad23fe03a082 234 assert_param(IS_I2S_CPOL(hi2s->Init.CPOL));
mbed_official 573:ad23fe03a082 235 assert_param(IS_I2S_CLOCKSOURCE(hi2s->Init.ClockSource));
mbed_official 573:ad23fe03a082 236
mbed_official 573:ad23fe03a082 237 if(hi2s->State == HAL_I2S_STATE_RESET)
mbed_official 573:ad23fe03a082 238 {
mbed_official 573:ad23fe03a082 239 /* Allocate lock resource and initialize it */
mbed_official 573:ad23fe03a082 240 hi2s->Lock = HAL_UNLOCKED;
mbed_official 573:ad23fe03a082 241 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
mbed_official 573:ad23fe03a082 242 HAL_I2S_MspInit(hi2s);
mbed_official 573:ad23fe03a082 243 }
mbed_official 573:ad23fe03a082 244
mbed_official 573:ad23fe03a082 245 hi2s->State = HAL_I2S_STATE_BUSY;
mbed_official 573:ad23fe03a082 246
mbed_official 573:ad23fe03a082 247 /*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/
mbed_official 573:ad23fe03a082 248 /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */
mbed_official 573:ad23fe03a082 249 hi2s->Instance->I2SCFGR &= ~(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \
mbed_official 573:ad23fe03a082 250 SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \
mbed_official 573:ad23fe03a082 251 SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD);
mbed_official 573:ad23fe03a082 252 hi2s->Instance->I2SPR = 0x0002;
mbed_official 573:ad23fe03a082 253
mbed_official 573:ad23fe03a082 254 /* Get the I2SCFGR register value */
mbed_official 573:ad23fe03a082 255 tmpreg = hi2s->Instance->I2SCFGR;
mbed_official 573:ad23fe03a082 256
mbed_official 573:ad23fe03a082 257 /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/
mbed_official 573:ad23fe03a082 258 if(hi2s->Init.AudioFreq == I2S_AUDIOFREQ_DEFAULT)
mbed_official 573:ad23fe03a082 259 {
mbed_official 573:ad23fe03a082 260 i2sodd = (uint16_t)0;
mbed_official 573:ad23fe03a082 261 i2sdiv = (uint16_t)2;
mbed_official 573:ad23fe03a082 262 }
mbed_official 573:ad23fe03a082 263 /* If the requested audio frequency is not the default, compute the prescaler */
mbed_official 573:ad23fe03a082 264 else
mbed_official 573:ad23fe03a082 265 {
mbed_official 573:ad23fe03a082 266 /* Check the frame length (For the Prescaler computing) *******************/
mbed_official 573:ad23fe03a082 267 if(hi2s->Init.DataFormat == I2S_DATAFORMAT_16B)
mbed_official 573:ad23fe03a082 268 {
mbed_official 573:ad23fe03a082 269 /* Packet length is 16 bits */
mbed_official 573:ad23fe03a082 270 packetlength = 1;
mbed_official 573:ad23fe03a082 271 }
mbed_official 573:ad23fe03a082 272 else
mbed_official 573:ad23fe03a082 273 {
mbed_official 573:ad23fe03a082 274 /* Packet length is 32 bits */
mbed_official 573:ad23fe03a082 275 packetlength = 2;
mbed_official 573:ad23fe03a082 276 }
mbed_official 573:ad23fe03a082 277
mbed_official 573:ad23fe03a082 278 /* Get I2S source Clock frequency ****************************************/
mbed_official 573:ad23fe03a082 279
mbed_official 573:ad23fe03a082 280 /* If an external I2S clock has to be used, the specific define should be set
mbed_official 573:ad23fe03a082 281 in the project configuration or in the stm32f3xx_conf.h file */
mbed_official 573:ad23fe03a082 282 if(hi2s->Init.ClockSource == I2S_CLOCK_EXTERNAL)
mbed_official 573:ad23fe03a082 283 {
mbed_official 573:ad23fe03a082 284 /* Set the I2S clock to the external clock value */
mbed_official 573:ad23fe03a082 285 i2sclk = EXTERNAL_CLOCK_VALUE;
mbed_official 573:ad23fe03a082 286 }
mbed_official 573:ad23fe03a082 287 else
mbed_official 573:ad23fe03a082 288 {
mbed_official 573:ad23fe03a082 289 /* Get the I2S source clock value */
mbed_official 573:ad23fe03a082 290 i2sclk = I2S_GetClockFreq(hi2s);
mbed_official 573:ad23fe03a082 291 }
mbed_official 573:ad23fe03a082 292
mbed_official 573:ad23fe03a082 293 /* Compute the Real divider depending on the MCLK output state, with a floating point */
mbed_official 573:ad23fe03a082 294 if(hi2s->Init.MCLKOutput == I2S_MCLKOUTPUT_ENABLE)
mbed_official 573:ad23fe03a082 295 {
mbed_official 573:ad23fe03a082 296 /* MCLK output is enabled */
mbed_official 573:ad23fe03a082 297 tmp = (uint16_t)(((((i2sclk / 256) * 10) / hi2s->Init.AudioFreq)) + 5);
mbed_official 573:ad23fe03a082 298 }
mbed_official 573:ad23fe03a082 299 else
mbed_official 573:ad23fe03a082 300 {
mbed_official 573:ad23fe03a082 301 /* MCLK output is disabled */
mbed_official 573:ad23fe03a082 302 tmp = (uint16_t)(((((i2sclk / (32 * packetlength)) *10 ) / hi2s->Init.AudioFreq)) + 5);
mbed_official 573:ad23fe03a082 303 }
mbed_official 573:ad23fe03a082 304
mbed_official 573:ad23fe03a082 305 /* Remove the flatting point */
mbed_official 573:ad23fe03a082 306 tmp = tmp / 10;
mbed_official 573:ad23fe03a082 307
mbed_official 573:ad23fe03a082 308 /* Check the parity of the divider */
mbed_official 573:ad23fe03a082 309 i2sodd = (uint16_t)(tmp & (uint16_t)0x0001);
mbed_official 573:ad23fe03a082 310
mbed_official 573:ad23fe03a082 311 /* Compute the i2sdiv prescaler */
mbed_official 573:ad23fe03a082 312 i2sdiv = (uint16_t)((tmp - i2sodd) / 2);
mbed_official 573:ad23fe03a082 313
mbed_official 573:ad23fe03a082 314 /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
mbed_official 573:ad23fe03a082 315 i2sodd = (uint16_t) (i2sodd << 8);
mbed_official 573:ad23fe03a082 316 }
mbed_official 573:ad23fe03a082 317
mbed_official 573:ad23fe03a082 318 /* Test if the divider is 1 or 0 or greater than 0xFF */
mbed_official 573:ad23fe03a082 319 if((i2sdiv < 2) || (i2sdiv > 0xFF))
mbed_official 573:ad23fe03a082 320 {
mbed_official 573:ad23fe03a082 321 /* Set the default values */
mbed_official 573:ad23fe03a082 322 i2sdiv = 2;
mbed_official 573:ad23fe03a082 323 i2sodd = 0;
mbed_official 573:ad23fe03a082 324 }
mbed_official 573:ad23fe03a082 325
mbed_official 573:ad23fe03a082 326 /* Write to SPIx I2SPR register the computed value */
mbed_official 573:ad23fe03a082 327 hi2s->Instance->I2SPR = (uint16_t)((uint16_t)i2sdiv | (uint16_t)(i2sodd | (uint16_t)hi2s->Init.MCLKOutput));
mbed_official 573:ad23fe03a082 328
mbed_official 573:ad23fe03a082 329 /* Configure the I2S with the I2S_InitStruct values */
mbed_official 573:ad23fe03a082 330 tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | (uint16_t)(hi2s->Init.Mode | \
mbed_official 573:ad23fe03a082 331 (uint16_t)(hi2s->Init.Standard | (uint16_t)(hi2s->Init.DataFormat | \
mbed_official 573:ad23fe03a082 332 (uint16_t)hi2s->Init.CPOL))));
mbed_official 573:ad23fe03a082 333
mbed_official 573:ad23fe03a082 334 /* Write to SPIx I2SCFGR */
mbed_official 573:ad23fe03a082 335 hi2s->Instance->I2SCFGR = tmpreg;
mbed_official 573:ad23fe03a082 336
mbed_official 573:ad23fe03a082 337 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 338 hi2s->State= HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 339
mbed_official 573:ad23fe03a082 340 return HAL_OK;
mbed_official 573:ad23fe03a082 341 }
mbed_official 573:ad23fe03a082 342
mbed_official 573:ad23fe03a082 343 /**
mbed_official 573:ad23fe03a082 344 * @brief DeInitializes the I2S peripheral
mbed_official 573:ad23fe03a082 345 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 346 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 347 * @retval HAL status
mbed_official 573:ad23fe03a082 348 */
mbed_official 573:ad23fe03a082 349 HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 350 {
mbed_official 573:ad23fe03a082 351 /* Check the I2S handle allocation */
mbed_official 573:ad23fe03a082 352 if(hi2s == NULL)
mbed_official 573:ad23fe03a082 353 {
mbed_official 573:ad23fe03a082 354 return HAL_ERROR;
mbed_official 573:ad23fe03a082 355 }
mbed_official 573:ad23fe03a082 356
mbed_official 573:ad23fe03a082 357 /* Check the parameters */
mbed_official 573:ad23fe03a082 358 assert_param(IS_I2S_ALL_INSTANCE(hi2s->Instance));
mbed_official 573:ad23fe03a082 359
mbed_official 573:ad23fe03a082 360 hi2s->State = HAL_I2S_STATE_BUSY;
mbed_official 573:ad23fe03a082 361
mbed_official 573:ad23fe03a082 362 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
mbed_official 573:ad23fe03a082 363 HAL_I2S_MspDeInit(hi2s);
mbed_official 573:ad23fe03a082 364
mbed_official 573:ad23fe03a082 365 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 366 hi2s->State = HAL_I2S_STATE_RESET;
mbed_official 573:ad23fe03a082 367
mbed_official 573:ad23fe03a082 368 /* Release Lock */
mbed_official 573:ad23fe03a082 369 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 370
mbed_official 573:ad23fe03a082 371 return HAL_OK;
mbed_official 573:ad23fe03a082 372 }
mbed_official 573:ad23fe03a082 373
mbed_official 573:ad23fe03a082 374 /**
mbed_official 573:ad23fe03a082 375 * @brief I2S MSP Init
mbed_official 573:ad23fe03a082 376 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 377 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 378 * @retval None
mbed_official 573:ad23fe03a082 379 */
mbed_official 573:ad23fe03a082 380 __weak void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 381 {
mbed_official 573:ad23fe03a082 382 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 383 the HAL_I2S_MspInit could be implemented in the user file
mbed_official 573:ad23fe03a082 384 */
mbed_official 573:ad23fe03a082 385 }
mbed_official 573:ad23fe03a082 386
mbed_official 573:ad23fe03a082 387 /**
mbed_official 573:ad23fe03a082 388 * @brief I2S MSP DeInit
mbed_official 573:ad23fe03a082 389 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 390 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 391 * @retval None
mbed_official 573:ad23fe03a082 392 */
mbed_official 573:ad23fe03a082 393 __weak void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 394 {
mbed_official 573:ad23fe03a082 395 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 396 the HAL_I2S_MspDeInit could be implemented in the user file
mbed_official 573:ad23fe03a082 397 */
mbed_official 573:ad23fe03a082 398 }
mbed_official 573:ad23fe03a082 399
mbed_official 573:ad23fe03a082 400 /**
mbed_official 573:ad23fe03a082 401 * @}
mbed_official 573:ad23fe03a082 402 */
mbed_official 573:ad23fe03a082 403
mbed_official 573:ad23fe03a082 404 /** @defgroup I2S_Exported_Functions_Group2 Input and Output operation functions
mbed_official 573:ad23fe03a082 405 * @brief Data transfers functions
mbed_official 573:ad23fe03a082 406 *
mbed_official 573:ad23fe03a082 407 @verbatim
mbed_official 573:ad23fe03a082 408 ===============================================================================
mbed_official 573:ad23fe03a082 409 ##### IO operation functions #####
mbed_official 573:ad23fe03a082 410 ===============================================================================
mbed_official 573:ad23fe03a082 411 [..]
mbed_official 573:ad23fe03a082 412 This subsection provides a set of functions allowing to manage the I2S data
mbed_official 573:ad23fe03a082 413 transfers.
mbed_official 573:ad23fe03a082 414
mbed_official 573:ad23fe03a082 415 (#) There are two modes of transfer:
mbed_official 573:ad23fe03a082 416 (++) Blocking mode : The communication is performed in the polling mode.
mbed_official 573:ad23fe03a082 417 The status of all data processing is returned by the same function
mbed_official 573:ad23fe03a082 418 after finishing transfer.
mbed_official 573:ad23fe03a082 419 (++) No-Blocking mode : The communication is performed using Interrupts
mbed_official 573:ad23fe03a082 420 or DMA. These functions return the status of the transfer startup.
mbed_official 573:ad23fe03a082 421 The end of the data processing will be indicated through the
mbed_official 573:ad23fe03a082 422 dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 573:ad23fe03a082 423 using DMA mode.
mbed_official 573:ad23fe03a082 424
mbed_official 573:ad23fe03a082 425 (#) Blocking mode functions are :
mbed_official 573:ad23fe03a082 426 (++) HAL_I2S_Transmit()
mbed_official 573:ad23fe03a082 427 (++) HAL_I2S_Receive()
mbed_official 573:ad23fe03a082 428
mbed_official 573:ad23fe03a082 429 (#) No-Blocking mode functions with Interrupt are :
mbed_official 573:ad23fe03a082 430 (++) HAL_I2S_Transmit_IT()
mbed_official 573:ad23fe03a082 431 (++) HAL_I2S_Receive_IT()
mbed_official 573:ad23fe03a082 432
mbed_official 573:ad23fe03a082 433 (#) No-Blocking mode functions with DMA are :
mbed_official 573:ad23fe03a082 434 (++) HAL_I2S_Transmit_DMA()
mbed_official 573:ad23fe03a082 435 (++) HAL_I2S_Receive_DMA()
mbed_official 573:ad23fe03a082 436
mbed_official 573:ad23fe03a082 437 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 573:ad23fe03a082 438 (++) HAL_I2S_TxCpltCallback()
mbed_official 573:ad23fe03a082 439 (++) HAL_I2S_RxCpltCallback()
mbed_official 573:ad23fe03a082 440 (++) HAL_I2S_ErrorCallback()
mbed_official 573:ad23fe03a082 441
mbed_official 573:ad23fe03a082 442 @endverbatim
mbed_official 573:ad23fe03a082 443 * @{
mbed_official 573:ad23fe03a082 444 */
mbed_official 573:ad23fe03a082 445
mbed_official 573:ad23fe03a082 446 /**
mbed_official 573:ad23fe03a082 447 * @brief Transmit an amount of data in blocking mode
mbed_official 573:ad23fe03a082 448 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 449 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 450 * @param pData: a 16-bit pointer to data buffer.
mbed_official 573:ad23fe03a082 451 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 452 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 453 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 454 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 455 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 456 * @param Timeout: Timeout duration
mbed_official 573:ad23fe03a082 457 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 458 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 459 * @retval HAL status
mbed_official 573:ad23fe03a082 460 */
mbed_official 573:ad23fe03a082 461 HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 573:ad23fe03a082 462 {
mbed_official 573:ad23fe03a082 463 if((pData == NULL ) || (Size == 0))
mbed_official 573:ad23fe03a082 464 {
mbed_official 573:ad23fe03a082 465 return HAL_ERROR;
mbed_official 573:ad23fe03a082 466 }
mbed_official 573:ad23fe03a082 467
mbed_official 573:ad23fe03a082 468 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 469 {
mbed_official 573:ad23fe03a082 470 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 471 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 472 {
mbed_official 573:ad23fe03a082 473 hi2s->TxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 474 hi2s->TxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 475 }
mbed_official 573:ad23fe03a082 476 else
mbed_official 573:ad23fe03a082 477 {
mbed_official 573:ad23fe03a082 478 hi2s->TxXferSize = Size;
mbed_official 573:ad23fe03a082 479 hi2s->TxXferCount = Size;
mbed_official 573:ad23fe03a082 480 }
mbed_official 573:ad23fe03a082 481
mbed_official 573:ad23fe03a082 482 /* Process Locked */
mbed_official 573:ad23fe03a082 483 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 484
mbed_official 573:ad23fe03a082 485 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 486 hi2s->State = HAL_I2S_STATE_BUSY_TX;
mbed_official 573:ad23fe03a082 487
mbed_official 573:ad23fe03a082 488 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 489 if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 490 {
mbed_official 573:ad23fe03a082 491 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 492 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 493 }
mbed_official 573:ad23fe03a082 494
mbed_official 573:ad23fe03a082 495 while(hi2s->TxXferCount > 0)
mbed_official 573:ad23fe03a082 496 {
mbed_official 573:ad23fe03a082 497 hi2s->Instance->DR = (*pData++);
mbed_official 573:ad23fe03a082 498 hi2s->TxXferCount--;
mbed_official 573:ad23fe03a082 499 /* Wait until TXE flag is set */
mbed_official 573:ad23fe03a082 500 if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout) != HAL_OK)
mbed_official 573:ad23fe03a082 501 {
mbed_official 573:ad23fe03a082 502 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 503 hi2s->ErrorCode |= HAL_I2S_ERROR_TIMEOUT;
mbed_official 573:ad23fe03a082 504 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 505 return HAL_TIMEOUT;
mbed_official 573:ad23fe03a082 506 }
mbed_official 573:ad23fe03a082 507
mbed_official 573:ad23fe03a082 508 /* Check if an underrun occurs */
mbed_official 573:ad23fe03a082 509 if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET)
mbed_official 573:ad23fe03a082 510 {
mbed_official 573:ad23fe03a082 511 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 512 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 513
mbed_official 573:ad23fe03a082 514 /* Process Unlocked */
mbed_official 573:ad23fe03a082 515 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 516
mbed_official 573:ad23fe03a082 517 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 518 hi2s->ErrorCode |= HAL_I2S_ERROR_UDR;
mbed_official 573:ad23fe03a082 519 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 520
mbed_official 573:ad23fe03a082 521 return HAL_ERROR;
mbed_official 573:ad23fe03a082 522 }
mbed_official 573:ad23fe03a082 523 }
mbed_official 573:ad23fe03a082 524
mbed_official 573:ad23fe03a082 525 /* Wait until Busy flag is reset */
mbed_official 573:ad23fe03a082 526 if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_BSY, RESET, Timeout) != HAL_OK)
mbed_official 573:ad23fe03a082 527 {
mbed_official 573:ad23fe03a082 528 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 529 hi2s->ErrorCode |= HAL_I2S_ERROR_TIMEOUT;
mbed_official 573:ad23fe03a082 530 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 531 return HAL_TIMEOUT;
mbed_official 573:ad23fe03a082 532 }
mbed_official 573:ad23fe03a082 533
mbed_official 573:ad23fe03a082 534 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 535
mbed_official 573:ad23fe03a082 536 /* Process Unlocked */
mbed_official 573:ad23fe03a082 537 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 538
mbed_official 573:ad23fe03a082 539 return HAL_OK;
mbed_official 573:ad23fe03a082 540 }
mbed_official 573:ad23fe03a082 541 else
mbed_official 573:ad23fe03a082 542 {
mbed_official 573:ad23fe03a082 543 return HAL_BUSY;
mbed_official 573:ad23fe03a082 544 }
mbed_official 573:ad23fe03a082 545 }
mbed_official 573:ad23fe03a082 546
mbed_official 573:ad23fe03a082 547 /**
mbed_official 573:ad23fe03a082 548 * @brief Receive an amount of data in blocking mode
mbed_official 573:ad23fe03a082 549 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 550 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 551 * @param pData: a 16-bit pointer to data buffer.
mbed_official 573:ad23fe03a082 552 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 553 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 554 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 555 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 556 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 557 * @param Timeout: Timeout duration
mbed_official 573:ad23fe03a082 558 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 559 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 560 * @note In I2S Master Receiver mode, just after enabling the peripheral the clock will be generate
mbed_official 573:ad23fe03a082 561 * in continuous way and as the I2S is not disabled at the end of the I2S transaction.
mbed_official 573:ad23fe03a082 562 * @retval HAL status
mbed_official 573:ad23fe03a082 563 */
mbed_official 573:ad23fe03a082 564 HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 573:ad23fe03a082 565 {
mbed_official 573:ad23fe03a082 566 if((pData == NULL ) || (Size == 0))
mbed_official 573:ad23fe03a082 567 {
mbed_official 573:ad23fe03a082 568 return HAL_ERROR;
mbed_official 573:ad23fe03a082 569 }
mbed_official 573:ad23fe03a082 570
mbed_official 573:ad23fe03a082 571 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 572 {
mbed_official 573:ad23fe03a082 573 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 574 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 575 {
mbed_official 573:ad23fe03a082 576 hi2s->RxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 577 hi2s->RxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 578 }
mbed_official 573:ad23fe03a082 579 else
mbed_official 573:ad23fe03a082 580 {
mbed_official 573:ad23fe03a082 581 hi2s->RxXferSize = Size;
mbed_official 573:ad23fe03a082 582 hi2s->RxXferCount = Size;
mbed_official 573:ad23fe03a082 583 }
mbed_official 573:ad23fe03a082 584 /* Process Locked */
mbed_official 573:ad23fe03a082 585 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 586
mbed_official 573:ad23fe03a082 587 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 588 hi2s->State = HAL_I2S_STATE_BUSY_RX;
mbed_official 573:ad23fe03a082 589
mbed_official 573:ad23fe03a082 590 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 591 if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 592 {
mbed_official 573:ad23fe03a082 593 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 594 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 595 }
mbed_official 573:ad23fe03a082 596
mbed_official 573:ad23fe03a082 597 /* Check if Master Receiver mode is selected */
mbed_official 573:ad23fe03a082 598 if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX)
mbed_official 573:ad23fe03a082 599 {
mbed_official 573:ad23fe03a082 600 /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read
mbed_official 573:ad23fe03a082 601 access to the SPI_SR register. */
mbed_official 573:ad23fe03a082 602 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
mbed_official 573:ad23fe03a082 603 }
mbed_official 573:ad23fe03a082 604
mbed_official 573:ad23fe03a082 605 /* Receive data */
mbed_official 573:ad23fe03a082 606 while(hi2s->RxXferCount > 0)
mbed_official 573:ad23fe03a082 607 {
mbed_official 573:ad23fe03a082 608 /* Wait until RXNE flag is set */
mbed_official 573:ad23fe03a082 609 if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout) != HAL_OK)
mbed_official 573:ad23fe03a082 610 {
mbed_official 573:ad23fe03a082 611 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 612 hi2s->ErrorCode |= HAL_I2S_ERROR_TIMEOUT;
mbed_official 573:ad23fe03a082 613 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 614 return HAL_TIMEOUT;
mbed_official 573:ad23fe03a082 615 }
mbed_official 573:ad23fe03a082 616
mbed_official 573:ad23fe03a082 617 /* Check if an overrun occurs */
mbed_official 573:ad23fe03a082 618 if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET)
mbed_official 573:ad23fe03a082 619 {
mbed_official 573:ad23fe03a082 620 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 621 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 622
mbed_official 573:ad23fe03a082 623 /* Process Unlocked */
mbed_official 573:ad23fe03a082 624 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 625
mbed_official 573:ad23fe03a082 626 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 627 hi2s->ErrorCode |= HAL_I2S_ERROR_OVR;
mbed_official 573:ad23fe03a082 628 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 629
mbed_official 573:ad23fe03a082 630 return HAL_ERROR;
mbed_official 573:ad23fe03a082 631 }
mbed_official 573:ad23fe03a082 632
mbed_official 573:ad23fe03a082 633 (*pData++) = hi2s->Instance->DR;
mbed_official 573:ad23fe03a082 634 hi2s->RxXferCount--;
mbed_official 573:ad23fe03a082 635 }
mbed_official 573:ad23fe03a082 636
mbed_official 573:ad23fe03a082 637 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 638
mbed_official 573:ad23fe03a082 639 /* Process Unlocked */
mbed_official 573:ad23fe03a082 640 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 641
mbed_official 573:ad23fe03a082 642 return HAL_OK;
mbed_official 573:ad23fe03a082 643 }
mbed_official 573:ad23fe03a082 644 else
mbed_official 573:ad23fe03a082 645 {
mbed_official 573:ad23fe03a082 646 return HAL_BUSY;
mbed_official 573:ad23fe03a082 647 }
mbed_official 573:ad23fe03a082 648 }
mbed_official 573:ad23fe03a082 649
mbed_official 573:ad23fe03a082 650 /**
mbed_official 573:ad23fe03a082 651 * @brief Transmit an amount of data in non-blocking mode with Interrupt
mbed_official 573:ad23fe03a082 652 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 653 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 654 * @param pData: a 16-bit pointer to data buffer.
mbed_official 573:ad23fe03a082 655 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 656 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 657 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 658 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 659 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 660 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 661 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 662 * @retval HAL status
mbed_official 573:ad23fe03a082 663 */
mbed_official 573:ad23fe03a082 664 HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
mbed_official 573:ad23fe03a082 665 {
mbed_official 573:ad23fe03a082 666 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 667 {
mbed_official 573:ad23fe03a082 668 if((pData == NULL) || (Size == 0))
mbed_official 573:ad23fe03a082 669 {
mbed_official 573:ad23fe03a082 670 return HAL_ERROR;
mbed_official 573:ad23fe03a082 671 }
mbed_official 573:ad23fe03a082 672
mbed_official 573:ad23fe03a082 673 hi2s->pTxBuffPtr = pData;
mbed_official 573:ad23fe03a082 674 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 675 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 676 {
mbed_official 573:ad23fe03a082 677 hi2s->TxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 678 hi2s->TxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 679 }
mbed_official 573:ad23fe03a082 680 else
mbed_official 573:ad23fe03a082 681 {
mbed_official 573:ad23fe03a082 682 hi2s->TxXferSize = Size;
mbed_official 573:ad23fe03a082 683 hi2s->TxXferCount = Size;
mbed_official 573:ad23fe03a082 684 }
mbed_official 573:ad23fe03a082 685
mbed_official 573:ad23fe03a082 686 /* Process Locked */
mbed_official 573:ad23fe03a082 687 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 688
mbed_official 573:ad23fe03a082 689 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 690 hi2s->State = HAL_I2S_STATE_BUSY_TX;
mbed_official 573:ad23fe03a082 691
mbed_official 573:ad23fe03a082 692 /* Enable TXE and ERR interrupt */
mbed_official 573:ad23fe03a082 693 __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 694
mbed_official 573:ad23fe03a082 695 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 696 if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 697 {
mbed_official 573:ad23fe03a082 698 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 699 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 700 }
mbed_official 573:ad23fe03a082 701
mbed_official 573:ad23fe03a082 702 /* Process Unlocked */
mbed_official 573:ad23fe03a082 703 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 704
mbed_official 573:ad23fe03a082 705 return HAL_OK;
mbed_official 573:ad23fe03a082 706 }
mbed_official 573:ad23fe03a082 707 else
mbed_official 573:ad23fe03a082 708 {
mbed_official 573:ad23fe03a082 709 return HAL_BUSY;
mbed_official 573:ad23fe03a082 710 }
mbed_official 573:ad23fe03a082 711 }
mbed_official 573:ad23fe03a082 712
mbed_official 573:ad23fe03a082 713 /**
mbed_official 573:ad23fe03a082 714 * @brief Receive an amount of data in non-blocking mode with Interrupt
mbed_official 573:ad23fe03a082 715 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 716 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 717 * @param pData: a 16-bit pointer to the Receive data buffer.
mbed_official 573:ad23fe03a082 718 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 719 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 720 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 721 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 722 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 723 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 724 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 725 * @note It is recommended to use DMA for the I2S receiver to avoid de-synchronisation
mbed_official 573:ad23fe03a082 726 * between Master and Slave otherwise the I2S interrupt should be optimized.
mbed_official 573:ad23fe03a082 727 * @retval HAL status
mbed_official 573:ad23fe03a082 728 */
mbed_official 573:ad23fe03a082 729 HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
mbed_official 573:ad23fe03a082 730 {
mbed_official 573:ad23fe03a082 731 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 732 {
mbed_official 573:ad23fe03a082 733 if((pData == NULL) || (Size == 0))
mbed_official 573:ad23fe03a082 734 {
mbed_official 573:ad23fe03a082 735 return HAL_ERROR;
mbed_official 573:ad23fe03a082 736 }
mbed_official 573:ad23fe03a082 737
mbed_official 573:ad23fe03a082 738 hi2s->pRxBuffPtr = pData;
mbed_official 573:ad23fe03a082 739 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 740 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 741 {
mbed_official 573:ad23fe03a082 742 hi2s->RxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 743 hi2s->RxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 744 }
mbed_official 573:ad23fe03a082 745 else
mbed_official 573:ad23fe03a082 746 {
mbed_official 573:ad23fe03a082 747 hi2s->RxXferSize = Size;
mbed_official 573:ad23fe03a082 748 hi2s->RxXferCount = Size;
mbed_official 573:ad23fe03a082 749 }
mbed_official 573:ad23fe03a082 750 /* Process Locked */
mbed_official 573:ad23fe03a082 751 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 752
mbed_official 573:ad23fe03a082 753 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 754 hi2s->State = HAL_I2S_STATE_BUSY_RX;
mbed_official 573:ad23fe03a082 755
mbed_official 573:ad23fe03a082 756 /* Enable TXE and ERR interrupt */
mbed_official 573:ad23fe03a082 757 __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 758
mbed_official 573:ad23fe03a082 759 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 760 if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 761 {
mbed_official 573:ad23fe03a082 762 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 763 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 764 }
mbed_official 573:ad23fe03a082 765
mbed_official 573:ad23fe03a082 766 /* Process Unlocked */
mbed_official 573:ad23fe03a082 767 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 768
mbed_official 573:ad23fe03a082 769 return HAL_OK;
mbed_official 573:ad23fe03a082 770 }
mbed_official 573:ad23fe03a082 771 else
mbed_official 573:ad23fe03a082 772 {
mbed_official 573:ad23fe03a082 773 return HAL_BUSY;
mbed_official 573:ad23fe03a082 774 }
mbed_official 573:ad23fe03a082 775 }
mbed_official 573:ad23fe03a082 776
mbed_official 573:ad23fe03a082 777 /**
mbed_official 573:ad23fe03a082 778 * @brief Transmit an amount of data in non-blocking mode with DMA
mbed_official 573:ad23fe03a082 779 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 780 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 781 * @param pData: a 16-bit pointer to the Transmit data buffer.
mbed_official 573:ad23fe03a082 782 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 783 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 784 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 785 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 786 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 787 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 788 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 789 * @retval HAL status
mbed_official 573:ad23fe03a082 790 */
mbed_official 573:ad23fe03a082 791 HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
mbed_official 573:ad23fe03a082 792 {
mbed_official 573:ad23fe03a082 793 uint32_t *tmp;
mbed_official 573:ad23fe03a082 794
mbed_official 573:ad23fe03a082 795 if((pData == NULL) || (Size == 0))
mbed_official 573:ad23fe03a082 796 {
mbed_official 573:ad23fe03a082 797 return HAL_ERROR;
mbed_official 573:ad23fe03a082 798 }
mbed_official 573:ad23fe03a082 799
mbed_official 573:ad23fe03a082 800 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 801 {
mbed_official 573:ad23fe03a082 802 hi2s->pTxBuffPtr = pData;
mbed_official 573:ad23fe03a082 803 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 804 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 805 {
mbed_official 573:ad23fe03a082 806 hi2s->TxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 807 hi2s->TxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 808 }
mbed_official 573:ad23fe03a082 809 else
mbed_official 573:ad23fe03a082 810 {
mbed_official 573:ad23fe03a082 811 hi2s->TxXferSize = Size;
mbed_official 573:ad23fe03a082 812 hi2s->TxXferCount = Size;
mbed_official 573:ad23fe03a082 813 }
mbed_official 573:ad23fe03a082 814
mbed_official 573:ad23fe03a082 815 /* Process Locked */
mbed_official 573:ad23fe03a082 816 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 817
mbed_official 573:ad23fe03a082 818 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 819 hi2s->State = HAL_I2S_STATE_BUSY_TX;
mbed_official 573:ad23fe03a082 820
mbed_official 573:ad23fe03a082 821 /* Set the I2S Tx DMA Half transfer complete callback */
mbed_official 573:ad23fe03a082 822 hi2s->hdmatx->XferHalfCpltCallback = I2S_DMATxHalfCplt;
mbed_official 573:ad23fe03a082 823
mbed_official 573:ad23fe03a082 824 /* Set the I2S TxDMA transfer complete callback */
mbed_official 573:ad23fe03a082 825 hi2s->hdmatx->XferCpltCallback = I2S_DMATxCplt;
mbed_official 573:ad23fe03a082 826
mbed_official 573:ad23fe03a082 827 /* Set the DMA error callback */
mbed_official 573:ad23fe03a082 828 hi2s->hdmatx->XferErrorCallback = I2S_DMAError;
mbed_official 573:ad23fe03a082 829
mbed_official 573:ad23fe03a082 830 /* Enable the Tx DMA Channel */
mbed_official 573:ad23fe03a082 831 tmp = (uint32_t*)&pData;
mbed_official 573:ad23fe03a082 832 HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t*)tmp, (uint32_t)&hi2s->Instance->DR, hi2s->TxXferSize);
mbed_official 573:ad23fe03a082 833
mbed_official 573:ad23fe03a082 834 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 835 if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 836 {
mbed_official 573:ad23fe03a082 837 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 838 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 839 }
mbed_official 573:ad23fe03a082 840
mbed_official 573:ad23fe03a082 841 /* Enable Tx DMA Request */
mbed_official 573:ad23fe03a082 842 hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN;
mbed_official 573:ad23fe03a082 843
mbed_official 573:ad23fe03a082 844 /* Process Unlocked */
mbed_official 573:ad23fe03a082 845 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 846
mbed_official 573:ad23fe03a082 847 return HAL_OK;
mbed_official 573:ad23fe03a082 848 }
mbed_official 573:ad23fe03a082 849 else
mbed_official 573:ad23fe03a082 850 {
mbed_official 573:ad23fe03a082 851 return HAL_BUSY;
mbed_official 573:ad23fe03a082 852 }
mbed_official 573:ad23fe03a082 853 }
mbed_official 573:ad23fe03a082 854
mbed_official 573:ad23fe03a082 855 /**
mbed_official 573:ad23fe03a082 856 * @brief Receive an amount of data in non-blocking mode with DMA
mbed_official 573:ad23fe03a082 857 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 858 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 859 * @param pData: a 16-bit pointer to the Receive data buffer.
mbed_official 573:ad23fe03a082 860 * @param Size: number of data sample to be sent:
mbed_official 573:ad23fe03a082 861 * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S
mbed_official 573:ad23fe03a082 862 * configuration phase, the Size parameter means the number of 16-bit data length
mbed_official 573:ad23fe03a082 863 * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected
mbed_official 573:ad23fe03a082 864 * the Size parameter means the number of 16-bit data length.
mbed_official 573:ad23fe03a082 865 * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization
mbed_official 573:ad23fe03a082 866 * between Master and Slave(example: audio streaming).
mbed_official 573:ad23fe03a082 867 * @retval HAL status
mbed_official 573:ad23fe03a082 868 */
mbed_official 573:ad23fe03a082 869 HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
mbed_official 573:ad23fe03a082 870 {
mbed_official 573:ad23fe03a082 871 uint32_t *tmp;
mbed_official 573:ad23fe03a082 872
mbed_official 573:ad23fe03a082 873 if((pData == NULL) || (Size == 0))
mbed_official 573:ad23fe03a082 874 {
mbed_official 573:ad23fe03a082 875 return HAL_ERROR;
mbed_official 573:ad23fe03a082 876 }
mbed_official 573:ad23fe03a082 877
mbed_official 573:ad23fe03a082 878 if(hi2s->State == HAL_I2S_STATE_READY)
mbed_official 573:ad23fe03a082 879 {
mbed_official 573:ad23fe03a082 880 hi2s->pRxBuffPtr = pData;
mbed_official 573:ad23fe03a082 881 if(((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_24B)||\
mbed_official 573:ad23fe03a082 882 ((hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)) == I2S_DATAFORMAT_32B))
mbed_official 573:ad23fe03a082 883 {
mbed_official 573:ad23fe03a082 884 hi2s->RxXferSize = (Size << 1);
mbed_official 573:ad23fe03a082 885 hi2s->RxXferCount = (Size << 1);
mbed_official 573:ad23fe03a082 886 }
mbed_official 573:ad23fe03a082 887 else
mbed_official 573:ad23fe03a082 888 {
mbed_official 573:ad23fe03a082 889 hi2s->RxXferSize = Size;
mbed_official 573:ad23fe03a082 890 hi2s->RxXferCount = Size;
mbed_official 573:ad23fe03a082 891 }
mbed_official 573:ad23fe03a082 892 /* Process Locked */
mbed_official 573:ad23fe03a082 893 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 894
mbed_official 573:ad23fe03a082 895 hi2s->ErrorCode = HAL_I2S_ERROR_NONE;
mbed_official 573:ad23fe03a082 896 hi2s->State = HAL_I2S_STATE_BUSY_RX;
mbed_official 573:ad23fe03a082 897
mbed_official 573:ad23fe03a082 898 /* Set the I2S Rx DMA Half transfer complete callback */
mbed_official 573:ad23fe03a082 899 hi2s->hdmarx->XferHalfCpltCallback = I2S_DMARxHalfCplt;
mbed_official 573:ad23fe03a082 900
mbed_official 573:ad23fe03a082 901 /* Set the I2S Rx DMA transfer complete callback */
mbed_official 573:ad23fe03a082 902 hi2s->hdmarx->XferCpltCallback = I2S_DMARxCplt;
mbed_official 573:ad23fe03a082 903
mbed_official 573:ad23fe03a082 904 /* Set the DMA error callback */
mbed_official 573:ad23fe03a082 905 hi2s->hdmarx->XferErrorCallback = I2S_DMAError;
mbed_official 573:ad23fe03a082 906
mbed_official 573:ad23fe03a082 907 /* Check if Master Receiver mode is selected */
mbed_official 573:ad23fe03a082 908 if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX)
mbed_official 573:ad23fe03a082 909 {
mbed_official 573:ad23fe03a082 910 /* Clear the Overrun Flag by a read operation to the SPI_DR register followed by a read
mbed_official 573:ad23fe03a082 911 access to the SPI_SR register. */
mbed_official 573:ad23fe03a082 912 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
mbed_official 573:ad23fe03a082 913 }
mbed_official 573:ad23fe03a082 914
mbed_official 573:ad23fe03a082 915 /* Enable the Rx DMA Channel */
mbed_official 573:ad23fe03a082 916 tmp = (uint32_t*)&pData;
mbed_official 573:ad23fe03a082 917 HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&hi2s->Instance->DR, *(uint32_t*)tmp, hi2s->RxXferSize);
mbed_official 573:ad23fe03a082 918
mbed_official 573:ad23fe03a082 919 /* Check if the I2S is already enabled */
mbed_official 573:ad23fe03a082 920 if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
mbed_official 573:ad23fe03a082 921 {
mbed_official 573:ad23fe03a082 922 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 923 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 924 }
mbed_official 573:ad23fe03a082 925
mbed_official 573:ad23fe03a082 926 /* Enable Rx DMA Request */
mbed_official 573:ad23fe03a082 927 hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN;
mbed_official 573:ad23fe03a082 928
mbed_official 573:ad23fe03a082 929 /* Process Unlocked */
mbed_official 573:ad23fe03a082 930 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 931
mbed_official 573:ad23fe03a082 932 return HAL_OK;
mbed_official 573:ad23fe03a082 933 }
mbed_official 573:ad23fe03a082 934 else
mbed_official 573:ad23fe03a082 935 {
mbed_official 573:ad23fe03a082 936 return HAL_BUSY;
mbed_official 573:ad23fe03a082 937 }
mbed_official 573:ad23fe03a082 938 }
mbed_official 573:ad23fe03a082 939
mbed_official 573:ad23fe03a082 940 /**
mbed_official 573:ad23fe03a082 941 * @brief Pauses the audio stream playing from the Media.
mbed_official 573:ad23fe03a082 942 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 943 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 944 * @retval HAL status
mbed_official 573:ad23fe03a082 945 */
mbed_official 573:ad23fe03a082 946 HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 947 {
mbed_official 573:ad23fe03a082 948 /* Process Locked */
mbed_official 573:ad23fe03a082 949 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 950
mbed_official 573:ad23fe03a082 951 if(hi2s->State == HAL_I2S_STATE_BUSY_TX)
mbed_official 573:ad23fe03a082 952 {
mbed_official 573:ad23fe03a082 953 /* Disable the I2S DMA Tx request */
mbed_official 573:ad23fe03a082 954 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 573:ad23fe03a082 955 }
mbed_official 573:ad23fe03a082 956 else if(hi2s->State == HAL_I2S_STATE_BUSY_RX)
mbed_official 573:ad23fe03a082 957 {
mbed_official 573:ad23fe03a082 958 /* Disable the I2S DMA Rx request */
mbed_official 573:ad23fe03a082 959 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 573:ad23fe03a082 960 }
mbed_official 573:ad23fe03a082 961 else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX)
mbed_official 573:ad23fe03a082 962 {
mbed_official 573:ad23fe03a082 963 if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX))
mbed_official 573:ad23fe03a082 964 {
mbed_official 573:ad23fe03a082 965 /* Disable the I2S DMA Tx request */
mbed_official 573:ad23fe03a082 966 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 573:ad23fe03a082 967 }
mbed_official 573:ad23fe03a082 968 else
mbed_official 573:ad23fe03a082 969 {
mbed_official 573:ad23fe03a082 970 /* Disable the I2S DMA Rx request */
mbed_official 573:ad23fe03a082 971 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 573:ad23fe03a082 972 }
mbed_official 573:ad23fe03a082 973 }
mbed_official 573:ad23fe03a082 974
mbed_official 573:ad23fe03a082 975 /* Process Unlocked */
mbed_official 573:ad23fe03a082 976 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 977
mbed_official 573:ad23fe03a082 978 return HAL_OK;
mbed_official 573:ad23fe03a082 979 }
mbed_official 573:ad23fe03a082 980
mbed_official 573:ad23fe03a082 981 /**
mbed_official 573:ad23fe03a082 982 * @brief Resumes the audio stream playing from the Media.
mbed_official 573:ad23fe03a082 983 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 984 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 985 * @retval HAL status
mbed_official 573:ad23fe03a082 986 */
mbed_official 573:ad23fe03a082 987 HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 988 {
mbed_official 573:ad23fe03a082 989 /* Process Locked */
mbed_official 573:ad23fe03a082 990 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 991
mbed_official 573:ad23fe03a082 992 if(hi2s->State == HAL_I2S_STATE_BUSY_TX)
mbed_official 573:ad23fe03a082 993 {
mbed_official 573:ad23fe03a082 994 /* Enable the I2S DMA Tx request */
mbed_official 573:ad23fe03a082 995 SET_BIT(hi2s->Instance->CR2, SPI_CR2_TXDMAEN);
mbed_official 573:ad23fe03a082 996 }
mbed_official 573:ad23fe03a082 997 else if(hi2s->State == HAL_I2S_STATE_BUSY_RX)
mbed_official 573:ad23fe03a082 998 {
mbed_official 573:ad23fe03a082 999 /* Enable the I2S DMA Rx request */
mbed_official 573:ad23fe03a082 1000 SET_BIT(hi2s->Instance->CR2, SPI_CR2_RXDMAEN);
mbed_official 573:ad23fe03a082 1001 }
mbed_official 573:ad23fe03a082 1002
mbed_official 573:ad23fe03a082 1003 /* If the I2S peripheral is still not enabled, enable it */
mbed_official 573:ad23fe03a082 1004 if(HAL_IS_BIT_CLR(hi2s->Instance->I2SCFGR, SPI_I2SCFGR_I2SE))
mbed_official 573:ad23fe03a082 1005 {
mbed_official 573:ad23fe03a082 1006 /* Enable I2S peripheral */
mbed_official 573:ad23fe03a082 1007 __HAL_I2S_ENABLE(hi2s);
mbed_official 573:ad23fe03a082 1008 }
mbed_official 573:ad23fe03a082 1009
mbed_official 573:ad23fe03a082 1010 /* Process Unlocked */
mbed_official 573:ad23fe03a082 1011 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 1012
mbed_official 573:ad23fe03a082 1013 return HAL_OK;
mbed_official 573:ad23fe03a082 1014 }
mbed_official 573:ad23fe03a082 1015
mbed_official 573:ad23fe03a082 1016 /**
mbed_official 573:ad23fe03a082 1017 * @brief Stops the audio stream playing from the Media.
mbed_official 573:ad23fe03a082 1018 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1019 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1020 * @retval HAL status
mbed_official 573:ad23fe03a082 1021 */
mbed_official 573:ad23fe03a082 1022 HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1023 {
mbed_official 573:ad23fe03a082 1024 /* Process Locked */
mbed_official 573:ad23fe03a082 1025 __HAL_LOCK(hi2s);
mbed_official 573:ad23fe03a082 1026
mbed_official 573:ad23fe03a082 1027 /* Disable the I2S Tx/Rx DMA requests */
mbed_official 573:ad23fe03a082 1028 CLEAR_BIT(hi2s->Instance->CR2, SPI_CR2_TXDMAEN);
mbed_official 573:ad23fe03a082 1029 CLEAR_BIT(hi2s->Instance->CR2, SPI_CR2_RXDMAEN);
mbed_official 573:ad23fe03a082 1030
mbed_official 573:ad23fe03a082 1031 /* Abort the I2S DMA Channel tx */
mbed_official 573:ad23fe03a082 1032 if(hi2s->hdmatx != NULL)
mbed_official 573:ad23fe03a082 1033 {
mbed_official 573:ad23fe03a082 1034 /* Disable the I2S DMA channel */
mbed_official 573:ad23fe03a082 1035 __HAL_DMA_DISABLE(hi2s->hdmatx);
mbed_official 573:ad23fe03a082 1036 HAL_DMA_Abort(hi2s->hdmatx);
mbed_official 573:ad23fe03a082 1037 }
mbed_official 573:ad23fe03a082 1038 /* Abort the I2S DMA Channel rx */
mbed_official 573:ad23fe03a082 1039 if(hi2s->hdmarx != NULL)
mbed_official 573:ad23fe03a082 1040 {
mbed_official 573:ad23fe03a082 1041 /* Disable the I2S DMA channel */
mbed_official 573:ad23fe03a082 1042 __HAL_DMA_DISABLE(hi2s->hdmarx);
mbed_official 573:ad23fe03a082 1043 HAL_DMA_Abort(hi2s->hdmarx);
mbed_official 573:ad23fe03a082 1044 }
mbed_official 573:ad23fe03a082 1045
mbed_official 573:ad23fe03a082 1046 /* Disable I2S peripheral */
mbed_official 573:ad23fe03a082 1047 __HAL_I2S_DISABLE(hi2s);
mbed_official 573:ad23fe03a082 1048
mbed_official 573:ad23fe03a082 1049 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1050
mbed_official 573:ad23fe03a082 1051 /* Process Unlocked */
mbed_official 573:ad23fe03a082 1052 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 1053
mbed_official 573:ad23fe03a082 1054 return HAL_OK;
mbed_official 573:ad23fe03a082 1055 }
mbed_official 573:ad23fe03a082 1056
mbed_official 573:ad23fe03a082 1057 /**
mbed_official 573:ad23fe03a082 1058 * @brief This function handles I2S interrupt request.
mbed_official 573:ad23fe03a082 1059 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1060 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1061 * @retval HAL status
mbed_official 573:ad23fe03a082 1062 */
mbed_official 573:ad23fe03a082 1063 void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1064 {
mbed_official 573:ad23fe03a082 1065 __IO uint32_t i2ssr = hi2s->Instance->SR;
mbed_official 573:ad23fe03a082 1066
mbed_official 573:ad23fe03a082 1067 if(hi2s->State == HAL_I2S_STATE_BUSY_RX)
mbed_official 573:ad23fe03a082 1068 {
mbed_official 573:ad23fe03a082 1069 /* I2S in mode Receiver ----------------------------------------------------*/
mbed_official 573:ad23fe03a082 1070 if(((i2ssr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE) != RESET))
mbed_official 573:ad23fe03a082 1071 {
mbed_official 573:ad23fe03a082 1072 I2S_Receive_IT(hi2s);
mbed_official 573:ad23fe03a082 1073 }
mbed_official 573:ad23fe03a082 1074
mbed_official 573:ad23fe03a082 1075 /* I2S Overrun error interrupt occurred -------------------------------------*/
mbed_official 573:ad23fe03a082 1076 if(((i2ssr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET))
mbed_official 573:ad23fe03a082 1077 {
mbed_official 573:ad23fe03a082 1078 /* Disable RXNE and ERR interrupt */
mbed_official 573:ad23fe03a082 1079 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 1080
mbed_official 573:ad23fe03a082 1081 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 1082 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1083
mbed_official 573:ad23fe03a082 1084 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 1085 hi2s->ErrorCode |= HAL_I2S_ERROR_OVR;
mbed_official 573:ad23fe03a082 1086 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 1087 }
mbed_official 573:ad23fe03a082 1088 }
mbed_official 573:ad23fe03a082 1089 else if(hi2s->State == HAL_I2S_STATE_BUSY_TX)
mbed_official 573:ad23fe03a082 1090 {
mbed_official 573:ad23fe03a082 1091 /* I2S in mode Transmitter ---------------------------------------------------*/
mbed_official 573:ad23fe03a082 1092 if(((i2ssr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE) != RESET))
mbed_official 573:ad23fe03a082 1093 {
mbed_official 573:ad23fe03a082 1094 I2S_Transmit_IT(hi2s);
mbed_official 573:ad23fe03a082 1095 }
mbed_official 573:ad23fe03a082 1096
mbed_official 573:ad23fe03a082 1097 /* I2S Underrun error interrupt occurred ------------------------------------*/
mbed_official 573:ad23fe03a082 1098 if(((i2ssr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET))
mbed_official 573:ad23fe03a082 1099 {
mbed_official 573:ad23fe03a082 1100 /* Disable TXE and ERR interrupt */
mbed_official 573:ad23fe03a082 1101 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 1102
mbed_official 573:ad23fe03a082 1103 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 1104 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1105
mbed_official 573:ad23fe03a082 1106 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 1107 hi2s->ErrorCode |= HAL_I2S_ERROR_UDR;
mbed_official 573:ad23fe03a082 1108 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 1109 }
mbed_official 573:ad23fe03a082 1110 }
mbed_official 573:ad23fe03a082 1111 }
mbed_official 573:ad23fe03a082 1112
mbed_official 573:ad23fe03a082 1113 /**
mbed_official 573:ad23fe03a082 1114 * @}
mbed_official 573:ad23fe03a082 1115 */
mbed_official 573:ad23fe03a082 1116
mbed_official 573:ad23fe03a082 1117 /**
mbed_official 573:ad23fe03a082 1118 * @}
mbed_official 573:ad23fe03a082 1119 */
mbed_official 573:ad23fe03a082 1120
mbed_official 573:ad23fe03a082 1121 /** @addtogroup I2S_Private_Functions I2S Private Functions
mbed_official 573:ad23fe03a082 1122 * @{
mbed_official 573:ad23fe03a082 1123 */
mbed_official 573:ad23fe03a082 1124 /**
mbed_official 573:ad23fe03a082 1125 * @brief This function handles I2S Communication Timeout.
mbed_official 573:ad23fe03a082 1126 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1127 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1128 * @param Flag: Flag checked
mbed_official 573:ad23fe03a082 1129 * @param State: Value of the flag expected
mbed_official 573:ad23fe03a082 1130 * @param Timeout: Duration of the timeout
mbed_official 573:ad23fe03a082 1131 * @retval HAL status
mbed_official 573:ad23fe03a082 1132 */
mbed_official 573:ad23fe03a082 1133 static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag,
mbed_official 573:ad23fe03a082 1134 uint32_t State, uint32_t Timeout)
mbed_official 573:ad23fe03a082 1135 {
mbed_official 573:ad23fe03a082 1136 uint32_t tickstart = 0;
mbed_official 573:ad23fe03a082 1137
mbed_official 573:ad23fe03a082 1138 /* Get tick */
mbed_official 573:ad23fe03a082 1139 tickstart = HAL_GetTick();
mbed_official 573:ad23fe03a082 1140
mbed_official 573:ad23fe03a082 1141 /* Wait until flag is set */
mbed_official 573:ad23fe03a082 1142 if(State == RESET)
mbed_official 573:ad23fe03a082 1143 {
mbed_official 573:ad23fe03a082 1144 while(__HAL_I2S_GET_FLAG(hi2s, Flag) == RESET)
mbed_official 573:ad23fe03a082 1145 {
mbed_official 573:ad23fe03a082 1146 if(Timeout != HAL_MAX_DELAY)
mbed_official 573:ad23fe03a082 1147 {
mbed_official 573:ad23fe03a082 1148 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 573:ad23fe03a082 1149 {
mbed_official 573:ad23fe03a082 1150 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 1151 hi2s->State= HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1152
mbed_official 573:ad23fe03a082 1153 /* Process Unlocked */
mbed_official 573:ad23fe03a082 1154 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 1155
mbed_official 573:ad23fe03a082 1156 return HAL_TIMEOUT;
mbed_official 573:ad23fe03a082 1157 }
mbed_official 573:ad23fe03a082 1158 }
mbed_official 573:ad23fe03a082 1159 }
mbed_official 573:ad23fe03a082 1160 }
mbed_official 573:ad23fe03a082 1161 else
mbed_official 573:ad23fe03a082 1162 {
mbed_official 573:ad23fe03a082 1163 while(__HAL_I2S_GET_FLAG(hi2s, Flag) != RESET)
mbed_official 573:ad23fe03a082 1164 {
mbed_official 573:ad23fe03a082 1165 if(Timeout != HAL_MAX_DELAY)
mbed_official 573:ad23fe03a082 1166 {
mbed_official 573:ad23fe03a082 1167 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 573:ad23fe03a082 1168 {
mbed_official 573:ad23fe03a082 1169 /* Set the I2S State ready */
mbed_official 573:ad23fe03a082 1170 hi2s->State= HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1171
mbed_official 573:ad23fe03a082 1172 /* Process Unlocked */
mbed_official 573:ad23fe03a082 1173 __HAL_UNLOCK(hi2s);
mbed_official 573:ad23fe03a082 1174
mbed_official 573:ad23fe03a082 1175 return HAL_TIMEOUT;
mbed_official 573:ad23fe03a082 1176 }
mbed_official 573:ad23fe03a082 1177 }
mbed_official 573:ad23fe03a082 1178 }
mbed_official 573:ad23fe03a082 1179 }
mbed_official 573:ad23fe03a082 1180 return HAL_OK;
mbed_official 573:ad23fe03a082 1181 }
mbed_official 573:ad23fe03a082 1182 /**
mbed_official 573:ad23fe03a082 1183 * @}
mbed_official 573:ad23fe03a082 1184 */
mbed_official 573:ad23fe03a082 1185
mbed_official 573:ad23fe03a082 1186 /** @addtogroup I2S_Exported_Functions I2S Exported Functions
mbed_official 573:ad23fe03a082 1187 * @{
mbed_official 573:ad23fe03a082 1188 */
mbed_official 573:ad23fe03a082 1189
mbed_official 573:ad23fe03a082 1190 /** @addtogroup I2S_Exported_Functions_Group2 Input and Output operation functions
mbed_official 573:ad23fe03a082 1191 * @{
mbed_official 573:ad23fe03a082 1192 */
mbed_official 573:ad23fe03a082 1193 /**
mbed_official 573:ad23fe03a082 1194 * @brief Tx Transfer Half completed callbacks
mbed_official 573:ad23fe03a082 1195 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1196 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1197 * @retval None
mbed_official 573:ad23fe03a082 1198 */
mbed_official 573:ad23fe03a082 1199 __weak void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1200 {
mbed_official 573:ad23fe03a082 1201 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 1202 the HAL_I2S_TxHalfCpltCallback could be implemented in the user file
mbed_official 573:ad23fe03a082 1203 */
mbed_official 573:ad23fe03a082 1204 }
mbed_official 573:ad23fe03a082 1205
mbed_official 573:ad23fe03a082 1206 /**
mbed_official 573:ad23fe03a082 1207 * @brief Tx Transfer completed callbacks
mbed_official 573:ad23fe03a082 1208 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1209 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1210 * @retval None
mbed_official 573:ad23fe03a082 1211 */
mbed_official 573:ad23fe03a082 1212 __weak void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1213 {
mbed_official 573:ad23fe03a082 1214 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 1215 the HAL_I2S_TxCpltCallback could be implemented in the user file
mbed_official 573:ad23fe03a082 1216 */
mbed_official 573:ad23fe03a082 1217 }
mbed_official 573:ad23fe03a082 1218
mbed_official 573:ad23fe03a082 1219 /**
mbed_official 573:ad23fe03a082 1220 * @brief Rx Transfer half completed callbacks
mbed_official 573:ad23fe03a082 1221 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1222 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1223 * @retval None
mbed_official 573:ad23fe03a082 1224 */
mbed_official 573:ad23fe03a082 1225 __weak void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1226 {
mbed_official 573:ad23fe03a082 1227 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 1228 the HAL_I2S_RxCpltCallback could be implemented in the user file
mbed_official 573:ad23fe03a082 1229 */
mbed_official 573:ad23fe03a082 1230 }
mbed_official 573:ad23fe03a082 1231
mbed_official 573:ad23fe03a082 1232 /**
mbed_official 573:ad23fe03a082 1233 * @brief Rx Transfer completed callbacks
mbed_official 573:ad23fe03a082 1234 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1235 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1236 * @retval None
mbed_official 573:ad23fe03a082 1237 */
mbed_official 573:ad23fe03a082 1238 __weak void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1239 {
mbed_official 573:ad23fe03a082 1240 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 1241 the HAL_I2S_RxCpltCallback could be implemented in the user file
mbed_official 573:ad23fe03a082 1242 */
mbed_official 573:ad23fe03a082 1243 }
mbed_official 573:ad23fe03a082 1244
mbed_official 573:ad23fe03a082 1245 /**
mbed_official 573:ad23fe03a082 1246 * @brief I2S error callbacks
mbed_official 573:ad23fe03a082 1247 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1248 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1249 * @retval None
mbed_official 573:ad23fe03a082 1250 */
mbed_official 573:ad23fe03a082 1251 __weak void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1252 {
mbed_official 573:ad23fe03a082 1253 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 1254 the HAL_I2S_ErrorCallback could be implemented in the user file
mbed_official 573:ad23fe03a082 1255 */
mbed_official 573:ad23fe03a082 1256 }
mbed_official 573:ad23fe03a082 1257
mbed_official 573:ad23fe03a082 1258 /**
mbed_official 573:ad23fe03a082 1259 * @}
mbed_official 573:ad23fe03a082 1260 */
mbed_official 573:ad23fe03a082 1261
mbed_official 573:ad23fe03a082 1262 /** @defgroup I2S_Exported_Functions_Group3 Peripheral State and Errors functions
mbed_official 573:ad23fe03a082 1263 * @brief Peripheral State functions
mbed_official 573:ad23fe03a082 1264 *
mbed_official 573:ad23fe03a082 1265 @verbatim
mbed_official 573:ad23fe03a082 1266 ===============================================================================
mbed_official 573:ad23fe03a082 1267 ##### Peripheral State and Errors functions #####
mbed_official 573:ad23fe03a082 1268 ===============================================================================
mbed_official 573:ad23fe03a082 1269 [..]
mbed_official 573:ad23fe03a082 1270 This subsection permits to get in run-time the status of the peripheral
mbed_official 573:ad23fe03a082 1271 and the data flow.
mbed_official 573:ad23fe03a082 1272
mbed_official 573:ad23fe03a082 1273 @endverbatim
mbed_official 573:ad23fe03a082 1274 * @{
mbed_official 573:ad23fe03a082 1275 */
mbed_official 573:ad23fe03a082 1276
mbed_official 573:ad23fe03a082 1277 /**
mbed_official 573:ad23fe03a082 1278 * @brief Return the I2S state
mbed_official 573:ad23fe03a082 1279 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1280 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1281 * @retval HAL state
mbed_official 573:ad23fe03a082 1282 */
mbed_official 573:ad23fe03a082 1283 HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1284 {
mbed_official 573:ad23fe03a082 1285 return hi2s->State;
mbed_official 573:ad23fe03a082 1286 }
mbed_official 573:ad23fe03a082 1287
mbed_official 573:ad23fe03a082 1288 /**
mbed_official 573:ad23fe03a082 1289 * @brief Return the I2S error code
mbed_official 573:ad23fe03a082 1290 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1291 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1292 * @retval I2S Error Code
mbed_official 573:ad23fe03a082 1293 */
mbed_official 573:ad23fe03a082 1294 uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1295 {
mbed_official 573:ad23fe03a082 1296 return hi2s->ErrorCode;
mbed_official 573:ad23fe03a082 1297 }
mbed_official 573:ad23fe03a082 1298 /**
mbed_official 573:ad23fe03a082 1299 * @}
mbed_official 573:ad23fe03a082 1300 */
mbed_official 573:ad23fe03a082 1301
mbed_official 573:ad23fe03a082 1302 /**
mbed_official 573:ad23fe03a082 1303 * @}
mbed_official 573:ad23fe03a082 1304 */
mbed_official 573:ad23fe03a082 1305
mbed_official 573:ad23fe03a082 1306 /**
mbed_official 573:ad23fe03a082 1307 * @brief Get I2S Input Clock based on I2S source clock selection
mbed_official 573:ad23fe03a082 1308 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1309 * the configuration information for I2S module.
mbed_official 573:ad23fe03a082 1310 * @retval I2S Clock Input
mbed_official 573:ad23fe03a082 1311 */
mbed_official 573:ad23fe03a082 1312 static uint32_t I2S_GetClockFreq(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1313 {
mbed_official 573:ad23fe03a082 1314 uint32_t tmpreg = 0;
mbed_official 573:ad23fe03a082 1315 /* This variable used to store the VCO Input (value in Hz) */
mbed_official 573:ad23fe03a082 1316 uint32_t vcoinput = 0;
mbed_official 573:ad23fe03a082 1317 /* This variable used to store the I2S_CK_x (value in Hz) */
mbed_official 573:ad23fe03a082 1318 uint32_t i2sclocksource = 0;
mbed_official 573:ad23fe03a082 1319
mbed_official 573:ad23fe03a082 1320 /* Configure I2S Clock based on I2S source clock selection */
mbed_official 573:ad23fe03a082 1321
mbed_official 573:ad23fe03a082 1322 /* I2S_CLK_x : I2S Block Clock configuration for different clock sources selected */
mbed_official 573:ad23fe03a082 1323 switch(hi2s->Init.ClockSource)
mbed_official 573:ad23fe03a082 1324 {
mbed_official 573:ad23fe03a082 1325 case I2S_CLOCK_SYSCLK :
mbed_official 573:ad23fe03a082 1326 {
mbed_official 573:ad23fe03a082 1327 /* Configure the PLLI2S division factor */
mbed_official 573:ad23fe03a082 1328 /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */
mbed_official 573:ad23fe03a082 1329 if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
mbed_official 573:ad23fe03a082 1330 {
mbed_official 573:ad23fe03a082 1331 /* In Case the PLL Source is HSI (Internal Clock) */
mbed_official 573:ad23fe03a082 1332 vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
mbed_official 573:ad23fe03a082 1333 }
mbed_official 573:ad23fe03a082 1334 else
mbed_official 573:ad23fe03a082 1335 {
mbed_official 573:ad23fe03a082 1336 /* In Case the PLL Source is HSE (External Clock) */
mbed_official 573:ad23fe03a082 1337 vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
mbed_official 573:ad23fe03a082 1338 }
mbed_official 573:ad23fe03a082 1339
mbed_official 573:ad23fe03a082 1340 /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
mbed_official 573:ad23fe03a082 1341 /* I2S_CLK(first level) = PLLI2S_VCO Output/PLLI2SR */
mbed_official 573:ad23fe03a082 1342 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28;
mbed_official 573:ad23fe03a082 1343 i2sclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg);
mbed_official 573:ad23fe03a082 1344
mbed_official 573:ad23fe03a082 1345 break;
mbed_official 573:ad23fe03a082 1346 }
mbed_official 573:ad23fe03a082 1347 case I2S_CLOCK_EXTERNAL :
mbed_official 573:ad23fe03a082 1348 {
mbed_official 573:ad23fe03a082 1349 i2sclocksource = EXTERNAL_CLOCK_VALUE;
mbed_official 573:ad23fe03a082 1350 break;
mbed_official 573:ad23fe03a082 1351 }
mbed_official 573:ad23fe03a082 1352 default :
mbed_official 573:ad23fe03a082 1353 {
mbed_official 573:ad23fe03a082 1354 break;
mbed_official 573:ad23fe03a082 1355 }
mbed_official 573:ad23fe03a082 1356 }
mbed_official 573:ad23fe03a082 1357
mbed_official 573:ad23fe03a082 1358 /* the return result is the value of I2S clock */
mbed_official 573:ad23fe03a082 1359 return i2sclocksource;
mbed_official 573:ad23fe03a082 1360 }
mbed_official 573:ad23fe03a082 1361
mbed_official 573:ad23fe03a082 1362 /** @addtogroup I2S_Private_Functions I2S Private Functions
mbed_official 573:ad23fe03a082 1363 * @{
mbed_official 573:ad23fe03a082 1364 */
mbed_official 573:ad23fe03a082 1365 /**
mbed_official 573:ad23fe03a082 1366 * @brief DMA I2S transmit process complete callback
mbed_official 573:ad23fe03a082 1367 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1368 * the configuration information for the specified DMA module.
mbed_official 573:ad23fe03a082 1369 * @retval None
mbed_official 573:ad23fe03a082 1370 */
mbed_official 573:ad23fe03a082 1371 static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma)
mbed_official 573:ad23fe03a082 1372 {
mbed_official 573:ad23fe03a082 1373 I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 573:ad23fe03a082 1374
mbed_official 573:ad23fe03a082 1375 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 573:ad23fe03a082 1376 {
mbed_official 573:ad23fe03a082 1377 hi2s->TxXferCount = 0;
mbed_official 573:ad23fe03a082 1378
mbed_official 573:ad23fe03a082 1379 /* Disable Tx DMA Request */
mbed_official 573:ad23fe03a082 1380 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN);
mbed_official 573:ad23fe03a082 1381
mbed_official 573:ad23fe03a082 1382 if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX)
mbed_official 573:ad23fe03a082 1383 {
mbed_official 573:ad23fe03a082 1384 if(hi2s->RxXferCount == 0)
mbed_official 573:ad23fe03a082 1385 {
mbed_official 573:ad23fe03a082 1386 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1387 }
mbed_official 573:ad23fe03a082 1388 }
mbed_official 573:ad23fe03a082 1389 else
mbed_official 573:ad23fe03a082 1390 {
mbed_official 573:ad23fe03a082 1391 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1392 }
mbed_official 573:ad23fe03a082 1393 }
mbed_official 573:ad23fe03a082 1394 HAL_I2S_TxCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1395 }
mbed_official 573:ad23fe03a082 1396
mbed_official 573:ad23fe03a082 1397 /**
mbed_official 573:ad23fe03a082 1398 * @brief DMA I2S transmit process half complete callback
mbed_official 573:ad23fe03a082 1399 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1400 * the configuration information for the specified DMA module.
mbed_official 573:ad23fe03a082 1401 * @retval None
mbed_official 573:ad23fe03a082 1402 */
mbed_official 573:ad23fe03a082 1403 static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 573:ad23fe03a082 1404 {
mbed_official 573:ad23fe03a082 1405 I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 573:ad23fe03a082 1406
mbed_official 573:ad23fe03a082 1407 HAL_I2S_TxHalfCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1408 }
mbed_official 573:ad23fe03a082 1409
mbed_official 573:ad23fe03a082 1410 /**
mbed_official 573:ad23fe03a082 1411 * @brief DMA I2S receive process complete callback
mbed_official 573:ad23fe03a082 1412 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1413 * the configuration information for the specified DMA module.
mbed_official 573:ad23fe03a082 1414 * @retval None
mbed_official 573:ad23fe03a082 1415 */
mbed_official 573:ad23fe03a082 1416 static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma)
mbed_official 573:ad23fe03a082 1417 {
mbed_official 573:ad23fe03a082 1418 I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 573:ad23fe03a082 1419
mbed_official 573:ad23fe03a082 1420 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 573:ad23fe03a082 1421 {
mbed_official 573:ad23fe03a082 1422 /* Disable Rx DMA Request */
mbed_official 573:ad23fe03a082 1423 hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN);
mbed_official 573:ad23fe03a082 1424
mbed_official 573:ad23fe03a082 1425 hi2s->RxXferCount = 0;
mbed_official 573:ad23fe03a082 1426 if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX)
mbed_official 573:ad23fe03a082 1427 {
mbed_official 573:ad23fe03a082 1428 if(hi2s->TxXferCount == 0)
mbed_official 573:ad23fe03a082 1429 {
mbed_official 573:ad23fe03a082 1430 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1431 }
mbed_official 573:ad23fe03a082 1432 }
mbed_official 573:ad23fe03a082 1433 else
mbed_official 573:ad23fe03a082 1434 {
mbed_official 573:ad23fe03a082 1435 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1436 }
mbed_official 573:ad23fe03a082 1437 }
mbed_official 573:ad23fe03a082 1438 HAL_I2S_RxCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1439 }
mbed_official 573:ad23fe03a082 1440
mbed_official 573:ad23fe03a082 1441 /**
mbed_official 573:ad23fe03a082 1442 * @brief DMA I2S receive process half complete callback
mbed_official 573:ad23fe03a082 1443 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1444 * the configuration information for the specified DMA module.
mbed_official 573:ad23fe03a082 1445 * @retval None
mbed_official 573:ad23fe03a082 1446 */
mbed_official 573:ad23fe03a082 1447 static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 573:ad23fe03a082 1448 {
mbed_official 573:ad23fe03a082 1449 I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 573:ad23fe03a082 1450
mbed_official 573:ad23fe03a082 1451 HAL_I2S_RxHalfCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1452 }
mbed_official 573:ad23fe03a082 1453
mbed_official 573:ad23fe03a082 1454 /**
mbed_official 573:ad23fe03a082 1455 * @brief DMA I2S communication error callback
mbed_official 573:ad23fe03a082 1456 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1457 * the configuration information for the specified DMA module.
mbed_official 573:ad23fe03a082 1458 * @retval None
mbed_official 573:ad23fe03a082 1459 */
mbed_official 573:ad23fe03a082 1460 static void I2S_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 573:ad23fe03a082 1461 {
mbed_official 573:ad23fe03a082 1462 I2S_HandleTypeDef* hi2s = ( I2S_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 573:ad23fe03a082 1463
mbed_official 573:ad23fe03a082 1464 /* Disable Rx and Tx DMA Request */
mbed_official 573:ad23fe03a082 1465 hi2s->Instance->CR2 &= (uint32_t)(~(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
mbed_official 573:ad23fe03a082 1466 hi2s->TxXferCount = 0;
mbed_official 573:ad23fe03a082 1467 hi2s->RxXferCount = 0;
mbed_official 573:ad23fe03a082 1468
mbed_official 573:ad23fe03a082 1469 hi2s->State= HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1470
mbed_official 573:ad23fe03a082 1471 /* Set the error code and execute error callback*/
mbed_official 573:ad23fe03a082 1472 hi2s->ErrorCode |= HAL_I2S_ERROR_DMA;
mbed_official 573:ad23fe03a082 1473 HAL_I2S_ErrorCallback(hi2s);
mbed_official 573:ad23fe03a082 1474 }
mbed_official 573:ad23fe03a082 1475
mbed_official 573:ad23fe03a082 1476 /**
mbed_official 573:ad23fe03a082 1477 * @brief Transmit an amount of data in non-blocking mode with Interrupt
mbed_official 573:ad23fe03a082 1478 * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains
mbed_official 573:ad23fe03a082 1479 * the configuration information for I2S module
mbed_official 573:ad23fe03a082 1480 * @retval None
mbed_official 573:ad23fe03a082 1481 */
mbed_official 573:ad23fe03a082 1482 static void I2S_Transmit_IT(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1483 {
mbed_official 573:ad23fe03a082 1484 /* Transmit data */
mbed_official 573:ad23fe03a082 1485 hi2s->Instance->DR = (*hi2s->pTxBuffPtr++);
mbed_official 573:ad23fe03a082 1486 hi2s->TxXferCount--;
mbed_official 573:ad23fe03a082 1487
mbed_official 573:ad23fe03a082 1488 if(hi2s->TxXferCount == 0)
mbed_official 573:ad23fe03a082 1489 {
mbed_official 573:ad23fe03a082 1490 /* Disable TXE and ERR interrupt */
mbed_official 573:ad23fe03a082 1491 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 1492
mbed_official 573:ad23fe03a082 1493 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1494 HAL_I2S_TxCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1495 }
mbed_official 573:ad23fe03a082 1496 }
mbed_official 573:ad23fe03a082 1497
mbed_official 573:ad23fe03a082 1498 /**
mbed_official 573:ad23fe03a082 1499 * @brief Receive an amount of data in non-blocking mode with Interrupt
mbed_official 573:ad23fe03a082 1500 * @param hi2s: I2S handle
mbed_official 573:ad23fe03a082 1501 * @retval None
mbed_official 573:ad23fe03a082 1502 */
mbed_official 573:ad23fe03a082 1503 static void I2S_Receive_IT(I2S_HandleTypeDef *hi2s)
mbed_official 573:ad23fe03a082 1504 {
mbed_official 573:ad23fe03a082 1505 /* Receive data */
mbed_official 573:ad23fe03a082 1506 (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR;
mbed_official 573:ad23fe03a082 1507 hi2s->RxXferCount--;
mbed_official 573:ad23fe03a082 1508
mbed_official 573:ad23fe03a082 1509 if(hi2s->RxXferCount == 0)
mbed_official 573:ad23fe03a082 1510 {
mbed_official 573:ad23fe03a082 1511 /* Disable RXNE and ERR interrupt */
mbed_official 573:ad23fe03a082 1512 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
mbed_official 573:ad23fe03a082 1513
mbed_official 573:ad23fe03a082 1514 hi2s->State = HAL_I2S_STATE_READY;
mbed_official 573:ad23fe03a082 1515 HAL_I2S_RxCpltCallback(hi2s);
mbed_official 573:ad23fe03a082 1516 }
mbed_official 573:ad23fe03a082 1517 }
mbed_official 573:ad23fe03a082 1518 /**
mbed_official 573:ad23fe03a082 1519 * @}
mbed_official 573:ad23fe03a082 1520 */
mbed_official 573:ad23fe03a082 1521
mbed_official 573:ad23fe03a082 1522 #endif /* HAL_I2S_MODULE_ENABLED */
mbed_official 573:ad23fe03a082 1523 /**
mbed_official 573:ad23fe03a082 1524 * @}
mbed_official 573:ad23fe03a082 1525 */
mbed_official 573:ad23fe03a082 1526
mbed_official 573:ad23fe03a082 1527 /**
mbed_official 573:ad23fe03a082 1528 * @}
mbed_official 573:ad23fe03a082 1529 */
mbed_official 573:ad23fe03a082 1530
mbed_official 573:ad23fe03a082 1531 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/