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

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 161:aa5281ff4a02 1 /*
AnnaBridge 170:e95d10626187 2 * The Clear BSD License
AnnaBridge 161:aa5281ff4a02 3 * Copyright (c) 2015, Freescale Semiconductor, Inc.
AnnaBridge 161:aa5281ff4a02 4 * Copyright 2016-2017 NXP
AnnaBridge 170:e95d10626187 5 * All rights reserved.
AnnaBridge 161:aa5281ff4a02 6 *
AnnaBridge 161:aa5281ff4a02 7 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 170:e95d10626187 8 * are permitted (subject to the limitations in the disclaimer below) provided
AnnaBridge 170:e95d10626187 9 * that the following conditions are met:
AnnaBridge 161:aa5281ff4a02 10 *
AnnaBridge 161:aa5281ff4a02 11 * o Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 161:aa5281ff4a02 12 * of conditions and the following disclaimer.
AnnaBridge 161:aa5281ff4a02 13 *
AnnaBridge 161:aa5281ff4a02 14 * o Redistributions in binary form must reproduce the above copyright notice, this
AnnaBridge 161:aa5281ff4a02 15 * list of conditions and the following disclaimer in the documentation and/or
AnnaBridge 161:aa5281ff4a02 16 * other materials provided with the distribution.
AnnaBridge 161:aa5281ff4a02 17 *
AnnaBridge 161:aa5281ff4a02 18 * o Neither the name of the copyright holder nor the names of its
AnnaBridge 161:aa5281ff4a02 19 * contributors may be used to endorse or promote products derived from this
AnnaBridge 161:aa5281ff4a02 20 * software without specific prior written permission.
AnnaBridge 161:aa5281ff4a02 21 *
AnnaBridge 170:e95d10626187 22 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
AnnaBridge 161:aa5281ff4a02 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 161:aa5281ff4a02 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 161:aa5281ff4a02 25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 161:aa5281ff4a02 26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 161:aa5281ff4a02 27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 161:aa5281ff4a02 28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 161:aa5281ff4a02 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 161:aa5281ff4a02 30 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 161:aa5281ff4a02 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 161:aa5281ff4a02 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 161:aa5281ff4a02 33 */
AnnaBridge 161:aa5281ff4a02 34
AnnaBridge 161:aa5281ff4a02 35 #ifndef _FSL_SAI_H_
AnnaBridge 161:aa5281ff4a02 36 #define _FSL_SAI_H_
AnnaBridge 161:aa5281ff4a02 37
AnnaBridge 161:aa5281ff4a02 38 #include "fsl_common.h"
AnnaBridge 161:aa5281ff4a02 39
AnnaBridge 161:aa5281ff4a02 40 /*!
AnnaBridge 161:aa5281ff4a02 41 * @addtogroup sai
AnnaBridge 161:aa5281ff4a02 42 * @{
AnnaBridge 161:aa5281ff4a02 43 */
AnnaBridge 161:aa5281ff4a02 44
AnnaBridge 161:aa5281ff4a02 45 /*******************************************************************************
AnnaBridge 161:aa5281ff4a02 46 * Definitions
AnnaBridge 161:aa5281ff4a02 47 ******************************************************************************/
AnnaBridge 161:aa5281ff4a02 48
AnnaBridge 161:aa5281ff4a02 49 /*! @name Driver version */
AnnaBridge 161:aa5281ff4a02 50 /*@{*/
AnnaBridge 170:e95d10626187 51 #define FSL_SAI_DRIVER_VERSION (MAKE_VERSION(2, 1, 4)) /*!< Version 2.1.4 */
AnnaBridge 161:aa5281ff4a02 52 /*@}*/
AnnaBridge 161:aa5281ff4a02 53
AnnaBridge 161:aa5281ff4a02 54 /*! @brief SAI return status*/
AnnaBridge 161:aa5281ff4a02 55 enum _sai_status_t
AnnaBridge 161:aa5281ff4a02 56 {
AnnaBridge 161:aa5281ff4a02 57 kStatus_SAI_TxBusy = MAKE_STATUS(kStatusGroup_SAI, 0), /*!< SAI Tx is busy. */
AnnaBridge 161:aa5281ff4a02 58 kStatus_SAI_RxBusy = MAKE_STATUS(kStatusGroup_SAI, 1), /*!< SAI Rx is busy. */
AnnaBridge 161:aa5281ff4a02 59 kStatus_SAI_TxError = MAKE_STATUS(kStatusGroup_SAI, 2), /*!< SAI Tx FIFO error. */
AnnaBridge 161:aa5281ff4a02 60 kStatus_SAI_RxError = MAKE_STATUS(kStatusGroup_SAI, 3), /*!< SAI Rx FIFO error. */
AnnaBridge 161:aa5281ff4a02 61 kStatus_SAI_QueueFull = MAKE_STATUS(kStatusGroup_SAI, 4), /*!< SAI transfer queue is full. */
AnnaBridge 161:aa5281ff4a02 62 kStatus_SAI_TxIdle = MAKE_STATUS(kStatusGroup_SAI, 5), /*!< SAI Tx is idle */
AnnaBridge 161:aa5281ff4a02 63 kStatus_SAI_RxIdle = MAKE_STATUS(kStatusGroup_SAI, 6) /*!< SAI Rx is idle */
AnnaBridge 161:aa5281ff4a02 64 };
AnnaBridge 161:aa5281ff4a02 65
AnnaBridge 161:aa5281ff4a02 66 /*! @brief Define the SAI bus type */
AnnaBridge 161:aa5281ff4a02 67 typedef enum _sai_protocol
AnnaBridge 161:aa5281ff4a02 68 {
AnnaBridge 161:aa5281ff4a02 69 kSAI_BusLeftJustified = 0x0U, /*!< Uses left justified format.*/
AnnaBridge 161:aa5281ff4a02 70 kSAI_BusRightJustified, /*!< Uses right justified format. */
AnnaBridge 161:aa5281ff4a02 71 kSAI_BusI2S, /*!< Uses I2S format. */
AnnaBridge 161:aa5281ff4a02 72 kSAI_BusPCMA, /*!< Uses I2S PCM A format.*/
AnnaBridge 161:aa5281ff4a02 73 kSAI_BusPCMB /*!< Uses I2S PCM B format. */
AnnaBridge 161:aa5281ff4a02 74 } sai_protocol_t;
AnnaBridge 161:aa5281ff4a02 75
AnnaBridge 161:aa5281ff4a02 76 /*! @brief Master or slave mode */
AnnaBridge 161:aa5281ff4a02 77 typedef enum _sai_master_slave
AnnaBridge 161:aa5281ff4a02 78 {
AnnaBridge 161:aa5281ff4a02 79 kSAI_Master = 0x0U, /*!< Master mode */
AnnaBridge 161:aa5281ff4a02 80 kSAI_Slave = 0x1U /*!< Slave mode */
AnnaBridge 161:aa5281ff4a02 81 } sai_master_slave_t;
AnnaBridge 161:aa5281ff4a02 82
AnnaBridge 161:aa5281ff4a02 83 /*! @brief Mono or stereo audio format */
AnnaBridge 161:aa5281ff4a02 84 typedef enum _sai_mono_stereo
AnnaBridge 161:aa5281ff4a02 85 {
AnnaBridge 161:aa5281ff4a02 86 kSAI_Stereo = 0x0U, /*!< Stereo sound. */
AnnaBridge 161:aa5281ff4a02 87 kSAI_MonoRight, /*!< Only Right channel have sound. */
AnnaBridge 161:aa5281ff4a02 88 kSAI_MonoLeft /*!< Only left channel have sound. */
AnnaBridge 161:aa5281ff4a02 89 } sai_mono_stereo_t;
AnnaBridge 161:aa5281ff4a02 90
AnnaBridge 170:e95d10626187 91 /*! @brief SAI data order, MSB or LSB */
AnnaBridge 170:e95d10626187 92 typedef enum _sai_data_order
AnnaBridge 170:e95d10626187 93 {
AnnaBridge 170:e95d10626187 94 kSAI_DataLSB = 0x0U, /*!< LSB bit transferred first */
AnnaBridge 170:e95d10626187 95 kSAI_DataMSB /*!< MSB bit transferred first */
AnnaBridge 170:e95d10626187 96 } sai_data_order_t;
AnnaBridge 170:e95d10626187 97
AnnaBridge 170:e95d10626187 98 /*! @brief SAI clock polarity, active high or low */
AnnaBridge 170:e95d10626187 99 typedef enum _sai_clock_polarity
AnnaBridge 170:e95d10626187 100 {
AnnaBridge 170:e95d10626187 101 kSAI_PolarityActiveHigh = 0x0U, /*!< Clock active high */
AnnaBridge 170:e95d10626187 102 kSAI_PolarityActiveLow /*!< Clock active low */
AnnaBridge 170:e95d10626187 103 } sai_clock_polarity_t;
AnnaBridge 170:e95d10626187 104
AnnaBridge 161:aa5281ff4a02 105 /*! @brief Synchronous or asynchronous mode */
AnnaBridge 161:aa5281ff4a02 106 typedef enum _sai_sync_mode
AnnaBridge 161:aa5281ff4a02 107 {
AnnaBridge 161:aa5281ff4a02 108 kSAI_ModeAsync = 0x0U, /*!< Asynchronous mode */
AnnaBridge 161:aa5281ff4a02 109 kSAI_ModeSync, /*!< Synchronous mode (with receiver or transmit) */
AnnaBridge 161:aa5281ff4a02 110 kSAI_ModeSyncWithOtherTx, /*!< Synchronous with another SAI transmit */
AnnaBridge 161:aa5281ff4a02 111 kSAI_ModeSyncWithOtherRx /*!< Synchronous with another SAI receiver */
AnnaBridge 161:aa5281ff4a02 112 } sai_sync_mode_t;
AnnaBridge 161:aa5281ff4a02 113
AnnaBridge 161:aa5281ff4a02 114 /*! @brief Mater clock source */
AnnaBridge 161:aa5281ff4a02 115 typedef enum _sai_mclk_source
AnnaBridge 161:aa5281ff4a02 116 {
AnnaBridge 161:aa5281ff4a02 117 kSAI_MclkSourceSysclk = 0x0U, /*!< Master clock from the system clock */
AnnaBridge 161:aa5281ff4a02 118 kSAI_MclkSourceSelect1, /*!< Master clock from source 1 */
AnnaBridge 161:aa5281ff4a02 119 kSAI_MclkSourceSelect2, /*!< Master clock from source 2 */
AnnaBridge 161:aa5281ff4a02 120 kSAI_MclkSourceSelect3 /*!< Master clock from source 3 */
AnnaBridge 161:aa5281ff4a02 121 } sai_mclk_source_t;
AnnaBridge 161:aa5281ff4a02 122
AnnaBridge 161:aa5281ff4a02 123 /*! @brief Bit clock source */
AnnaBridge 161:aa5281ff4a02 124 typedef enum _sai_bclk_source
AnnaBridge 161:aa5281ff4a02 125 {
AnnaBridge 161:aa5281ff4a02 126 kSAI_BclkSourceBusclk = 0x0U, /*!< Bit clock using bus clock */
AnnaBridge 161:aa5281ff4a02 127 kSAI_BclkSourceMclkDiv, /*!< Bit clock using master clock divider */
AnnaBridge 161:aa5281ff4a02 128 kSAI_BclkSourceOtherSai0, /*!< Bit clock from other SAI device */
AnnaBridge 161:aa5281ff4a02 129 kSAI_BclkSourceOtherSai1 /*!< Bit clock from other SAI device */
AnnaBridge 161:aa5281ff4a02 130 } sai_bclk_source_t;
AnnaBridge 161:aa5281ff4a02 131
AnnaBridge 161:aa5281ff4a02 132 /*! @brief The SAI interrupt enable flag */
AnnaBridge 161:aa5281ff4a02 133 enum _sai_interrupt_enable_t
AnnaBridge 161:aa5281ff4a02 134 {
AnnaBridge 161:aa5281ff4a02 135 kSAI_WordStartInterruptEnable =
AnnaBridge 161:aa5281ff4a02 136 I2S_TCSR_WSIE_MASK, /*!< Word start flag, means the first word in a frame detected */
AnnaBridge 161:aa5281ff4a02 137 kSAI_SyncErrorInterruptEnable = I2S_TCSR_SEIE_MASK, /*!< Sync error flag, means the sync error is detected */
AnnaBridge 161:aa5281ff4a02 138 kSAI_FIFOWarningInterruptEnable = I2S_TCSR_FWIE_MASK, /*!< FIFO warning flag, means the FIFO is empty */
AnnaBridge 161:aa5281ff4a02 139 kSAI_FIFOErrorInterruptEnable = I2S_TCSR_FEIE_MASK, /*!< FIFO error flag */
AnnaBridge 161:aa5281ff4a02 140 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
AnnaBridge 161:aa5281ff4a02 141 kSAI_FIFORequestInterruptEnable = I2S_TCSR_FRIE_MASK, /*!< FIFO request, means reached watermark */
AnnaBridge 161:aa5281ff4a02 142 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
AnnaBridge 161:aa5281ff4a02 143 };
AnnaBridge 161:aa5281ff4a02 144
AnnaBridge 161:aa5281ff4a02 145 /*! @brief The DMA request sources */
AnnaBridge 161:aa5281ff4a02 146 enum _sai_dma_enable_t
AnnaBridge 161:aa5281ff4a02 147 {
AnnaBridge 161:aa5281ff4a02 148 kSAI_FIFOWarningDMAEnable = I2S_TCSR_FWDE_MASK, /*!< FIFO warning caused by the DMA request */
AnnaBridge 161:aa5281ff4a02 149 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
AnnaBridge 161:aa5281ff4a02 150 kSAI_FIFORequestDMAEnable = I2S_TCSR_FRDE_MASK, /*!< FIFO request caused by the DMA request */
AnnaBridge 161:aa5281ff4a02 151 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
AnnaBridge 161:aa5281ff4a02 152 };
AnnaBridge 161:aa5281ff4a02 153
AnnaBridge 161:aa5281ff4a02 154 /*! @brief The SAI status flag */
AnnaBridge 161:aa5281ff4a02 155 enum _sai_flags
AnnaBridge 161:aa5281ff4a02 156 {
AnnaBridge 161:aa5281ff4a02 157 kSAI_WordStartFlag = I2S_TCSR_WSF_MASK, /*!< Word start flag, means the first word in a frame detected */
AnnaBridge 161:aa5281ff4a02 158 kSAI_SyncErrorFlag = I2S_TCSR_SEF_MASK, /*!< Sync error flag, means the sync error is detected */
AnnaBridge 161:aa5281ff4a02 159 kSAI_FIFOErrorFlag = I2S_TCSR_FEF_MASK, /*!< FIFO error flag */
AnnaBridge 161:aa5281ff4a02 160 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
AnnaBridge 161:aa5281ff4a02 161 kSAI_FIFORequestFlag = I2S_TCSR_FRF_MASK, /*!< FIFO request flag. */
AnnaBridge 161:aa5281ff4a02 162 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
AnnaBridge 161:aa5281ff4a02 163 kSAI_FIFOWarningFlag = I2S_TCSR_FWF_MASK, /*!< FIFO warning flag */
AnnaBridge 161:aa5281ff4a02 164 };
AnnaBridge 161:aa5281ff4a02 165
AnnaBridge 161:aa5281ff4a02 166 /*! @brief The reset type */
AnnaBridge 161:aa5281ff4a02 167 typedef enum _sai_reset_type
AnnaBridge 161:aa5281ff4a02 168 {
AnnaBridge 161:aa5281ff4a02 169 kSAI_ResetTypeSoftware = I2S_TCSR_SR_MASK, /*!< Software reset, reset the logic state */
AnnaBridge 161:aa5281ff4a02 170 kSAI_ResetTypeFIFO = I2S_TCSR_FR_MASK, /*!< FIFO reset, reset the FIFO read and write pointer */
AnnaBridge 161:aa5281ff4a02 171 kSAI_ResetAll = I2S_TCSR_SR_MASK | I2S_TCSR_FR_MASK /*!< All reset. */
AnnaBridge 161:aa5281ff4a02 172 } sai_reset_type_t;
AnnaBridge 161:aa5281ff4a02 173
AnnaBridge 161:aa5281ff4a02 174 #if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING
AnnaBridge 161:aa5281ff4a02 175 /*!
AnnaBridge 161:aa5281ff4a02 176 * @brief The SAI packing mode
AnnaBridge 161:aa5281ff4a02 177 * The mode includes 8 bit and 16 bit packing.
AnnaBridge 161:aa5281ff4a02 178 */
AnnaBridge 161:aa5281ff4a02 179 typedef enum _sai_fifo_packing
AnnaBridge 161:aa5281ff4a02 180 {
AnnaBridge 161:aa5281ff4a02 181 kSAI_FifoPackingDisabled = 0x0U, /*!< Packing disabled */
AnnaBridge 161:aa5281ff4a02 182 kSAI_FifoPacking8bit = 0x2U, /*!< 8 bit packing enabled */
AnnaBridge 161:aa5281ff4a02 183 kSAI_FifoPacking16bit = 0x3U /*!< 16bit packing enabled */
AnnaBridge 161:aa5281ff4a02 184 } sai_fifo_packing_t;
AnnaBridge 161:aa5281ff4a02 185 #endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */
AnnaBridge 161:aa5281ff4a02 186
AnnaBridge 161:aa5281ff4a02 187 /*! @brief SAI user configuration structure */
AnnaBridge 161:aa5281ff4a02 188 typedef struct _sai_config
AnnaBridge 161:aa5281ff4a02 189 {
AnnaBridge 161:aa5281ff4a02 190 sai_protocol_t protocol; /*!< Audio bus protocol in SAI */
AnnaBridge 161:aa5281ff4a02 191 sai_sync_mode_t syncMode; /*!< SAI sync mode, control Tx/Rx clock sync */
AnnaBridge 161:aa5281ff4a02 192 #if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)
AnnaBridge 161:aa5281ff4a02 193 bool mclkOutputEnable; /*!< Master clock output enable, true means master clock divider enabled */
AnnaBridge 161:aa5281ff4a02 194 #endif /* FSL_FEATURE_SAI_HAS_MCR */
AnnaBridge 161:aa5281ff4a02 195 sai_mclk_source_t mclkSource; /*!< Master Clock source */
AnnaBridge 161:aa5281ff4a02 196 sai_bclk_source_t bclkSource; /*!< Bit Clock source */
AnnaBridge 161:aa5281ff4a02 197 sai_master_slave_t masterSlave; /*!< Master or slave */
AnnaBridge 161:aa5281ff4a02 198 } sai_config_t;
AnnaBridge 161:aa5281ff4a02 199
AnnaBridge 161:aa5281ff4a02 200 /*!@brief SAI transfer queue size, user can refine it according to use case. */
AnnaBridge 161:aa5281ff4a02 201 #define SAI_XFER_QUEUE_SIZE (4)
AnnaBridge 161:aa5281ff4a02 202
AnnaBridge 161:aa5281ff4a02 203 /*! @brief Audio sample rate */
AnnaBridge 161:aa5281ff4a02 204 typedef enum _sai_sample_rate
AnnaBridge 161:aa5281ff4a02 205 {
AnnaBridge 161:aa5281ff4a02 206 kSAI_SampleRate8KHz = 8000U, /*!< Sample rate 8000 Hz */
AnnaBridge 161:aa5281ff4a02 207 kSAI_SampleRate11025Hz = 11025U, /*!< Sample rate 11025 Hz */
AnnaBridge 161:aa5281ff4a02 208 kSAI_SampleRate12KHz = 12000U, /*!< Sample rate 12000 Hz */
AnnaBridge 161:aa5281ff4a02 209 kSAI_SampleRate16KHz = 16000U, /*!< Sample rate 16000 Hz */
AnnaBridge 161:aa5281ff4a02 210 kSAI_SampleRate22050Hz = 22050U, /*!< Sample rate 22050 Hz */
AnnaBridge 161:aa5281ff4a02 211 kSAI_SampleRate24KHz = 24000U, /*!< Sample rate 24000 Hz */
AnnaBridge 161:aa5281ff4a02 212 kSAI_SampleRate32KHz = 32000U, /*!< Sample rate 32000 Hz */
AnnaBridge 161:aa5281ff4a02 213 kSAI_SampleRate44100Hz = 44100U, /*!< Sample rate 44100 Hz */
AnnaBridge 161:aa5281ff4a02 214 kSAI_SampleRate48KHz = 48000U, /*!< Sample rate 48000 Hz */
AnnaBridge 161:aa5281ff4a02 215 kSAI_SampleRate96KHz = 96000U /*!< Sample rate 96000 Hz */
AnnaBridge 161:aa5281ff4a02 216 } sai_sample_rate_t;
AnnaBridge 161:aa5281ff4a02 217
AnnaBridge 161:aa5281ff4a02 218 /*! @brief Audio word width */
AnnaBridge 161:aa5281ff4a02 219 typedef enum _sai_word_width
AnnaBridge 161:aa5281ff4a02 220 {
AnnaBridge 161:aa5281ff4a02 221 kSAI_WordWidth8bits = 8U, /*!< Audio data width 8 bits */
AnnaBridge 161:aa5281ff4a02 222 kSAI_WordWidth16bits = 16U, /*!< Audio data width 16 bits */
AnnaBridge 161:aa5281ff4a02 223 kSAI_WordWidth24bits = 24U, /*!< Audio data width 24 bits */
AnnaBridge 161:aa5281ff4a02 224 kSAI_WordWidth32bits = 32U /*!< Audio data width 32 bits */
AnnaBridge 161:aa5281ff4a02 225 } sai_word_width_t;
AnnaBridge 161:aa5281ff4a02 226
AnnaBridge 161:aa5281ff4a02 227 /*! @brief sai transfer format */
AnnaBridge 161:aa5281ff4a02 228 typedef struct _sai_transfer_format
AnnaBridge 161:aa5281ff4a02 229 {
AnnaBridge 161:aa5281ff4a02 230 uint32_t sampleRate_Hz; /*!< Sample rate of audio data */
AnnaBridge 161:aa5281ff4a02 231 uint32_t bitWidth; /*!< Data length of audio data, usually 8/16/24/32 bits */
AnnaBridge 161:aa5281ff4a02 232 sai_mono_stereo_t stereo; /*!< Mono or stereo */
AnnaBridge 161:aa5281ff4a02 233 uint32_t masterClockHz; /*!< Master clock frequency in Hz */
AnnaBridge 161:aa5281ff4a02 234 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
AnnaBridge 161:aa5281ff4a02 235 uint8_t watermark; /*!< Watermark value */
AnnaBridge 161:aa5281ff4a02 236 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
AnnaBridge 161:aa5281ff4a02 237 uint8_t channel; /*!< Data channel used in transfer.*/
AnnaBridge 161:aa5281ff4a02 238 sai_protocol_t protocol; /*!< Which audio protocol used */
AnnaBridge 161:aa5281ff4a02 239 bool isFrameSyncCompact; /*!< True means Frame sync length is configurable according to bitWidth, false means frame
AnnaBridge 161:aa5281ff4a02 240 sync length is 64 times of bit clock. */
AnnaBridge 161:aa5281ff4a02 241 } sai_transfer_format_t;
AnnaBridge 161:aa5281ff4a02 242
AnnaBridge 161:aa5281ff4a02 243 /*! @brief SAI transfer structure */
AnnaBridge 161:aa5281ff4a02 244 typedef struct _sai_transfer
AnnaBridge 161:aa5281ff4a02 245 {
AnnaBridge 161:aa5281ff4a02 246 uint8_t *data; /*!< Data start address to transfer. */
AnnaBridge 161:aa5281ff4a02 247 size_t dataSize; /*!< Transfer size. */
AnnaBridge 161:aa5281ff4a02 248 } sai_transfer_t;
AnnaBridge 161:aa5281ff4a02 249
AnnaBridge 161:aa5281ff4a02 250 typedef struct _sai_handle sai_handle_t;
AnnaBridge 161:aa5281ff4a02 251
AnnaBridge 161:aa5281ff4a02 252 /*! @brief SAI transfer callback prototype */
AnnaBridge 161:aa5281ff4a02 253 typedef void (*sai_transfer_callback_t)(I2S_Type *base, sai_handle_t *handle, status_t status, void *userData);
AnnaBridge 161:aa5281ff4a02 254
AnnaBridge 161:aa5281ff4a02 255 /*! @brief SAI handle structure */
AnnaBridge 161:aa5281ff4a02 256 struct _sai_handle
AnnaBridge 161:aa5281ff4a02 257 {
AnnaBridge 161:aa5281ff4a02 258 uint32_t state; /*!< Transfer status */
AnnaBridge 161:aa5281ff4a02 259 sai_transfer_callback_t callback; /*!< Callback function called at transfer event*/
AnnaBridge 161:aa5281ff4a02 260 void *userData; /*!< Callback parameter passed to callback function*/
AnnaBridge 161:aa5281ff4a02 261 uint8_t bitWidth; /*!< Bit width for transfer, 8/16/24/32 bits */
AnnaBridge 161:aa5281ff4a02 262 uint8_t channel; /*!< Transfer channel */
AnnaBridge 161:aa5281ff4a02 263 sai_transfer_t saiQueue[SAI_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */
AnnaBridge 161:aa5281ff4a02 264 size_t transferSize[SAI_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */
AnnaBridge 161:aa5281ff4a02 265 volatile uint8_t queueUser; /*!< Index for user to queue transfer */
AnnaBridge 161:aa5281ff4a02 266 volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */
AnnaBridge 161:aa5281ff4a02 267 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
AnnaBridge 161:aa5281ff4a02 268 uint8_t watermark; /*!< Watermark value */
AnnaBridge 161:aa5281ff4a02 269 #endif
AnnaBridge 161:aa5281ff4a02 270 };
AnnaBridge 161:aa5281ff4a02 271
AnnaBridge 161:aa5281ff4a02 272 /*******************************************************************************
AnnaBridge 161:aa5281ff4a02 273 * API
AnnaBridge 161:aa5281ff4a02 274 ******************************************************************************/
AnnaBridge 161:aa5281ff4a02 275
AnnaBridge 161:aa5281ff4a02 276 #if defined(__cplusplus)
AnnaBridge 161:aa5281ff4a02 277 extern "C" {
AnnaBridge 161:aa5281ff4a02 278 #endif /*_cplusplus*/
AnnaBridge 161:aa5281ff4a02 279
AnnaBridge 161:aa5281ff4a02 280 /*!
AnnaBridge 161:aa5281ff4a02 281 * @name Initialization and deinitialization
AnnaBridge 161:aa5281ff4a02 282 * @{
AnnaBridge 161:aa5281ff4a02 283 */
AnnaBridge 161:aa5281ff4a02 284
AnnaBridge 161:aa5281ff4a02 285 /*!
AnnaBridge 161:aa5281ff4a02 286 * @brief Initializes the SAI Tx peripheral.
AnnaBridge 161:aa5281ff4a02 287 *
AnnaBridge 161:aa5281ff4a02 288 * Ungates the SAI clock, resets the module, and configures SAI Tx with a configuration structure.
AnnaBridge 161:aa5281ff4a02 289 * The configuration structure can be custom filled or set with default values by
AnnaBridge 161:aa5281ff4a02 290 * SAI_TxGetDefaultConfig().
AnnaBridge 161:aa5281ff4a02 291 *
AnnaBridge 161:aa5281ff4a02 292 * @note This API should be called at the beginning of the application to use
AnnaBridge 161:aa5281ff4a02 293 * the SAI driver. Otherwise, accessing the SAIM module can cause a hard fault
AnnaBridge 161:aa5281ff4a02 294 * because the clock is not enabled.
AnnaBridge 161:aa5281ff4a02 295 *
AnnaBridge 161:aa5281ff4a02 296 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 297 * @param config SAI configuration structure.
AnnaBridge 161:aa5281ff4a02 298 */
AnnaBridge 161:aa5281ff4a02 299 void SAI_TxInit(I2S_Type *base, const sai_config_t *config);
AnnaBridge 161:aa5281ff4a02 300
AnnaBridge 161:aa5281ff4a02 301 /*!
AnnaBridge 170:e95d10626187 302 * @brief Initializes the SAI Rx peripheral.
AnnaBridge 161:aa5281ff4a02 303 *
AnnaBridge 161:aa5281ff4a02 304 * Ungates the SAI clock, resets the module, and configures the SAI Rx with a configuration structure.
AnnaBridge 161:aa5281ff4a02 305 * The configuration structure can be custom filled or set with default values by
AnnaBridge 161:aa5281ff4a02 306 * SAI_RxGetDefaultConfig().
AnnaBridge 161:aa5281ff4a02 307 *
AnnaBridge 161:aa5281ff4a02 308 * @note This API should be called at the beginning of the application to use
AnnaBridge 161:aa5281ff4a02 309 * the SAI driver. Otherwise, accessing the SAI module can cause a hard fault
AnnaBridge 161:aa5281ff4a02 310 * because the clock is not enabled.
AnnaBridge 161:aa5281ff4a02 311 *
AnnaBridge 161:aa5281ff4a02 312 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 313 * @param config SAI configuration structure.
AnnaBridge 161:aa5281ff4a02 314 */
AnnaBridge 161:aa5281ff4a02 315 void SAI_RxInit(I2S_Type *base, const sai_config_t *config);
AnnaBridge 161:aa5281ff4a02 316
AnnaBridge 161:aa5281ff4a02 317 /*!
AnnaBridge 161:aa5281ff4a02 318 * @brief Sets the SAI Tx configuration structure to default values.
AnnaBridge 161:aa5281ff4a02 319 *
AnnaBridge 161:aa5281ff4a02 320 * This API initializes the configuration structure for use in SAI_TxConfig().
AnnaBridge 161:aa5281ff4a02 321 * The initialized structure can remain unchanged in SAI_TxConfig(), or it can be modified
AnnaBridge 161:aa5281ff4a02 322 * before calling SAI_TxConfig().
AnnaBridge 161:aa5281ff4a02 323 * This is an example.
AnnaBridge 161:aa5281ff4a02 324 @code
AnnaBridge 161:aa5281ff4a02 325 sai_config_t config;
AnnaBridge 161:aa5281ff4a02 326 SAI_TxGetDefaultConfig(&config);
AnnaBridge 161:aa5281ff4a02 327 @endcode
AnnaBridge 161:aa5281ff4a02 328 *
AnnaBridge 161:aa5281ff4a02 329 * @param config pointer to master configuration structure
AnnaBridge 161:aa5281ff4a02 330 */
AnnaBridge 161:aa5281ff4a02 331 void SAI_TxGetDefaultConfig(sai_config_t *config);
AnnaBridge 161:aa5281ff4a02 332
AnnaBridge 161:aa5281ff4a02 333 /*!
AnnaBridge 161:aa5281ff4a02 334 * @brief Sets the SAI Rx configuration structure to default values.
AnnaBridge 161:aa5281ff4a02 335 *
AnnaBridge 161:aa5281ff4a02 336 * This API initializes the configuration structure for use in SAI_RxConfig().
AnnaBridge 161:aa5281ff4a02 337 * The initialized structure can remain unchanged in SAI_RxConfig() or it can be modified
AnnaBridge 161:aa5281ff4a02 338 * before calling SAI_RxConfig().
AnnaBridge 161:aa5281ff4a02 339 * This is an example.
AnnaBridge 161:aa5281ff4a02 340 @code
AnnaBridge 161:aa5281ff4a02 341 sai_config_t config;
AnnaBridge 161:aa5281ff4a02 342 SAI_RxGetDefaultConfig(&config);
AnnaBridge 161:aa5281ff4a02 343 @endcode
AnnaBridge 161:aa5281ff4a02 344 *
AnnaBridge 161:aa5281ff4a02 345 * @param config pointer to master configuration structure
AnnaBridge 161:aa5281ff4a02 346 */
AnnaBridge 161:aa5281ff4a02 347 void SAI_RxGetDefaultConfig(sai_config_t *config);
AnnaBridge 161:aa5281ff4a02 348
AnnaBridge 161:aa5281ff4a02 349 /*!
AnnaBridge 161:aa5281ff4a02 350 * @brief De-initializes the SAI peripheral.
AnnaBridge 161:aa5281ff4a02 351 *
AnnaBridge 161:aa5281ff4a02 352 * This API gates the SAI clock. The SAI module can't operate unless SAI_TxInit
AnnaBridge 161:aa5281ff4a02 353 * or SAI_RxInit is called to enable the clock.
AnnaBridge 161:aa5281ff4a02 354 *
AnnaBridge 161:aa5281ff4a02 355 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 356 */
AnnaBridge 161:aa5281ff4a02 357 void SAI_Deinit(I2S_Type *base);
AnnaBridge 161:aa5281ff4a02 358
AnnaBridge 161:aa5281ff4a02 359 /*!
AnnaBridge 161:aa5281ff4a02 360 * @brief Resets the SAI Tx.
AnnaBridge 161:aa5281ff4a02 361 *
AnnaBridge 161:aa5281ff4a02 362 * This function enables the software reset and FIFO reset of SAI Tx. After reset, clear the reset bit.
AnnaBridge 161:aa5281ff4a02 363 *
AnnaBridge 161:aa5281ff4a02 364 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 365 */
AnnaBridge 161:aa5281ff4a02 366 void SAI_TxReset(I2S_Type *base);
AnnaBridge 161:aa5281ff4a02 367
AnnaBridge 161:aa5281ff4a02 368 /*!
AnnaBridge 161:aa5281ff4a02 369 * @brief Resets the SAI Rx.
AnnaBridge 161:aa5281ff4a02 370 *
AnnaBridge 161:aa5281ff4a02 371 * This function enables the software reset and FIFO reset of SAI Rx. After reset, clear the reset bit.
AnnaBridge 161:aa5281ff4a02 372 *
AnnaBridge 161:aa5281ff4a02 373 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 374 */
AnnaBridge 161:aa5281ff4a02 375 void SAI_RxReset(I2S_Type *base);
AnnaBridge 161:aa5281ff4a02 376
AnnaBridge 161:aa5281ff4a02 377 /*!
AnnaBridge 161:aa5281ff4a02 378 * @brief Enables/disables the SAI Tx.
AnnaBridge 161:aa5281ff4a02 379 *
AnnaBridge 161:aa5281ff4a02 380 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 381 * @param enable True means enable SAI Tx, false means disable.
AnnaBridge 161:aa5281ff4a02 382 */
AnnaBridge 161:aa5281ff4a02 383 void SAI_TxEnable(I2S_Type *base, bool enable);
AnnaBridge 161:aa5281ff4a02 384
AnnaBridge 161:aa5281ff4a02 385 /*!
AnnaBridge 161:aa5281ff4a02 386 * @brief Enables/disables the SAI Rx.
AnnaBridge 161:aa5281ff4a02 387 *
AnnaBridge 161:aa5281ff4a02 388 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 389 * @param enable True means enable SAI Rx, false means disable.
AnnaBridge 161:aa5281ff4a02 390 */
AnnaBridge 161:aa5281ff4a02 391 void SAI_RxEnable(I2S_Type *base, bool enable);
AnnaBridge 161:aa5281ff4a02 392
AnnaBridge 161:aa5281ff4a02 393 /*! @} */
AnnaBridge 161:aa5281ff4a02 394
AnnaBridge 161:aa5281ff4a02 395 /*!
AnnaBridge 161:aa5281ff4a02 396 * @name Status
AnnaBridge 161:aa5281ff4a02 397 * @{
AnnaBridge 161:aa5281ff4a02 398 */
AnnaBridge 161:aa5281ff4a02 399
AnnaBridge 161:aa5281ff4a02 400 /*!
AnnaBridge 161:aa5281ff4a02 401 * @brief Gets the SAI Tx status flag state.
AnnaBridge 161:aa5281ff4a02 402 *
AnnaBridge 161:aa5281ff4a02 403 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 404 * @return SAI Tx status flag value. Use the Status Mask to get the status value needed.
AnnaBridge 161:aa5281ff4a02 405 */
AnnaBridge 161:aa5281ff4a02 406 static inline uint32_t SAI_TxGetStatusFlag(I2S_Type *base)
AnnaBridge 161:aa5281ff4a02 407 {
AnnaBridge 161:aa5281ff4a02 408 return base->TCSR;
AnnaBridge 161:aa5281ff4a02 409 }
AnnaBridge 161:aa5281ff4a02 410
AnnaBridge 161:aa5281ff4a02 411 /*!
AnnaBridge 161:aa5281ff4a02 412 * @brief Clears the SAI Tx status flag state.
AnnaBridge 161:aa5281ff4a02 413 *
AnnaBridge 161:aa5281ff4a02 414 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 415 * @param mask State mask. It can be a combination of the following source if defined:
AnnaBridge 161:aa5281ff4a02 416 * @arg kSAI_WordStartFlag
AnnaBridge 161:aa5281ff4a02 417 * @arg kSAI_SyncErrorFlag
AnnaBridge 161:aa5281ff4a02 418 * @arg kSAI_FIFOErrorFlag
AnnaBridge 161:aa5281ff4a02 419 */
AnnaBridge 161:aa5281ff4a02 420 static inline void SAI_TxClearStatusFlags(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 421 {
AnnaBridge 161:aa5281ff4a02 422 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 423 }
AnnaBridge 161:aa5281ff4a02 424
AnnaBridge 161:aa5281ff4a02 425 /*!
AnnaBridge 161:aa5281ff4a02 426 * @brief Gets the SAI Tx status flag state.
AnnaBridge 161:aa5281ff4a02 427 *
AnnaBridge 161:aa5281ff4a02 428 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 429 * @return SAI Rx status flag value. Use the Status Mask to get the status value needed.
AnnaBridge 161:aa5281ff4a02 430 */
AnnaBridge 161:aa5281ff4a02 431 static inline uint32_t SAI_RxGetStatusFlag(I2S_Type *base)
AnnaBridge 161:aa5281ff4a02 432 {
AnnaBridge 161:aa5281ff4a02 433 return base->RCSR;
AnnaBridge 161:aa5281ff4a02 434 }
AnnaBridge 161:aa5281ff4a02 435
AnnaBridge 161:aa5281ff4a02 436 /*!
AnnaBridge 161:aa5281ff4a02 437 * @brief Clears the SAI Rx status flag state.
AnnaBridge 161:aa5281ff4a02 438 *
AnnaBridge 161:aa5281ff4a02 439 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 440 * @param mask State mask. It can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 441 * @arg kSAI_WordStartFlag
AnnaBridge 161:aa5281ff4a02 442 * @arg kSAI_SyncErrorFlag
AnnaBridge 161:aa5281ff4a02 443 * @arg kSAI_FIFOErrorFlag
AnnaBridge 161:aa5281ff4a02 444 */
AnnaBridge 161:aa5281ff4a02 445 static inline void SAI_RxClearStatusFlags(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 446 {
AnnaBridge 161:aa5281ff4a02 447 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 448 }
AnnaBridge 161:aa5281ff4a02 449
AnnaBridge 161:aa5281ff4a02 450 /*!
AnnaBridge 161:aa5281ff4a02 451 * @brief Do software reset or FIFO reset .
AnnaBridge 161:aa5281ff4a02 452 *
AnnaBridge 161:aa5281ff4a02 453 * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0.
AnnaBridge 161:aa5281ff4a02 454 * Software reset means claer the Tx internal logic, including the bit clock, frame count etc. But software
AnnaBridge 161:aa5281ff4a02 455 * reset will not clear any configuration registers like TCR1~TCR5.
AnnaBridge 161:aa5281ff4a02 456 * This function will also clear all the error flags such as FIFO error, sync error etc.
AnnaBridge 161:aa5281ff4a02 457 *
AnnaBridge 161:aa5281ff4a02 458 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 459 * @param type Reset type, FIFO reset or software reset
AnnaBridge 161:aa5281ff4a02 460 */
AnnaBridge 161:aa5281ff4a02 461 void SAI_TxSoftwareReset(I2S_Type *base, sai_reset_type_t type);
AnnaBridge 161:aa5281ff4a02 462
AnnaBridge 161:aa5281ff4a02 463 /*!
AnnaBridge 161:aa5281ff4a02 464 * @brief Do software reset or FIFO reset .
AnnaBridge 161:aa5281ff4a02 465 *
AnnaBridge 161:aa5281ff4a02 466 * FIFO reset means clear all the data in the FIFO, and make the FIFO pointer both to 0.
AnnaBridge 161:aa5281ff4a02 467 * Software reset means claer the Rx internal logic, including the bit clock, frame count etc. But software
AnnaBridge 161:aa5281ff4a02 468 * reset will not clear any configuration registers like RCR1~RCR5.
AnnaBridge 161:aa5281ff4a02 469 * This function will also clear all the error flags such as FIFO error, sync error etc.
AnnaBridge 161:aa5281ff4a02 470 *
AnnaBridge 161:aa5281ff4a02 471 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 472 * @param type Reset type, FIFO reset or software reset
AnnaBridge 161:aa5281ff4a02 473 */
AnnaBridge 161:aa5281ff4a02 474 void SAI_RxSoftwareReset(I2S_Type *base, sai_reset_type_t type);
AnnaBridge 161:aa5281ff4a02 475
AnnaBridge 161:aa5281ff4a02 476 /*!
AnnaBridge 161:aa5281ff4a02 477 * @brief Set the Tx channel FIFO enable mask.
AnnaBridge 161:aa5281ff4a02 478 *
AnnaBridge 161:aa5281ff4a02 479 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 480 * @param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled,
AnnaBridge 161:aa5281ff4a02 481 * 3 means both channel 0 and channel 1 enabled.
AnnaBridge 161:aa5281ff4a02 482 */
AnnaBridge 161:aa5281ff4a02 483 void SAI_TxSetChannelFIFOMask(I2S_Type *base, uint8_t mask);
AnnaBridge 161:aa5281ff4a02 484
AnnaBridge 161:aa5281ff4a02 485 /*!
AnnaBridge 161:aa5281ff4a02 486 * @brief Set the Rx channel FIFO enable mask.
AnnaBridge 161:aa5281ff4a02 487 *
AnnaBridge 161:aa5281ff4a02 488 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 489 * @param mask Channel enable mask, 0 means all channel FIFO disabled, 1 means channel 0 enabled,
AnnaBridge 161:aa5281ff4a02 490 * 3 means both channel 0 and channel 1 enabled.
AnnaBridge 161:aa5281ff4a02 491 */
AnnaBridge 161:aa5281ff4a02 492 void SAI_RxSetChannelFIFOMask(I2S_Type *base, uint8_t mask);
AnnaBridge 161:aa5281ff4a02 493
AnnaBridge 170:e95d10626187 494 /*!
AnnaBridge 170:e95d10626187 495 * @brief Set the Tx data order.
AnnaBridge 170:e95d10626187 496 *
AnnaBridge 170:e95d10626187 497 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 498 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 499 */
AnnaBridge 170:e95d10626187 500 void SAI_TxSetDataOrder(I2S_Type *base, sai_data_order_t order);
AnnaBridge 170:e95d10626187 501
AnnaBridge 170:e95d10626187 502 /*!
AnnaBridge 170:e95d10626187 503 * @brief Set the Rx data order.
AnnaBridge 170:e95d10626187 504 *
AnnaBridge 170:e95d10626187 505 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 506 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 507 */
AnnaBridge 170:e95d10626187 508 void SAI_RxSetDataOrder(I2S_Type *base, sai_data_order_t order);
AnnaBridge 170:e95d10626187 509
AnnaBridge 170:e95d10626187 510 /*!
AnnaBridge 170:e95d10626187 511 * @brief Set the Tx data order.
AnnaBridge 170:e95d10626187 512 *
AnnaBridge 170:e95d10626187 513 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 514 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 515 */
AnnaBridge 170:e95d10626187 516 void SAI_TxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity);
AnnaBridge 170:e95d10626187 517
AnnaBridge 170:e95d10626187 518 /*!
AnnaBridge 170:e95d10626187 519 * @brief Set the Rx data order.
AnnaBridge 170:e95d10626187 520 *
AnnaBridge 170:e95d10626187 521 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 522 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 523 */
AnnaBridge 170:e95d10626187 524 void SAI_RxSetBitClockPolarity(I2S_Type *base, sai_clock_polarity_t polarity);
AnnaBridge 170:e95d10626187 525
AnnaBridge 170:e95d10626187 526 /*!
AnnaBridge 170:e95d10626187 527 * @brief Set the Tx data order.
AnnaBridge 170:e95d10626187 528 *
AnnaBridge 170:e95d10626187 529 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 530 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 531 */
AnnaBridge 170:e95d10626187 532 void SAI_TxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity);
AnnaBridge 170:e95d10626187 533
AnnaBridge 170:e95d10626187 534 /*!
AnnaBridge 170:e95d10626187 535 * @brief Set the Rx data order.
AnnaBridge 170:e95d10626187 536 *
AnnaBridge 170:e95d10626187 537 * @param base SAI base pointer
AnnaBridge 170:e95d10626187 538 * @param order Data order MSB or LSB
AnnaBridge 170:e95d10626187 539 */
AnnaBridge 170:e95d10626187 540 void SAI_RxSetFrameSyncPolarity(I2S_Type *base, sai_clock_polarity_t polarity);
AnnaBridge 170:e95d10626187 541
AnnaBridge 170:e95d10626187 542 #if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING
AnnaBridge 170:e95d10626187 543 /*!
AnnaBridge 170:e95d10626187 544 * @brief Set Tx FIFO packing feature.
AnnaBridge 170:e95d10626187 545 *
AnnaBridge 170:e95d10626187 546 * @param base SAI base pointer.
AnnaBridge 170:e95d10626187 547 * @param pack FIFO pack type. It is element of sai_fifo_packing_t.
AnnaBridge 170:e95d10626187 548 */
AnnaBridge 170:e95d10626187 549 void SAI_TxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack);
AnnaBridge 170:e95d10626187 550
AnnaBridge 170:e95d10626187 551 /*!
AnnaBridge 170:e95d10626187 552 * @brief Set Rx FIFO packing feature.
AnnaBridge 170:e95d10626187 553 *
AnnaBridge 170:e95d10626187 554 * @param base SAI base pointer.
AnnaBridge 170:e95d10626187 555 * @param pack FIFO pack type. It is element of sai_fifo_packing_t.
AnnaBridge 170:e95d10626187 556 */
AnnaBridge 170:e95d10626187 557 void SAI_RxSetFIFOPacking(I2S_Type *base, sai_fifo_packing_t pack);
AnnaBridge 170:e95d10626187 558 #endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */
AnnaBridge 170:e95d10626187 559
AnnaBridge 170:e95d10626187 560 #if defined(FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR) && FSL_FEATURE_SAI_HAS_FIFO_FUNCTION_AFTER_ERROR
AnnaBridge 170:e95d10626187 561 /*!
AnnaBridge 170:e95d10626187 562 * @brief Set Tx FIFO error continue.
AnnaBridge 170:e95d10626187 563 *
AnnaBridge 170:e95d10626187 564 * FIFO error continue mode means SAI will keep running while FIFO error occured. If this feature
AnnaBridge 170:e95d10626187 565 * not enabled, SAI will hang and users need to clear FEF flag in TCSR register.
AnnaBridge 170:e95d10626187 566 *
AnnaBridge 170:e95d10626187 567 * @param base SAI base pointer.
AnnaBridge 170:e95d10626187 568 * @param isEnabled Is FIFO error continue enabled, true means enable, false means disable.
AnnaBridge 170:e95d10626187 569 */
AnnaBridge 170:e95d10626187 570 static inline void SAI_TxSetFIFOErrorContinue(I2S_Type *base, bool isEnabled)
AnnaBridge 170:e95d10626187 571 {
AnnaBridge 170:e95d10626187 572 if (isEnabled)
AnnaBridge 170:e95d10626187 573 {
AnnaBridge 170:e95d10626187 574 base->TCR4 |= I2S_TCR4_FCONT_MASK;
AnnaBridge 170:e95d10626187 575 }
AnnaBridge 170:e95d10626187 576 else
AnnaBridge 170:e95d10626187 577 {
AnnaBridge 170:e95d10626187 578 base->TCR4 &= ~I2S_TCR4_FCONT_MASK;
AnnaBridge 170:e95d10626187 579 }
AnnaBridge 170:e95d10626187 580 }
AnnaBridge 170:e95d10626187 581
AnnaBridge 170:e95d10626187 582 /*!
AnnaBridge 170:e95d10626187 583 * @brief Set Rx FIFO error continue.
AnnaBridge 170:e95d10626187 584 *
AnnaBridge 170:e95d10626187 585 * FIFO error continue mode means SAI will keep running while FIFO error occured. If this feature
AnnaBridge 170:e95d10626187 586 * not enabled, SAI will hang and users need to clear FEF flag in RCSR register.
AnnaBridge 170:e95d10626187 587 *
AnnaBridge 170:e95d10626187 588 * @param base SAI base pointer.
AnnaBridge 170:e95d10626187 589 * @param isEnabled Is FIFO error continue enabled, true means enable, false means disable.
AnnaBridge 170:e95d10626187 590 */
AnnaBridge 170:e95d10626187 591 static inline void SAI_RxSetFIFOErrorContinue(I2S_Type *base, bool isEnabled)
AnnaBridge 170:e95d10626187 592 {
AnnaBridge 170:e95d10626187 593 if (isEnabled)
AnnaBridge 170:e95d10626187 594 {
AnnaBridge 170:e95d10626187 595 base->RCR4 |= I2S_RCR4_FCONT_MASK;
AnnaBridge 170:e95d10626187 596 }
AnnaBridge 170:e95d10626187 597 else
AnnaBridge 170:e95d10626187 598 {
AnnaBridge 170:e95d10626187 599 base->RCR4 &= ~I2S_RCR4_FCONT_MASK;
AnnaBridge 170:e95d10626187 600 }
AnnaBridge 170:e95d10626187 601 }
AnnaBridge 170:e95d10626187 602 #endif
AnnaBridge 161:aa5281ff4a02 603 /*! @} */
AnnaBridge 161:aa5281ff4a02 604
AnnaBridge 161:aa5281ff4a02 605 /*!
AnnaBridge 161:aa5281ff4a02 606 * @name Interrupts
AnnaBridge 161:aa5281ff4a02 607 * @{
AnnaBridge 161:aa5281ff4a02 608 */
AnnaBridge 161:aa5281ff4a02 609
AnnaBridge 161:aa5281ff4a02 610 /*!
AnnaBridge 161:aa5281ff4a02 611 * @brief Enables the SAI Tx interrupt requests.
AnnaBridge 161:aa5281ff4a02 612 *
AnnaBridge 161:aa5281ff4a02 613 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 614 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 615 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 616 * @arg kSAI_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 617 * @arg kSAI_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 618 * @arg kSAI_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 619 * @arg kSAI_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 620 * @arg kSAI_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 621 */
AnnaBridge 161:aa5281ff4a02 622 static inline void SAI_TxEnableInterrupts(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 623 {
AnnaBridge 161:aa5281ff4a02 624 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 625 }
AnnaBridge 161:aa5281ff4a02 626
AnnaBridge 161:aa5281ff4a02 627 /*!
AnnaBridge 161:aa5281ff4a02 628 * @brief Enables the SAI Rx interrupt requests.
AnnaBridge 161:aa5281ff4a02 629 *
AnnaBridge 161:aa5281ff4a02 630 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 631 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 632 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 633 * @arg kSAI_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 634 * @arg kSAI_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 635 * @arg kSAI_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 636 * @arg kSAI_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 637 * @arg kSAI_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 638 */
AnnaBridge 161:aa5281ff4a02 639 static inline void SAI_RxEnableInterrupts(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 640 {
AnnaBridge 161:aa5281ff4a02 641 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 642 }
AnnaBridge 161:aa5281ff4a02 643
AnnaBridge 161:aa5281ff4a02 644 /*!
AnnaBridge 161:aa5281ff4a02 645 * @brief Disables the SAI Tx interrupt requests.
AnnaBridge 161:aa5281ff4a02 646 *
AnnaBridge 161:aa5281ff4a02 647 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 648 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 649 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 650 * @arg kSAI_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 651 * @arg kSAI_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 652 * @arg kSAI_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 653 * @arg kSAI_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 654 * @arg kSAI_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 655 */
AnnaBridge 161:aa5281ff4a02 656 static inline void SAI_TxDisableInterrupts(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 657 {
AnnaBridge 161:aa5281ff4a02 658 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask));
AnnaBridge 161:aa5281ff4a02 659 }
AnnaBridge 161:aa5281ff4a02 660
AnnaBridge 161:aa5281ff4a02 661 /*!
AnnaBridge 161:aa5281ff4a02 662 * @brief Disables the SAI Rx interrupt requests.
AnnaBridge 161:aa5281ff4a02 663 *
AnnaBridge 161:aa5281ff4a02 664 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 665 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 666 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 667 * @arg kSAI_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 668 * @arg kSAI_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 669 * @arg kSAI_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 670 * @arg kSAI_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 671 * @arg kSAI_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 672 */
AnnaBridge 161:aa5281ff4a02 673 static inline void SAI_RxDisableInterrupts(I2S_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 674 {
AnnaBridge 161:aa5281ff4a02 675 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask));
AnnaBridge 161:aa5281ff4a02 676 }
AnnaBridge 161:aa5281ff4a02 677
AnnaBridge 161:aa5281ff4a02 678 /*! @} */
AnnaBridge 161:aa5281ff4a02 679
AnnaBridge 161:aa5281ff4a02 680 /*!
AnnaBridge 161:aa5281ff4a02 681 * @name DMA Control
AnnaBridge 161:aa5281ff4a02 682 * @{
AnnaBridge 161:aa5281ff4a02 683 */
AnnaBridge 161:aa5281ff4a02 684
AnnaBridge 161:aa5281ff4a02 685 /*!
AnnaBridge 161:aa5281ff4a02 686 * @brief Enables/disables the SAI Tx DMA requests.
AnnaBridge 161:aa5281ff4a02 687 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 688 * @param mask DMA source
AnnaBridge 161:aa5281ff4a02 689 * The parameter can be combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 690 * @arg kSAI_FIFOWarningDMAEnable
AnnaBridge 161:aa5281ff4a02 691 * @arg kSAI_FIFORequestDMAEnable
AnnaBridge 161:aa5281ff4a02 692 * @param enable True means enable DMA, false means disable DMA.
AnnaBridge 161:aa5281ff4a02 693 */
AnnaBridge 161:aa5281ff4a02 694 static inline void SAI_TxEnableDMA(I2S_Type *base, uint32_t mask, bool enable)
AnnaBridge 161:aa5281ff4a02 695 {
AnnaBridge 161:aa5281ff4a02 696 if (enable)
AnnaBridge 161:aa5281ff4a02 697 {
AnnaBridge 161:aa5281ff4a02 698 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 699 }
AnnaBridge 161:aa5281ff4a02 700 else
AnnaBridge 161:aa5281ff4a02 701 {
AnnaBridge 161:aa5281ff4a02 702 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask));
AnnaBridge 161:aa5281ff4a02 703 }
AnnaBridge 161:aa5281ff4a02 704 }
AnnaBridge 161:aa5281ff4a02 705
AnnaBridge 161:aa5281ff4a02 706 /*!
AnnaBridge 161:aa5281ff4a02 707 * @brief Enables/disables the SAI Rx DMA requests.
AnnaBridge 161:aa5281ff4a02 708 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 709 * @param mask DMA source
AnnaBridge 161:aa5281ff4a02 710 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 711 * @arg kSAI_FIFOWarningDMAEnable
AnnaBridge 161:aa5281ff4a02 712 * @arg kSAI_FIFORequestDMAEnable
AnnaBridge 161:aa5281ff4a02 713 * @param enable True means enable DMA, false means disable DMA.
AnnaBridge 161:aa5281ff4a02 714 */
AnnaBridge 161:aa5281ff4a02 715 static inline void SAI_RxEnableDMA(I2S_Type *base, uint32_t mask, bool enable)
AnnaBridge 161:aa5281ff4a02 716 {
AnnaBridge 161:aa5281ff4a02 717 if (enable)
AnnaBridge 161:aa5281ff4a02 718 {
AnnaBridge 161:aa5281ff4a02 719 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
AnnaBridge 161:aa5281ff4a02 720 }
AnnaBridge 161:aa5281ff4a02 721 else
AnnaBridge 161:aa5281ff4a02 722 {
AnnaBridge 161:aa5281ff4a02 723 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask));
AnnaBridge 161:aa5281ff4a02 724 }
AnnaBridge 161:aa5281ff4a02 725 }
AnnaBridge 161:aa5281ff4a02 726
AnnaBridge 161:aa5281ff4a02 727 /*!
AnnaBridge 161:aa5281ff4a02 728 * @brief Gets the SAI Tx data register address.
AnnaBridge 161:aa5281ff4a02 729 *
AnnaBridge 161:aa5281ff4a02 730 * This API is used to provide a transfer address for the SAI DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 731 *
AnnaBridge 161:aa5281ff4a02 732 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 733 * @param channel Which data channel used.
AnnaBridge 161:aa5281ff4a02 734 * @return data register address.
AnnaBridge 161:aa5281ff4a02 735 */
AnnaBridge 161:aa5281ff4a02 736 static inline uint32_t SAI_TxGetDataRegisterAddress(I2S_Type *base, uint32_t channel)
AnnaBridge 161:aa5281ff4a02 737 {
AnnaBridge 161:aa5281ff4a02 738 return (uint32_t)(&(base->TDR)[channel]);
AnnaBridge 161:aa5281ff4a02 739 }
AnnaBridge 161:aa5281ff4a02 740
AnnaBridge 161:aa5281ff4a02 741 /*!
AnnaBridge 161:aa5281ff4a02 742 * @brief Gets the SAI Rx data register address.
AnnaBridge 161:aa5281ff4a02 743 *
AnnaBridge 161:aa5281ff4a02 744 * This API is used to provide a transfer address for the SAI DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 745 *
AnnaBridge 161:aa5281ff4a02 746 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 747 * @param channel Which data channel used.
AnnaBridge 161:aa5281ff4a02 748 * @return data register address.
AnnaBridge 161:aa5281ff4a02 749 */
AnnaBridge 161:aa5281ff4a02 750 static inline uint32_t SAI_RxGetDataRegisterAddress(I2S_Type *base, uint32_t channel)
AnnaBridge 161:aa5281ff4a02 751 {
AnnaBridge 161:aa5281ff4a02 752 return (uint32_t)(&(base->RDR)[channel]);
AnnaBridge 161:aa5281ff4a02 753 }
AnnaBridge 161:aa5281ff4a02 754
AnnaBridge 161:aa5281ff4a02 755 /*! @} */
AnnaBridge 161:aa5281ff4a02 756
AnnaBridge 161:aa5281ff4a02 757 /*!
AnnaBridge 161:aa5281ff4a02 758 * @name Bus Operations
AnnaBridge 161:aa5281ff4a02 759 * @{
AnnaBridge 161:aa5281ff4a02 760 */
AnnaBridge 161:aa5281ff4a02 761
AnnaBridge 161:aa5281ff4a02 762 /*!
AnnaBridge 161:aa5281ff4a02 763 * @brief Configures the SAI Tx audio format.
AnnaBridge 161:aa5281ff4a02 764 *
AnnaBridge 161:aa5281ff4a02 765 * The audio format can be changed at run-time. This function configures the sample rate and audio data
AnnaBridge 161:aa5281ff4a02 766 * format to be transferred.
AnnaBridge 161:aa5281ff4a02 767 *
AnnaBridge 161:aa5281ff4a02 768 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 769 * @param format Pointer to the SAI audio data format structure.
AnnaBridge 161:aa5281ff4a02 770 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
AnnaBridge 161:aa5281ff4a02 771 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master
AnnaBridge 161:aa5281ff4a02 772 * clock, this value should equal the masterClockHz.
AnnaBridge 161:aa5281ff4a02 773 */
AnnaBridge 161:aa5281ff4a02 774 void SAI_TxSetFormat(I2S_Type *base,
AnnaBridge 161:aa5281ff4a02 775 sai_transfer_format_t *format,
AnnaBridge 161:aa5281ff4a02 776 uint32_t mclkSourceClockHz,
AnnaBridge 161:aa5281ff4a02 777 uint32_t bclkSourceClockHz);
AnnaBridge 161:aa5281ff4a02 778
AnnaBridge 161:aa5281ff4a02 779 /*!
AnnaBridge 161:aa5281ff4a02 780 * @brief Configures the SAI Rx audio format.
AnnaBridge 161:aa5281ff4a02 781 *
AnnaBridge 161:aa5281ff4a02 782 * The audio format can be changed at run-time. This function configures the sample rate and audio data
AnnaBridge 161:aa5281ff4a02 783 * format to be transferred.
AnnaBridge 161:aa5281ff4a02 784 *
AnnaBridge 161:aa5281ff4a02 785 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 786 * @param format Pointer to the SAI audio data format structure.
AnnaBridge 161:aa5281ff4a02 787 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
AnnaBridge 161:aa5281ff4a02 788 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If the bit clock source is a master
AnnaBridge 161:aa5281ff4a02 789 * clock, this value should equal the masterClockHz.
AnnaBridge 161:aa5281ff4a02 790 */
AnnaBridge 161:aa5281ff4a02 791 void SAI_RxSetFormat(I2S_Type *base,
AnnaBridge 161:aa5281ff4a02 792 sai_transfer_format_t *format,
AnnaBridge 161:aa5281ff4a02 793 uint32_t mclkSourceClockHz,
AnnaBridge 161:aa5281ff4a02 794 uint32_t bclkSourceClockHz);
AnnaBridge 161:aa5281ff4a02 795
AnnaBridge 161:aa5281ff4a02 796 /*!
AnnaBridge 161:aa5281ff4a02 797 * @brief Sends data using a blocking method.
AnnaBridge 161:aa5281ff4a02 798 *
AnnaBridge 161:aa5281ff4a02 799 * @note This function blocks by polling until data is ready to be sent.
AnnaBridge 161:aa5281ff4a02 800 *
AnnaBridge 161:aa5281ff4a02 801 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 802 * @param channel Data channel used.
AnnaBridge 161:aa5281ff4a02 803 * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits.
AnnaBridge 161:aa5281ff4a02 804 * @param buffer Pointer to the data to be written.
AnnaBridge 161:aa5281ff4a02 805 * @param size Bytes to be written.
AnnaBridge 161:aa5281ff4a02 806 */
AnnaBridge 161:aa5281ff4a02 807 void SAI_WriteBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size);
AnnaBridge 161:aa5281ff4a02 808
AnnaBridge 161:aa5281ff4a02 809 /*!
AnnaBridge 161:aa5281ff4a02 810 * @brief Writes data into SAI FIFO.
AnnaBridge 161:aa5281ff4a02 811 *
AnnaBridge 161:aa5281ff4a02 812 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 813 * @param channel Data channel used.
AnnaBridge 161:aa5281ff4a02 814 * @param data Data needs to be written.
AnnaBridge 161:aa5281ff4a02 815 */
AnnaBridge 161:aa5281ff4a02 816 static inline void SAI_WriteData(I2S_Type *base, uint32_t channel, uint32_t data)
AnnaBridge 161:aa5281ff4a02 817 {
AnnaBridge 161:aa5281ff4a02 818 base->TDR[channel] = data;
AnnaBridge 161:aa5281ff4a02 819 }
AnnaBridge 161:aa5281ff4a02 820
AnnaBridge 161:aa5281ff4a02 821 /*!
AnnaBridge 161:aa5281ff4a02 822 * @brief Receives data using a blocking method.
AnnaBridge 161:aa5281ff4a02 823 *
AnnaBridge 161:aa5281ff4a02 824 * @note This function blocks by polling until data is ready to be sent.
AnnaBridge 161:aa5281ff4a02 825 *
AnnaBridge 161:aa5281ff4a02 826 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 827 * @param channel Data channel used.
AnnaBridge 161:aa5281ff4a02 828 * @param bitWidth How many bits in an audio word; usually 8/16/24/32 bits.
AnnaBridge 161:aa5281ff4a02 829 * @param buffer Pointer to the data to be read.
AnnaBridge 161:aa5281ff4a02 830 * @param size Bytes to be read.
AnnaBridge 161:aa5281ff4a02 831 */
AnnaBridge 161:aa5281ff4a02 832 void SAI_ReadBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size);
AnnaBridge 161:aa5281ff4a02 833
AnnaBridge 161:aa5281ff4a02 834 /*!
AnnaBridge 161:aa5281ff4a02 835 * @brief Reads data from the SAI FIFO.
AnnaBridge 161:aa5281ff4a02 836 *
AnnaBridge 161:aa5281ff4a02 837 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 838 * @param channel Data channel used.
AnnaBridge 161:aa5281ff4a02 839 * @return Data in SAI FIFO.
AnnaBridge 161:aa5281ff4a02 840 */
AnnaBridge 161:aa5281ff4a02 841 static inline uint32_t SAI_ReadData(I2S_Type *base, uint32_t channel)
AnnaBridge 161:aa5281ff4a02 842 {
AnnaBridge 161:aa5281ff4a02 843 return base->RDR[channel];
AnnaBridge 161:aa5281ff4a02 844 }
AnnaBridge 161:aa5281ff4a02 845
AnnaBridge 161:aa5281ff4a02 846 /*! @} */
AnnaBridge 161:aa5281ff4a02 847
AnnaBridge 161:aa5281ff4a02 848 /*!
AnnaBridge 161:aa5281ff4a02 849 * @name Transactional
AnnaBridge 161:aa5281ff4a02 850 * @{
AnnaBridge 161:aa5281ff4a02 851 */
AnnaBridge 161:aa5281ff4a02 852
AnnaBridge 161:aa5281ff4a02 853 /*!
AnnaBridge 161:aa5281ff4a02 854 * @brief Initializes the SAI Tx handle.
AnnaBridge 161:aa5281ff4a02 855 *
AnnaBridge 161:aa5281ff4a02 856 * This function initializes the Tx handle for the SAI Tx transactional APIs. Call
AnnaBridge 161:aa5281ff4a02 857 * this function once to get the handle initialized.
AnnaBridge 161:aa5281ff4a02 858 *
AnnaBridge 161:aa5281ff4a02 859 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 860 * @param handle SAI handle pointer.
AnnaBridge 161:aa5281ff4a02 861 * @param callback Pointer to the user callback function.
AnnaBridge 161:aa5281ff4a02 862 * @param userData User parameter passed to the callback function
AnnaBridge 161:aa5281ff4a02 863 */
AnnaBridge 161:aa5281ff4a02 864 void SAI_TransferTxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData);
AnnaBridge 161:aa5281ff4a02 865
AnnaBridge 161:aa5281ff4a02 866 /*!
AnnaBridge 161:aa5281ff4a02 867 * @brief Initializes the SAI Rx handle.
AnnaBridge 161:aa5281ff4a02 868 *
AnnaBridge 161:aa5281ff4a02 869 * This function initializes the Rx handle for the SAI Rx transactional APIs. Call
AnnaBridge 161:aa5281ff4a02 870 * this function once to get the handle initialized.
AnnaBridge 161:aa5281ff4a02 871 *
AnnaBridge 161:aa5281ff4a02 872 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 873 * @param handle SAI handle pointer.
AnnaBridge 161:aa5281ff4a02 874 * @param callback Pointer to the user callback function.
AnnaBridge 161:aa5281ff4a02 875 * @param userData User parameter passed to the callback function.
AnnaBridge 161:aa5281ff4a02 876 */
AnnaBridge 161:aa5281ff4a02 877 void SAI_TransferRxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData);
AnnaBridge 161:aa5281ff4a02 878
AnnaBridge 161:aa5281ff4a02 879 /*!
AnnaBridge 161:aa5281ff4a02 880 * @brief Configures the SAI Tx audio format.
AnnaBridge 161:aa5281ff4a02 881 *
AnnaBridge 161:aa5281ff4a02 882 * The audio format can be changed at run-time. This function configures the sample rate and audio data
AnnaBridge 161:aa5281ff4a02 883 * format to be transferred.
AnnaBridge 161:aa5281ff4a02 884 *
AnnaBridge 161:aa5281ff4a02 885 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 886 * @param handle SAI handle pointer.
AnnaBridge 161:aa5281ff4a02 887 * @param format Pointer to the SAI audio data format structure.
AnnaBridge 161:aa5281ff4a02 888 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
AnnaBridge 161:aa5281ff4a02 889 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master
AnnaBridge 161:aa5281ff4a02 890 * clock, this value should equal the masterClockHz in format.
AnnaBridge 161:aa5281ff4a02 891 * @return Status of this function. Return value is the status_t.
AnnaBridge 161:aa5281ff4a02 892 */
AnnaBridge 161:aa5281ff4a02 893 status_t SAI_TransferTxSetFormat(I2S_Type *base,
AnnaBridge 161:aa5281ff4a02 894 sai_handle_t *handle,
AnnaBridge 161:aa5281ff4a02 895 sai_transfer_format_t *format,
AnnaBridge 161:aa5281ff4a02 896 uint32_t mclkSourceClockHz,
AnnaBridge 161:aa5281ff4a02 897 uint32_t bclkSourceClockHz);
AnnaBridge 161:aa5281ff4a02 898
AnnaBridge 161:aa5281ff4a02 899 /*!
AnnaBridge 161:aa5281ff4a02 900 * @brief Configures the SAI Rx audio format.
AnnaBridge 161:aa5281ff4a02 901 *
AnnaBridge 161:aa5281ff4a02 902 * The audio format can be changed at run-time. This function configures the sample rate and audio data
AnnaBridge 161:aa5281ff4a02 903 * format to be transferred.
AnnaBridge 161:aa5281ff4a02 904 *
AnnaBridge 161:aa5281ff4a02 905 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 906 * @param handle SAI handle pointer.
AnnaBridge 161:aa5281ff4a02 907 * @param format Pointer to the SAI audio data format structure.
AnnaBridge 161:aa5281ff4a02 908 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
AnnaBridge 161:aa5281ff4a02 909 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master
AnnaBridge 161:aa5281ff4a02 910 * clock, this value should equal the masterClockHz in format.
AnnaBridge 161:aa5281ff4a02 911 * @return Status of this function. Return value is one of status_t.
AnnaBridge 161:aa5281ff4a02 912 */
AnnaBridge 161:aa5281ff4a02 913 status_t SAI_TransferRxSetFormat(I2S_Type *base,
AnnaBridge 161:aa5281ff4a02 914 sai_handle_t *handle,
AnnaBridge 161:aa5281ff4a02 915 sai_transfer_format_t *format,
AnnaBridge 161:aa5281ff4a02 916 uint32_t mclkSourceClockHz,
AnnaBridge 161:aa5281ff4a02 917 uint32_t bclkSourceClockHz);
AnnaBridge 161:aa5281ff4a02 918
AnnaBridge 161:aa5281ff4a02 919 /*!
AnnaBridge 161:aa5281ff4a02 920 * @brief Performs an interrupt non-blocking send transfer on SAI.
AnnaBridge 161:aa5281ff4a02 921 *
AnnaBridge 161:aa5281ff4a02 922 * @note This API returns immediately after the transfer initiates.
AnnaBridge 161:aa5281ff4a02 923 * Call the SAI_TxGetTransferStatusIRQ to poll the transfer status and check whether
AnnaBridge 161:aa5281ff4a02 924 * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer
AnnaBridge 161:aa5281ff4a02 925 * is finished.
AnnaBridge 161:aa5281ff4a02 926 *
AnnaBridge 161:aa5281ff4a02 927 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 928 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 929 * @param xfer Pointer to the sai_transfer_t structure.
AnnaBridge 161:aa5281ff4a02 930 * @retval kStatus_Success Successfully started the data receive.
AnnaBridge 161:aa5281ff4a02 931 * @retval kStatus_SAI_TxBusy Previous receive still not finished.
AnnaBridge 161:aa5281ff4a02 932 * @retval kStatus_InvalidArgument The input parameter is invalid.
AnnaBridge 161:aa5281ff4a02 933 */
AnnaBridge 161:aa5281ff4a02 934 status_t SAI_TransferSendNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer);
AnnaBridge 161:aa5281ff4a02 935
AnnaBridge 161:aa5281ff4a02 936 /*!
AnnaBridge 161:aa5281ff4a02 937 * @brief Performs an interrupt non-blocking receive transfer on SAI.
AnnaBridge 161:aa5281ff4a02 938 *
AnnaBridge 161:aa5281ff4a02 939 * @note This API returns immediately after the transfer initiates.
AnnaBridge 161:aa5281ff4a02 940 * Call the SAI_RxGetTransferStatusIRQ to poll the transfer status and check whether
AnnaBridge 161:aa5281ff4a02 941 * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer
AnnaBridge 161:aa5281ff4a02 942 * is finished.
AnnaBridge 161:aa5281ff4a02 943 *
AnnaBridge 161:aa5281ff4a02 944 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 945 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 946 * @param xfer Pointer to the sai_transfer_t structure.
AnnaBridge 161:aa5281ff4a02 947 * @retval kStatus_Success Successfully started the data receive.
AnnaBridge 161:aa5281ff4a02 948 * @retval kStatus_SAI_RxBusy Previous receive still not finished.
AnnaBridge 161:aa5281ff4a02 949 * @retval kStatus_InvalidArgument The input parameter is invalid.
AnnaBridge 161:aa5281ff4a02 950 */
AnnaBridge 161:aa5281ff4a02 951 status_t SAI_TransferReceiveNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer);
AnnaBridge 161:aa5281ff4a02 952
AnnaBridge 161:aa5281ff4a02 953 /*!
AnnaBridge 161:aa5281ff4a02 954 * @brief Gets a set byte count.
AnnaBridge 161:aa5281ff4a02 955 *
AnnaBridge 161:aa5281ff4a02 956 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 957 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 958 * @param count Bytes count sent.
AnnaBridge 161:aa5281ff4a02 959 * @retval kStatus_Success Succeed get the transfer count.
AnnaBridge 161:aa5281ff4a02 960 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
AnnaBridge 161:aa5281ff4a02 961 */
AnnaBridge 161:aa5281ff4a02 962 status_t SAI_TransferGetSendCount(I2S_Type *base, sai_handle_t *handle, size_t *count);
AnnaBridge 161:aa5281ff4a02 963
AnnaBridge 161:aa5281ff4a02 964 /*!
AnnaBridge 161:aa5281ff4a02 965 * @brief Gets a received byte count.
AnnaBridge 161:aa5281ff4a02 966 *
AnnaBridge 161:aa5281ff4a02 967 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 968 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 969 * @param count Bytes count received.
AnnaBridge 161:aa5281ff4a02 970 * @retval kStatus_Success Succeed get the transfer count.
AnnaBridge 161:aa5281ff4a02 971 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
AnnaBridge 161:aa5281ff4a02 972 */
AnnaBridge 161:aa5281ff4a02 973 status_t SAI_TransferGetReceiveCount(I2S_Type *base, sai_handle_t *handle, size_t *count);
AnnaBridge 161:aa5281ff4a02 974
AnnaBridge 161:aa5281ff4a02 975 /*!
AnnaBridge 161:aa5281ff4a02 976 * @brief Aborts the current send.
AnnaBridge 161:aa5281ff4a02 977 *
AnnaBridge 161:aa5281ff4a02 978 * @note This API can be called any time when an interrupt non-blocking transfer initiates
AnnaBridge 161:aa5281ff4a02 979 * to abort the transfer early.
AnnaBridge 161:aa5281ff4a02 980 *
AnnaBridge 161:aa5281ff4a02 981 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 982 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 983 */
AnnaBridge 161:aa5281ff4a02 984 void SAI_TransferAbortSend(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 985
AnnaBridge 161:aa5281ff4a02 986 /*!
AnnaBridge 170:e95d10626187 987 * @brief Aborts the current IRQ receive.
AnnaBridge 161:aa5281ff4a02 988 *
AnnaBridge 161:aa5281ff4a02 989 * @note This API can be called when an interrupt non-blocking transfer initiates
AnnaBridge 161:aa5281ff4a02 990 * to abort the transfer early.
AnnaBridge 161:aa5281ff4a02 991 *
AnnaBridge 161:aa5281ff4a02 992 * @param base SAI base pointer
AnnaBridge 161:aa5281ff4a02 993 * @param handle Pointer to the sai_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 994 */
AnnaBridge 161:aa5281ff4a02 995 void SAI_TransferAbortReceive(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 996
AnnaBridge 161:aa5281ff4a02 997 /*!
AnnaBridge 161:aa5281ff4a02 998 * @brief Terminate all SAI send.
AnnaBridge 161:aa5281ff4a02 999 *
AnnaBridge 161:aa5281ff4a02 1000 * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the
AnnaBridge 161:aa5281ff4a02 1001 * current transfer slot, please call SAI_TransferAbortSend.
AnnaBridge 161:aa5281ff4a02 1002 *
AnnaBridge 161:aa5281ff4a02 1003 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 1004 * @param handle SAI eDMA handle pointer.
AnnaBridge 161:aa5281ff4a02 1005 */
AnnaBridge 161:aa5281ff4a02 1006 void SAI_TransferTerminateSend(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 1007
AnnaBridge 161:aa5281ff4a02 1008 /*!
AnnaBridge 161:aa5281ff4a02 1009 * @brief Terminate all SAI receive.
AnnaBridge 161:aa5281ff4a02 1010 *
AnnaBridge 161:aa5281ff4a02 1011 * This function will clear all transfer slots buffered in the sai queue. If users only want to abort the
AnnaBridge 161:aa5281ff4a02 1012 * current transfer slot, please call SAI_TransferAbortReceive.
AnnaBridge 161:aa5281ff4a02 1013 *
AnnaBridge 161:aa5281ff4a02 1014 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 1015 * @param handle SAI eDMA handle pointer.
AnnaBridge 161:aa5281ff4a02 1016 */
AnnaBridge 161:aa5281ff4a02 1017 void SAI_TransferTerminateReceive(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 1018
AnnaBridge 161:aa5281ff4a02 1019 /*!
AnnaBridge 161:aa5281ff4a02 1020 * @brief Tx interrupt handler.
AnnaBridge 161:aa5281ff4a02 1021 *
AnnaBridge 161:aa5281ff4a02 1022 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 1023 * @param handle Pointer to the sai_handle_t structure.
AnnaBridge 161:aa5281ff4a02 1024 */
AnnaBridge 161:aa5281ff4a02 1025 void SAI_TransferTxHandleIRQ(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 1026
AnnaBridge 161:aa5281ff4a02 1027 /*!
AnnaBridge 161:aa5281ff4a02 1028 * @brief Tx interrupt handler.
AnnaBridge 161:aa5281ff4a02 1029 *
AnnaBridge 161:aa5281ff4a02 1030 * @param base SAI base pointer.
AnnaBridge 161:aa5281ff4a02 1031 * @param handle Pointer to the sai_handle_t structure.
AnnaBridge 161:aa5281ff4a02 1032 */
AnnaBridge 161:aa5281ff4a02 1033 void SAI_TransferRxHandleIRQ(I2S_Type *base, sai_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 1034
AnnaBridge 161:aa5281ff4a02 1035 /*! @} */
AnnaBridge 161:aa5281ff4a02 1036
AnnaBridge 161:aa5281ff4a02 1037 #if defined(__cplusplus)
AnnaBridge 161:aa5281ff4a02 1038 }
AnnaBridge 161:aa5281ff4a02 1039 #endif /*_cplusplus*/
AnnaBridge 161:aa5281ff4a02 1040
AnnaBridge 161:aa5281ff4a02 1041 /*! @} */
AnnaBridge 161:aa5281ff4a02 1042
AnnaBridge 161:aa5281ff4a02 1043 #endif /* _FSL_SAI_H_ */