Realtek/inc/peripheral/rtl876x_i2s.h
2025-11-25 10:21:47 +08:00

1113 lines
39 KiB
C

/**
*********************************************************************************************************
* Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved.
*********************************************************************************************************
* \file rtl876x_i2s.h
* \brief The header file of the peripheral I2S driver.
* \details This file provides all I2S firmware functions.
* \author elliot chen
* \date 2017-12-06
* \version v1.0
* *********************************************************************************************************
*/
#ifndef _RTL876x_I2S_H
#define _RTL876x_I2S_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup IO Peripheral Drivers
* \defgroup I2S I2S
*
* \brief Manage the I2S peripheral functions.
*
* \ingroup IO
*/
/*============================================================================*
* Includes
*============================================================================*/
#include "rtl876x.h"
/*============================================================================*
* Types
*============================================================================*/
/**
* \defgroup I2S_Exported_Types Inti Params Struct
*
* \ingroup I2S
*/
/**
* \brief I2S init structure definition.
*
* \ingroup I2S_Exported_Types
*/
typedef struct
{
uint32_t I2S_ClockSource; /*!< Specifies the I2S clock source.
This parameter can be a value of \ref I2S_Clock_Source*/
uint32_t I2S_BClockMi; /*!< Specifies the BLCK clock speed. BCLK = 40MHz*(I2S_BClockNi/I2S_BClockMi).
This parameter must range from 1 to 0xffff */
uint32_t I2S_BClockNi; /*!< Specifies the BLCK clock speed.
This parameter must range from 1 to 0x7FFF */
uint32_t I2S_DeviceMode; /*!< Specifies the I2S device mode.
This parameter can be a value of \ref I2S_device_mode*/
uint32_t I2S_ChannelType; /*!< Specifies the channel type used for the I2S communication.
This parameter can be a value of \ref I2S_Channel_Type */
uint32_t I2S_TxChSequence; /*!< Specifies the transmission channel seqence used for the I2S communication.
This parameter can be a value of \ref I2S_Tx_Ch_Sequence*/
uint32_t I2S_RxChSequence; /*!< Specifies the receiving channel seqence used for the I2S communication.
This parameter can be a value of \ref I2S_Rx_Ch_Sequence*/
uint32_t I2S_DataFormat; /*!< Specifies the I2S Data format mode.
This parameter can be a value of \ref I2S_Format_Mode*/
uint32_t I2S_TxBitSequence; /*!< Specifies the I2S Data bits sequences.
This parameter can be a value of \ref I2S_Tx_Bit_Sequence*/
uint32_t I2S_RxBitSequence; /*!< Specifies the I2S Data bits sequences.
This parameter can be a value of \ref I2S_Rx_Bit_Sequence*/
uint32_t I2S_DataWidth; /*!< Specifies the I2S Data width.
This parameter can be a value of \ref I2S_Data_Width */
uint32_t I2S_MCLKOutput; /*!< Specifies the I2S MCLK output freqency.
This parameter can be a value of \ref I2S_MCLK_Output */
uint32_t I2S_DMACmd; /*!< Specifies the I2S DMA control.
This parameter can be a value of \ref FunctionalState */
uint32_t I2S_TxWaterlevel; /*!< Specifies the dma watermark level in transmit mode.
This parameter must range from 1 to 63 */
uint32_t I2S_RxWaterlevel; /*!< Specifies the dma watermark level in receive mode.
This parameter must range from 1 to 63 */
} I2S_InitTypeDef;
/*============================================================================*
* Register Defines
*============================================================================*/
/* Peripheral: I2S */
/* Description: I2S register defines */
/* Register: CTRL0 -------------------------------------------------------*/
/* Description: Control register 0. Offset: 0x04. */
/* CTRL0[30]: I2S_MCLK_SEL. */
#define I2S_MCLK_SEL_POS (30)
#define I2S_MCLK_SEL_MSK (0x1 << I2S_MCLK_SEL_POS)
#define I2S_MCLK_SEL_CLR (~I2S_MCLK_SEL_MSK)
/* CTRL0[29:28]: I2S_RX_CH_SEQ. */
#define I2S_RX_CH_SEQ_POS (28)
#define I2S_RX_CH_SEQ_MSK (0x1 << I2S_RX_CH_SEQ_POS)
#define I2S_RX_CH_SEQ_CLR (~I2S_RX_CH_SEQ_MSK)
/* CTRL0[25]: I2S_START_RX. */
#define I2S_START_RX_POS (25)
#define I2S_START_RX_MSK (0x1 << I2S_START_RX_POS)
#define I2S_START_RX_CLR (~I2S_START_RX_MSK)
/* CTRL0[24]: I2S_RX_DISABLE. */
#define I2S_RX_DISABLE_POS (24)
#define I2S_RX_DISABLE_MSK (0x1 << I2S_RX_DISABLE_POS)
#define I2S_RX_DISABLE_CLR (~I2S_RX_DISABLE_MSK)
/* CTRL0[23]: I2S_RX_LSB_FIRST. */
#define I2S_RX_LSB_FIRST_POS (23)
#define I2S_RX_LSB_FIRST_MSK (0x1 << I2S_RX_LSB_FIRST_POS)
#define I2S_RX_LSB_FIRST_CLR (~I2S_RX_LSB_FIRST_MSK)
/* CTRL0[22]: I2S_TX_LSB_FIRST. */
#define I2S_TX_LSB_FIRST_POS (22)
#define I2S_TX_LSB_FIRST_MSK (0x1 << I2S_TX_LSB_FIRST_POS)
#define I2S_TX_LSB_FIRST_CLR (~I2S_TX_LSB_FIRST_MSK)
/* CTRL0[21:20]: I2S_TX_CH_SEQ. */
#define I2S_TX_CH_SEQ_POS (20)
#define I2S_TX_CH_SEQ_MSK (0x1 << I2S_TX_CH_SEQ_POS)
#define I2S_TX_CH_SEQ_CLR (~I2S_TX_CH_SEQ_MSK)
/* CTRL0[17]: I2S_START_TX. */
#define I2S_START_TX_POS (17)
#define I2S_START_TX_MSK (0x1 << I2S_START_TX_POS)
#define I2S_START_TX_CLR (~I2S_START_TX_MSK)
/* CTRL0[16]: I2S_TX_DISABLE. */
#define I2S_TX_DISABLE_POS (16)
#define I2S_TX_DISABLE_MSK (0x1 << I2S_TX_DISABLE_POS)
#define I2S_TX_DISABLE_CLR (~I2S_TX_DISABLE_MSK)
/* CTRL0[13:12]: I2S_DATA_WIDTH. */
#define I2S_DATA_WIDTH_POS (12)
#define I2S_DATA_WIDTH_MSK (0x3 << I2S_DATA_WIDTH_POS)
#define I2S_DATA_WIDTH_CLR (~I2S_DATA_WIDTH_MSK)
/* CTRL0[11]: I2S_CHANNEL_TYPE. */
#define I2S_CHANNEL_TYPE_POS (11)
#define I2S_CHANNEL_TYPE_MSK (0x1 << I2S_CHANNEL_TYPE_POS)
#define I2S_CHANNEL_TYPE_CLR (~I2S_CHANNEL_TYPE_MSK)
/* CTRL0[9:8]: I2S_DATA_FORMAT. */
#define I2S_DATA_FORMAT_POS (8)
#define I2S_DATA_FORMAT_MSK (0x3 << I2S_DATA_FORMAT_POS)
#define I2S_DATA_FORMAT_CLR (~I2S_DATA_FORMAT_MSK)
/* CTRL0[7]: I2S_CTRL_MODE. */
#define I2S_CTRL_MODE_POS (7)
#define I2S_CTRL_MODE_MSK (0x1 << I2S_CTRL_MODE_POS)
#define I2S_CTRL_MODE_CLR (~I2S_CTRL_MODE_MSK)
/* CTRL0[4]: I2S_SLAVE_DATA_SEL. */
#define I2S_SLAVE_DATA_SEL_POS (4)
#define I2S_SLAVE_DATA_SEL_MSK (0x1 << I2S_SLAVE_DATA_SEL_POS)
#define I2S_SLAVE_DATA_SEL_CLR (~I2S_SLAVE_DATA_SEL_MSK)
/* CTRL0[3]: I2S_SLAVE_CLK_SEL. */
#define I2S_SLAVE_CLK_SEL_POS (3)
#define I2S_SLAVE_CLK_SEL_MSK (0x1 << I2S_SLAVE_CLK_SEL_POS)
#define I2S_SLAVE_CLK_SEL_CLR (~I2S_SLAVE_CLK_SEL_MSK)
/* CTRL0[0]: I2S_RESET. */
#define I2S_RESET_POS (0)
#define I2S_RESET_MSK (0x1 << I2S_RESET_POS)
#define I2S_RESET_CLR (~I2S_RESET_MSK)
/* Register: CTRL1 -------------------------------------------------------*/
/* Description: Control register 1. Offset: 0x08. */
/* CTRL1[30]: I2S_TX_IDLE. */
#define I2S_TX_IDLE_POS (30)
#define I2S_TX_IDLE_MSK (0x1 << I2S_TX_IDLE_POS)
#define I2S_TX_IDLE_CLR (~I2S_TX_IDLE_MSK)
/* CTRL1[29]: I2S_RF_EMPTY. */
#define I2S_RF_EMPTY_POS (29)
#define I2S_RF_EMPTY_MSK (0x1 << I2S_RF_EMPTY_POS)
#define I2S_RF_EMPTY_CLR (~I2S_RF_EMPTY_MSK)
/* CTRL1[28]: I2S_TF_EMPTY. */
#define I2S_TF_EMPTY_POS (28)
#define I2S_TF_EMPTY_MSK (0x1 << I2S_TF_EMPTY_POS)
#define I2S_TF_EMPTY_CLR (~I2S_TF_EMPTY_MSK)
/* CTRL1[27]: I2S_RX_FULL. */
#define I2S_RX_FULL_POS (27)
#define I2S_RX_FULL_MSK (0x1 << I2S_RX_FULL_POS)
#define I2S_RX_FULL_CLR (~I2S_RX_FULL_MSK)
/* CTRL1[26]: I2S_TX_FULL. */
#define I2S_TX_FULL_POS (26)
#define I2S_TX_FULL_MSK (0x1 << I2S_TX_FULL_POS)
#define I2S_TX_FULL_CLR (~I2S_TX_FULL_MSK)
/* CTRL1[25]: I2S_READY_TO_RX. */
#define I2S_READY_TO_RX_POS (25)
#define I2S_READY_TO_RX_MSK (0x1 << I2S_READY_TO_RX_POS)
#define I2S_READY_TO_RX_CLR (~I2S_READY_TO_RX_MSK)
/* CTRL1[24]: I2S_READY_TO_TX. */
#define I2S_READY_TO_TX_POS (24)
#define I2S_READY_TO_TX_MSK (0x1 << I2S_READY_TO_TX_POS)
#define I2S_READY_TO_TX_CLR (~I2S_READY_TO_TX_MSK)
/* CTRL1[23]: I2S_RX_SNK_LR_SWAP. */
#define I2S_RX_SNK_LR_SWAP_POS (23)
#define I2S_RX_SNK_LR_SWAP_MSK (0x1 << I2S_RX_SNK_LR_SWAP_POS)
#define I2S_RX_SNK_LR_SWAP_CLR (~I2S_RX_SNK_LR_SWAP_MSK)
/* CTRL1[22]: I2S_RX_SNK_BYTE_SWAP. */
#define I2S_RX_SNK_BYTE_SWAP_POS (22)
#define I2S_RX_SNK_BYTE_SWAP_MSK (0x1 << I2S_RX_SNK_BYTE_SWAP_POS)
#define I2S_RX_SNK_BYTE_SWAP_CLR (~I2S_RX_SNK_BYTE_SWAP_MSK)
/* CTRL1[21]: I2S_TX_SRC_LR_SWAP. */
#define I2S_TX_SRC_LR_SWAP_POS (21)
#define I2S_TX_SRC_LR_SWAP_MSK (0x1 << I2S_TX_SRC_LR_SWAP_POS)
#define I2S_TX_SRC_LR_SWAP_CLR (~I2S_TX_SRC_LR_SWAP_MSK)
/* CTRL1[20]: I2S_TX_SRC_BYTE_SWAP. */
#define I2S_TX_SRC_BYTE_SWAP_POS (20)
#define I2S_TX_SRC_BYTE_SWAP_MSK (0x1 << I2S_TX_SRC_BYTE_SWAP_POS)
#define I2S_TX_SRC_BYTE_SWAP_CLR (~I2S_TX_SRC_BYTE_SWAP_MSK)
/* CTRL1[17]: I2S_CLK_128FS. */
#define I2S_CLK_128FS_POS (17)
#define I2S_CLK_128FS_MSK (0x1 << I2S_CLK_128FS_POS)
#define I2S_CLK_128FS_CLR (~I2S_CLK_128FS_MSK)
/* CTRL1[16]: I2S_CLK_40M. */
#define I2S_CLK_128_FS_POS (16)
#define I2S_CLK_128_FS_MSK (0x1 << I2S_CLK_128_FS_POS)
#define I2S_CLK_128_FS_CLR (~I2S_CLK_128_FS_MSK)
/* CTRL1[13]: I2S_CLR_RX_ERR_CNT. */
#define I2S_CLR_RX_ERR_CNT_POS (13)
#define I2S_CLR_RX_ERR_CNT_MSK (0x1 << I2S_CLR_RX_ERR_CNT_POS)
#define I2S_CLR_RX_ERR_CNT_CLR (~I2S_CLR_RX_ERR_CNT_MSK)
/* CTRL1[12]: I2S_CLR_TX_ERR_CNT. */
#define I2S_CLR_TX_ERR_CNT_POS (12)
#define I2S_CLR_TX_ERR_CNT_MSK (0x1 << I2S_CLR_TX_ERR_CNT_POS)
#define I2S_CLR_TX_ERR_CNT_CLR (~I2S_CLR_TX_ERR_CNT_MSK)
/* CTRL1[7:0]: I2S_FRAME_SYNC_OFFSET. */
#define I2S_FRAME_SYNC_OFFSET_POS (0)
#define I2S_FRAME_SYNC_OFFSET_MSK (0xFF << I2S_FRAME_SYNC_OFFSET_POS)
#define I2S_FRAME_SYNC_OFFSET_CLR (~I2S_FRAME_SYNC_OFFSET_MSK)
#define I2S_FRAME_SYNC_OFFSET_DEFAULT (0x81 << I2S_FRAME_SYNC_OFFSET_POS)
/* Register: DSP_INT_CR -------------------------------------------------------*/
/* Description:Interrupt clearregister. Offset: 0x0C. */
/* DSP_INT_CR[1]: I2S_RX_CLEAR_INT. */
#define I2S_RX_CLEAR_INT_POS (1)
#define I2S_RX_CLEAR_INT_MSK (0x1 << I2S_RX_CLEAR_INT_POS)
#define I2S_RX_CLEAR_INT_CLR (~I2S_RX_CLEAR_INT_MSK)
/* DSP_INT_CR[0]: I2S_TX_CLEAR_INT. */
#define I2S_TX_CLEAR_INT_POS (0)
#define I2S_TX_CLEAR_INT_MSK (0x1 << I2S_TX_CLEAR_INT_POS)
#define I2S_TX_CLEAR_INT_CLR (~I2S_TX_CLEAR_INT_MSK)
/* Register: FIFO_SR -------------------------------------------------------*/
/* Description: FIFO status register. Offset: 0x14. */
/* FIFO_SR[13:8]: I2S_RX_FIFO_DEPTH_CNT. */
#define I2S_RX_FIFO_DEPTH_CNT_POS (8)
#define I2S_RX_FIFO_DEPTH_CNT_MSK (0x3F << I2S_RX_FIFO_DEPTH_CNT_POS)
#define I2S_RX_FIFO_DEPTH_CNT_CLR (~I2S_RX_FIFO_DEPTH_CNT_MSK)
/* FIFO_SR[5:0]: I2S_TX_FIFO_DEPTH_CNT. */
#define I2S_TX_FIFO_DEPTH_CNT_POS (0)
#define I2S_TX_FIFO_DEPTH_CNT_MSK (0x3F << I2S_TX_FIFO_DEPTH_CNT_POS)
#define I2S_TX_FIFO_DEPTH_CNT_CLR (~I2S_TX_FIFO_DEPTH_CNT_MSK)
/* Register: ERROR_CNT_SR -------------------------------------------------------*/
/* Description: Error counter status register. Offset: 0x18. */
/* ERROR_CNT_SR[15:8]: I2S_RX_ERR_CNT. */
#define I2S_RX_ERR_CNT_POS (8)
#define I2S_RX_ERR_CNT_MSK (0xFF << I2S_RX_ERR_CNT_POS)
#define I2S_RX_ERR_CNT_CLR (~I2S_RX_ERR_CNT_MSK)
/* ERROR_CNT_SR[7:0]: I2S_TX_ERR_CNT. */
#define I2S_TX_ERR_CNT_POS (0)
#define I2S_TX_ERR_CNT_MSK (0xFF << I2S_TX_ERR_CNT_POS)
#define I2S_TX_ERR_CNT_CLR (~I2S_TX_ERR_CNT_MSK)
/* Register: BCLK_DIV -------------------------------------------------------*/
/* Description: BCLK divider register. Offset: 0x1C. */
/* BCLK_DIV[31]: I2S_MI_NI_UPDATE. */
#define I2S_MI_NI_UPDATE_POS (31)
#define I2S_MI_NI_UPDATE_MSK ((uint32_t)0x1 << I2S_MI_NI_UPDATE_POS)
#define I2S_MI_NI_UPDATE_CLR (~I2S_MI_NI_UPDATE_MSK)
/* BCLK_DIV[30:16]: I2S_BCLK_NI. */
#define I2S_BCLK_NI_POS (16)
#define I2S_BCLK_NI_MSK (0x7FFF << I2S_BCLK_NI_POS)
#define I2S_BCLK_NI_CLR (~I2S_BCLK_NI_MSK)
/* BCLK_DIV[15:0]: I2S_BCLK_MI. */
#define I2S_BCLK_MI_POS (0)
#define I2S_BCLK_MI_MSK (0xFFFF << I2S_BCLK_MI_POS)
#define I2S_BCLK_MI_CLR (~I2S_BCLK_MI_MSK)
/* Register: DMA_TRDLR -------------------------------------------------------*/
/* Description: DMA transmit receive data level register. Offset: 0x20. */
/* DMA_TRDLR[5:0]: I2S_TX_DMA_BURST_SIZE. */
#define I2S_TX_DMA_BURST_SIZE_POS (0)
#define I2S_TX_DMA_BURST_SIZE_MSK (0x3F << I2S_TX_DMA_BURST_SIZE_POS)
#define I2S_TX_DMA_BURST_SIZE_CLR (~I2S_TX_DMA_BURST_SIZE_MSK)
/* DMA_TRDLR[13:8]: I2S_RX_DMA_BURST_SIZE. */
#define I2S_RX_DMA_BURST_SIZE_POS (8)
#define I2S_RX_DMA_BURST_SIZE_MSK (0x3F << I2S_RX_DMA_BURST_SIZE_POS)
#define I2S_RX_DMA_BURST_SIZE_CLR (~I2S_RX_DMA_BURST_SIZE_MSK)
/* Register: PERIPH_AUDIO_CLK_224 -------------------------------------------------------*/
/* Description: peri on register. address: 0x40000224. */
#define PERIPH_AUDIO_CLK_224 0x40000224
/* PERIPH_AUDIO_CLK_224[3]: I2S0_EXT_CODEC. */
#define I2S0_EXT_CODEC_POS (3)
#define I2S0_EXT_CODEC_MSK (0x1 << I2S0_EXT_CODEC_POS)
#define I2S0_EXT_CODEC_CLR (~I2S0_EXT_CODEC_MSK)
/* Register: PERIPH_AUDIO_CLK_228 -------------------------------------------------------*/
/* Description: peri on register. address: 0x40000228. */
#define PERIPH_AUDIO_CLK_228 0x40000228
/* PERIPH_AUDIO_CLK_228[4]: I2S_MCLK_OUTPUT. */
#define I2S_MCLK_OUTPUT_POS (4)
#define I2S_MCLK_OUTPUT_MSK (0x1 << I2S_MCLK_OUTPUT_POS)
#define I2S_MCLK_OUTPUT_CLR (~I2S_MCLK_OUTPUT_MSK)
/*============================================================================*
* Constants
*============================================================================*/
/**
* \defgroup I2S_Exported_Constants Macro Defines
*
* \ingroup I2S
*/
#define IS_I2S_ALL_PERIPH(PERIPH) ((PERIPH) == I2S0)
/**
* \defgroup I2S_Clock_Source I2S Clock Source
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_CLK_40M (I2S_CLK_128_FS_MSK)
#define I2S_CLK_128fs (I2S_CLK_128FS_MSK)
#define I2S_CLK_256fs ((uint32_t)(0x00))
/** \} */
#define IS_I2S_CLK_SOURCE(CLK) (((CLK) == I2S_CLK_40M) || \
((CLK) == I2S_CLK_128fs) || \
((CLK) == I2S_CLK_256fs))
/**
* \defgroup I2S_Device_Mode I2S Device Mode
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_DeviceMode_Master ((uint32_t)0x00)
#define I2S_DeviceMode_Slave (I2S_SLAVE_DATA_SEL_MSK )//| I2S_SLAVE_CLK_SEL_MSK)
/** \} */
#define IS_I2S_DEVICE_MODE(DEVICE) (((DEVICE) == I2S_DeviceMode_Master) || ((DEVICE) == I2S_DeviceMode_Slave))
/**
* \defgroup I2S_Mode I2S Mode
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_MODE_TX (I2S_START_TX_MSK)
#define I2S_MODE_RX (I2S_START_RX_MSK)
/** \} */
#define IS_I2S_MODE(MODE) (((MODE) == I2S_MODE_TX) || ((MODE) == I2S_MODE_RX))
/**
* \defgroup I2S_Channel_Type I2S Channel Type
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_Channel_Mono (I2S_CHANNEL_TYPE_MSK)
#define I2S_Channel_stereo ((uint32_t)(0x0))
/** \} */
#define IS_I2S_CHANNEL_TYPE(TYPE) (((TYPE) == I2S_Channel_Mono) || ((TYPE) == I2S_Channel_stereo))
/**
* \defgroup I2S_Tx_Ch_Sequence I2S Transmission Channel Sequence
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_TX_CH_L_R (0)
#define I2S_TX_CH_R_L ((uint32_t)0x01 << I2S_TX_CH_SEQ_POS)
#define I2S_TX_CH_L_L ((uint32_t)0x02 << I2S_TX_CH_SEQ_POS)
#define I2S_TX_CH_R_R ((uint32_t)0x03 << I2S_TX_CH_SEQ_POS)
/** \} */
#define IS_I2S_TX_CH_SEQ(SEQ) (((SEQ) == I2S_TX_CH_L_R) || ((SEQ) == I2S_TX_CH_R_L) || \
((SEQ) == I2S_TX_CH_L_L) || ((SEQ) == I2S_TX_CH_R_R))
/**
* \defgroup I2S_Rx_Ch_Sequence I2S Receiving Channel Sequence
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_RX_CH_L_R (0)
#define I2S_RX_CH_R_L ((uint32_t)0x01 << I2S_RX_CH_SEQ_POS)
#define I2S_RX_CH_L_L ((uint32_t)0x02 << I2S_RX_CH_SEQ_POS)
#define I2S_RX_CH_R_R ((uint32_t)0x03 << I2S_RX_CH_SEQ_POS)
/** \} */
#define IS_I2S_RX_CH_SEQ(SEQ) (((SEQ) == I2S_RX_CH_L_R) || ((SEQ) == I2S_RX_CH_R_L) || \
((SEQ) == I2S_RX_CH_L_L) || ((SEQ) == I2S_RX_CH_R_R))
/**
* \defgroup I2S_Format_Mode I2S Format Mode
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_Mode ((uint32_t)(0x00 << I2S_DATA_FORMAT_POS))
#define Left_Justified_Mode ((uint32_t)(0x01 << I2S_DATA_FORMAT_POS))
#define PCM_Mode_A ((uint32_t)(0x02 << I2S_DATA_FORMAT_POS))
#define PCM_Mode_B ((uint32_t)(0x03 << I2S_DATA_FORMAT_POS))
/** \} */
#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_Mode) || ((FORMAT) == Left_Justified_Mode) || \
((FORMAT) == PCM_Mode_A) || ((FORMAT) == PCM_Mode_B))
/**
* \defgroup I2S_Tx_Bit_Sequence I2S Tx Bit Sequence
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_TX_MSB_First ((uint32_t)0x0)
#define I2S_TX_LSB_First (I2S_TX_LSB_FIRST_MSK)
/** \} */
#define IS_I2S_TX_BIT_SEQ(SEQ) (((SEQ) == I2S_TX_MSB_First) || ((SEQ) == I2S_TX_LSB_First))
/**
* \defgroup I2S_Rx_Bit_Sequence I2S Rx Bit Sequence
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_RX_MSB_First ((uint32_t)0x0)
#define I2S_RX_LSB_First (I2S_RX_LSB_FIRST_MSK)
/** \} */
#define IS_I2S_RX_BIT_SEQ(SEQ) (((SEQ) == I2S_RX_MSB_First) || ((SEQ) == I2S_RX_LSB_First))
/**
* \defgroup I2S_Data_Width I2S Data Width
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_Width_16Bits ((uint32_t)(0x00 << I2S_DATA_WIDTH_POS))
#define I2S_Width_24Bits ((uint32_t)(0x02 << I2S_DATA_WIDTH_POS))
#define I2S_Width_8Bits ((uint32_t)(0x03 << I2S_DATA_WIDTH_POS))
/** \} */
#define IS_I2S_DATA_WIDTH(WIDTH) (((WIDTH) == I2S_Width_16Bits) || \
((WIDTH) == I2S_Width_24Bits) || \
((WIDTH) == I2S_Width_8Bits))
/**
* \defgroup I2S_MCLK_Output I2S MCLK Output
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_MCLK_128fs ((uint32_t)0x0)
#define I2S_MCLK_256fs (I2S_MCLK_SEL_MSK)
/** \} */
#define IS_I2S_MCLK_OUTPUT_TYPE(TYPE) (((TYPE) == I2S_MCLK_128fs) || ((TYPE) == I2S_MCLK_256fs))
/**
* \defgroup I2S_DMA_Cmd I2S DMA Cmd
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_DMA_ENABLE ((uint32_t)0x0)
#define I2S_DMA_DISABLE (I2S_CTRL_MODE_MSK)
/** \} */
#define IS_I2S_DMA_CMD(CMD) (((CMD) == I2S_DMA_ENABLE) || ((CMD) == I2S_DMA_DISABLE))
/**
* \defgroup I2S_Interrupt_Definition I2S Interrupt Definition
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_INT_TX_IDLE (I2S_TX_IDLE_MSK)
#define I2S_INT_RF_EMPTY (I2S_RF_EMPTY_MSK)
#define I2S_INT_TF_EMPTY (I2S_TF_EMPTY_MSK)
#define I2S_INT_RF_FULL (I2S_RX_FULL_MSK)
#define I2S_INT_TF_FULL (I2S_TX_FULL_MSK)
#define I2S_INT_RX_READY (I2S_READY_TO_RX_MSK)
#define I2S_INT_TX_READY (I2S_READY_TO_TX_MSK)
/** \} */
#define IS_I2S_INT_CONFIG(INT) (((INT) == I2S_INT_TX_IDLE) || ((INT) == I2S_INT_RF_EMPTY) || \
((INT) == I2S_INT_TF_EMPTY) || ((INT) == I2S_INT_RF_FULL) || \
((INT) == I2S_INT_TF_FULL) || ((INT) == I2S_INT_RX_READY) || \
((INT) == I2S_INT_TX_READY) )
/**
* \defgroup I2S_Clear_Interrupt_Definition I2S Clear Interrupt Definition
* \{
* \ingroup I2S_Exported_Constants
*/
#define I2S_CLEAR_INT_RX_READY (I2S_RX_CLEAR_INT_MSK)
#define I2S_CLEAR_INT_TX_READY (I2S_TX_CLEAR_INT_MSK)
/** \} */
#define IS_I2S_CLEAR_INT(CLEAR) (((CLEAR) == I2S_CLEAR_INT_RX_READY) || \
((CLEAR) == I2S_CLEAR_INT_TX_READY) )
/*============================================================================*
* Functions
*============================================================================*/
/**
* \defgroup I2S_Exported_Functions Peripheral APIs
* \{
* \ingroup I2S
*/
/**
* \brief Deinitializes the I2S peripheral registers to their default values.
* \param None.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void driver_i2s_init(void)
* {
* I2S_DeInit(I2S0);
* }
* \endcode
*/
void I2S_DeInit(I2S_TypeDef *I2Sx);
/**
* \brief Initializes the I2S peripheral according to the specified
* parameters in the I2S_InitStruct
* \param[in] I2Sx: Selected I2S peripheral.
* \param[in] I2S_InitStruct: Pointer to a I2S_InitTypeDef structure that
* contains the configuration information for the specified I2S peripheral
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void driver_i2s_init(void)
* {
* RCC_PeriphClockCmd(APB_I2S, APB_I2S_CLOCK, ENABLE);
*
* I2S_InitTypeDef I2S_InitStruct;
*
* I2S_StructInit(&I2S_InitStruct);
* I2S_InitStruct.I2S_ClockSource = I2S_CLK_40M;
* I2S_InitStruct.I2S_BClockMi = 0x271;
* I2S_InitStruct.I2S_BClockNi = 0x10;
* I2S_InitStruct.I2S_DeviceMode = I2S_DeviceMode_Master;
* I2S_InitStruct.I2S_ChannelType = I2S_Channel_stereo;
* I2S_InitStruct.I2S_DataWidth = I2S_Width_16Bits;
* I2S_InitStruct.I2S_DataFormat = I2S_Mode;
* I2S_InitStruct.I2S_DMACmd = I2S_DMA_DISABLE;
* I2S_Init(I2S0, &I2S_InitStruct);
* I2S_Cmd(I2S0, I2S_MODE_TX, ENABLE);
* }
* \endcode
*/
void I2S_Init(I2S_TypeDef *I2Sx, I2S_InitTypeDef *I2S_InitStruct);
/**
* \brief Fills each I2S_InitStruct member with its default value.
* \param[in] I2S_InitStruct: Pointer to an I2S_InitTypeDef structure which will be initialized.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void driver_i2s_init(void)
* {
* RCC_PeriphClockCmd(APB_I2S, APB_I2S_CLOCK, ENABLE);
*
* I2S_InitTypeDef I2S_InitStruct;
*
* I2S_StructInit(&I2S_InitStruct);
* I2S_InitStruct.I2S_ClockSource = I2S_CLK_40M;
* I2S_InitStruct.I2S_BClockMi = 0x271;
* I2S_InitStruct.I2S_BClockNi = 0x10;
* I2S_InitStruct.I2S_DeviceMode = I2S_DeviceMode_Master;
* I2S_InitStruct.I2S_ChannelType = I2S_Channel_stereo;
* I2S_InitStruct.I2S_DataWidth = I2S_Width_16Bits;
* I2S_InitStruct.I2S_DataFormat = I2S_Mode;
* I2S_InitStruct.I2S_DMACmd = I2S_DMA_DISABLE;
* I2S_Init(I2S0, &I2S_InitStruct);
* I2S_Cmd(I2S0, I2S_MODE_TX, ENABLE);
* }
* \endcode
*/
void I2S_StructInit(I2S_InitTypeDef *I2S_InitStruct);
/**
* \brief Enable or disable the selected I2S mode.
* \param[in] I2Sx: Selected I2S peripheral.
* \param[in] mode: Selected I2S operation mode.
* This parameter can be the following values:
* \arg I2S_MODE_TX: Transmission mode.
* \arg I2S_MODE_RX: Receiving mode.
* \param[in] NewState: New state of the operation mode.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void driver_i2s_init(void)
* {
* RCC_PeriphClockCmd(APB_I2S, APB_I2S_CLOCK, ENABLE);
*
* I2S_InitTypeDef I2S_InitStruct;
*
* I2S_StructInit(&I2S_InitStruct);
* I2S_InitStruct.I2S_ClockSource = I2S_CLK_40M;
* I2S_InitStruct.I2S_BClockMi = 0x271;
* I2S_InitStruct.I2S_BClockNi = 0x10;
* I2S_InitStruct.I2S_DeviceMode = I2S_DeviceMode_Master;
* I2S_InitStruct.I2S_ChannelType = I2S_Channel_stereo;
* I2S_InitStruct.I2S_DataWidth = I2S_Width_16Bits;
* I2S_InitStruct.I2S_DataFormat = I2S_Mode;
* I2S_InitStruct.I2S_DMACmd = I2S_DMA_DISABLE;
* I2S_Init(I2S_NUM, &I2S_InitStruct);
* I2S_Cmd(I2S_NUM, I2S_MODE_TX, ENABLE);
* }
* \endcode
*/
void I2S_Cmd(I2S_TypeDef *I2Sx, uint32_t mode, FunctionalState NewState);
/**
* \brief Enable or disable the specified I2S interrupt source.
* \param[in] I2S_INT: Specifies the I2S interrupt source to be enable or disable.
* This parameter can be the following values:
* \arg I2S_INT_TX_IDLE: Transmit idle interrupt source.
* \arg I2S_INT_RF_EMPTY: Receive FIFO empty interrupt source.
* \arg I2S_INT_TF_EMPTY: Transmit FIFO empty interrupt source.
* \arg I2S_INT_RF_FULL: Receive FIFO full interrupt source.
* \arg I2S_INT_TF_FULL: Transmit FIFO full interrupt source.
* \arg I2S_INT_RX_READY: Ready to receive interrupt source.
* \arg I2S_INT_TX_READY: Ready to transmit interrupt source.
* \param[in] NewState: New state of the specified I2S interrupt.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_INTConfig(I2S0, I2S_INT_TF_EMPTY, ENABLE);
* }
* \endcode
*/
void I2S_INTConfig(I2S_TypeDef *I2Sx, uint32_t I2S_INT, FunctionalState newState);
/**
* \brief Get the specified I2S interrupt status.
* \param[in] I2S_INT: the specified I2S interrupt.
* This parameter can be one of the following values:
* \arg I2S_INT_TX_IDLE: Transmit idle interrupt.
* \arg I2S_INT_RF_EMPTY: Receive FIFO empty interrupt.
* \arg I2S_INT_TF_EMPTY: Transmit FIFO empty interrupt.
* \arg I2S_INT_RF_FULL: Receive FIFO full interrupt.
* \arg I2S_INT_TF_FULL: Transmit FIFO full interrupt.
* \arg I2S_INT_RX_READY: Ready to receive interrupt.
* \arg I2S_INT_TX_READY: Ready to transmit interrupt.
* \return The new state of I2S_INT (SET or RESET).
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* ITStatus int_status = I2S_GetINTStatus(I2S0, I2S_INT_TF_EMPTY);
* }
* \endcode
*/
ITStatus I2S_GetINTStatus(I2S_TypeDef *I2Sx, uint32_t I2S_INT);
/**
* \brief Clear the I2S interrupt pending bit.
* \param[in] I2S_CLEAR_INT: Specifies the interrupt pending bit to clear.
* This parameter can be any combination of the following values:
* \arg I2S_CLEAR_INT_RX_READY: Clear ready to receive interrupt.
* \arg I2S_CLEAR_INT_TX_READY: Clear ready to transmit interrupt.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_ClearINTPendingBit(I2S0, I2S_CLEAR_INT_RX_READY);
* }
* \endcode
*/
void I2S_ClearINTPendingBit(I2S_TypeDef *I2Sx, uint32_t I2S_CLEAR_INT);
/**
* \brief Transmits a data through the SPIx/I2Sx peripheral.
* \param[in] I2Sx: To select the I2Sx peripheral, x can be 0.
* \param[in] Data: Data to be transmitted.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_SendData(I2S0, 0x02);
* }
* \endcode
*/
__STATIC_INLINE void I2S_SendData(I2S_TypeDef *I2Sx, uint32_t Data)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
I2Sx->TX_DR = Data;
}
/**
* \brief Received data by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \return Return the most recent received data.
* \
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* uint32_t data = I2S_ReceiveData(I2S0);
* }
* \endcode
*/
__STATIC_INLINE uint32_t I2S_ReceiveData(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
return I2Sx->RX_DR;
}
/**
* \brief Get transmit FIFO free length by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \return Return the transmit FIFO free length.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* uint8_t data_len = I2S_GetTxFIFOFreeLen(I2S0);
* }
* \endcode
*/
__STATIC_INLINE uint8_t I2S_GetTxFIFOFreeLen(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
return ((I2Sx->FIFO_SR & I2S_TX_FIFO_DEPTH_CNT_MSK) >> I2S_TX_FIFO_DEPTH_CNT_POS);
}
/**
* \brief Get receive FIFO data length by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \return The data length of the receive FIFO.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* uint8_t data_len = I2S_GetRxFIFOLen(I2S0);
* }
* \endcode
*/
__STATIC_INLINE uint8_t I2S_GetRxFIFOLen(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
return ((I2Sx->FIFO_SR & I2S_RX_FIFO_DEPTH_CNT_MSK) >> I2S_RX_FIFO_DEPTH_CNT_POS);
}
/**
* \brief Get the send error counter value by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \return The send error counter value .
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* uint8_t conter = I2S_GetTxErrCnt(I2S0);
* }
* \endcode
*/
__STATIC_INLINE uint8_t I2S_GetTxErrCnt(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
return ((I2Sx->ERROR_CNT_SR & I2S_TX_ERR_CNT_MSK) >> I2S_TX_ERR_CNT_POS);
}
/**
* \brief Get the reception error counter value by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \retval The reception error counter value .
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* uint8_t conter = I2S_GetRxErrCnt(I2S0);
* }
* \endcode
*/
__STATIC_INLINE uint8_t I2S_GetRxErrCnt(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
return ((I2Sx->ERROR_CNT_SR & I2S_RX_ERR_CNT_MSK) >> I2S_RX_ERR_CNT_POS);
}
/**
* \brief Swap audio data bytes sequence which sent by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] NewState: New state of the bytes sequence.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_SwapBytesForSend(I2S0, ENABLE);
* }
* \endcode
*/
__STATIC_INLINE void I2S_SwapBytesForSend(I2S_TypeDef *I2Sx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (NewState == ENABLE)
{
I2Sx->CTRL1 |= I2S_TX_SRC_BYTE_SWAP_MSK;
}
else
{
I2Sx->CTRL1 &= I2S_TX_SRC_BYTE_SWAP_CLR;
}
}
/**
* \brief Swap audio data bytes sequence which read by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] NewState: New state of the bytes sequence.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_SwapBytesForRead(I2S0, ENABLE);
* }
* \endcode
*/
__STATIC_INLINE void I2S_SwapBytesForRead(I2S_TypeDef *I2Sx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (NewState == ENABLE)
{
I2Sx->CTRL1 |= I2S_RX_SNK_BYTE_SWAP_MSK;
}
else
{
I2Sx->CTRL1 &= I2S_RX_SNK_BYTE_SWAP_CLR;
}
}
/**
* \brief Swap audio channel data which sent by the I2Sx peripheral..
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] NewState: New state of the left and right channel data sequence.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_SwapLRChDataForSend(I2S0, ENABLE);
* }
* \endcode
*/
__STATIC_INLINE void I2S_SwapLRChDataForSend(I2S_TypeDef *I2Sx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (NewState == ENABLE)
{
I2Sx->CTRL1 |= I2S_TX_SRC_LR_SWAP_MSK;
}
else
{
I2Sx->CTRL1 &= I2S_TX_SRC_LR_SWAP_CLR;
}
}
/**
* \brief Swap audio channel data which read by the I2Sx peripheral.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] NewState: New state of the left and right channel data sequence.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_SwapLRChDataForRead(I2S0, ENABLE);
* }
* \endcode
*/
__STATIC_INLINE void I2S_SwapLRChDataForRead(I2S_TypeDef *I2Sx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (NewState == ENABLE)
{
I2Sx->CTRL1 |= I2S_RX_SNK_LR_SWAP_MSK;
}
else
{
I2Sx->CTRL1 &= I2S_RX_SNK_LR_SWAP_CLR;
}
}
/**
* \brief MCLK output selection which can be from I2S0.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] NewState: New state of MCLK output.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_MCLKOutputSelectCmd(I2S0);
* }
* \endcode
*/
__STATIC_INLINE void I2S_MCLKOutputSelectCmd(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (I2Sx == I2S0)
{
*((volatile uint32_t *)PERIPH_AUDIO_CLK_228) |= I2S_MCLK_OUTPUT_MSK;
}
}
/**
* \brief I2S0 communication selection which can be from intrnal codec or external codec.
* \param[in] NewState: New state of I2S0 communication selection.
* This parameter can be: ENABLE or DISABLE.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S0_WithExtCodecCmd(ENABLE);
* }
* \endcode
*/
__STATIC_INLINE void I2S0_WithExtCodecCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState == ENABLE)
{
*((volatile uint32_t *)PERIPH_AUDIO_CLK_224) |= I2S0_EXT_CODEC_MSK;
}
else
{
*((volatile uint32_t *)PERIPH_AUDIO_CLK_224) &= I2S0_EXT_CODEC_CLR;
}
}
/**
* \brief Config BClk clock.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] I2S_BClockMi: Mi parameter.
* \param[in] I2S_BClockNi: Ni parameter.
* \return Execution status.
* \retval SET: Success.
* \retval RESET: Failure.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* FlagStatus status = I2S_UpdateBClk(I2S0, 0x271, 0x10);
* }
* \endcode
*/
__STATIC_INLINE FlagStatus I2S_UpdateBClk(I2S_TypeDef *I2Sx, uint16_t I2S_BClockMi,
uint16_t I2S_BClockNi)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (!(I2Sx->BCLK_DIV & I2S_MI_NI_UPDATE_MSK))
{
I2Sx->BCLK_DIV = I2S_BClockMi | (I2S_BCLK_NI_MSK & (I2S_BClockNi << I2S_BCLK_NI_POS)) |
I2S_MI_NI_UPDATE_MSK;
return SET;
}
return RESET;
}
/**
* \brief Get BClk clock status.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \return Execution status.
* \retval SET: BLCK is updating.
* \retval RESET: BLCK update is done.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* FlagStatus status = I2S_GetBClkStatus(I2S0);
* }
* \endcode
*/
__STATIC_INLINE FlagStatus I2S_GetBClkStatus(I2S_TypeDef *I2Sx)
{
/* Check the parameters */
assert_param(IS_I2S_ALL_PERIPH(I2Sx));
if (I2Sx->BCLK_DIV & I2S_MI_NI_UPDATE_MSK)
{
return SET;
}
return RESET;
}
/**
* \brief Config channel type.
* \param[in] I2Sx: To select I2Sx peripheral, where x can be: 0.
* \param[in] I2S_ChannelType: The channel type used for the I2S communication.
* This parameter can be one of the following values:
* \arg I2S_Channel_Mono: Mono channel.
* \arg I2S_Channel_stereo: Stereo channel.
* \return None.
*
* <b>Example usage</b>
* \code{.c}
*
* void i2s_demo(void)
* {
* I2S_ConfigChannelType(I2S0, I2S_Channel_Mono);
* }
* \endcode
*/
__STATIC_INLINE void I2S_ConfigChannelType(I2S_TypeDef *I2Sx, uint32_t I2S_ChannelType)
{
I2Sx->CTRL0 &= I2S_CHANNEL_TYPE_CLR;
I2Sx->CTRL0 |= I2S_ChannelType;
}
/** \} */ /*End of group I2S_Exported_Functions */
#ifdef __cplusplus
}
#endif
#endif /* _RTL876x_I2S_H_ */
/******************* (C) COPYRIGHT 2017 Realtek Semiconductor Corporation *****END OF FILE****/