rt-thread-official/bsp/xplorer4330/libraries/lpc_ip/i2s_001.h

486 lines
20 KiB
C
Raw Normal View History

/*
* @brief I2S Registers and control functions
*
* @note
* Copyright(C) NXP Semiconductors, 2012
* All rights reserved.
*
* @par
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* LPC products. This software is supplied "AS IS" without any warranties of
* any kind, and NXP Semiconductors and its licensor disclaim any and
* all warranties, express or implied, including all implied warranties of
* merchantability, fitness for a particular purpose and non-infringement of
* intellectual property rights. NXP Semiconductors assumes no responsibility
* or liability for the use of the software, conveys no license or rights under any
* patent, copyright, mask work right, or any other intellectual property rights in
* or to any products. NXP Semiconductors reserves the right to make changes
* in the software without notification. NXP Semiconductors also makes no
* representation or warranty that such application will be suitable for the
* specified use without further testing or modification.
*
* @par
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors' and its
* licensor's relevant copyrights in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers. This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
*/
#ifndef __I2S_001_H_
#define __I2S_001_H_
#include "sys_config.h"
#include "cmsis.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @defgroup IP_I2S_001 IP: I2S register block and driver
* @ingroup IP_Drivers
* @{
*/
/**
* @brief I2S register block structure
*/
typedef struct { /*!< I2S Structure */
__IO uint32_t DAO; /*!< I2S Digital Audio Output Register. Contains control bits for the I2S transmit channel */
__IO uint32_t DAI; /*!< I2S Digital Audio Input Register. Contains control bits for the I2S receive channel */
__O uint32_t TXFIFO; /*!< I2S Transmit FIFO. Access register for the 8 x 32-bit transmitter FIFO */
__I uint32_t RXFIFO; /*!< I2S Receive FIFO. Access register for the 8 x 32-bit receiver FIFO */
__I uint32_t STATE; /*!< I2S Status Feedback Register. Contains status information about the I2S interface */
__IO uint32_t DMA1; /*!< I2S DMA Configuration Register 1. Contains control information for DMA request 1 */
__IO uint32_t DMA2; /*!< I2S DMA Configuration Register 2. Contains control information for DMA request 2 */
__IO uint32_t IRQ; /*!< I2S Interrupt Request Control Register. Contains bits that control how the I2S interrupt request is generated */
__IO uint32_t TXRATE; /*!< I2S Transmit MCLK divider. This register determines the I2S TX MCLK rate by specifying the value to divide PCLK by in order to produce MCLK */
__IO uint32_t RXRATE; /*!< I2S Receive MCLK divider. This register determines the I2S RX MCLK rate by specifying the value to divide PCLK by in order to produce MCLK */
__IO uint32_t TXBITRATE; /*!< I2S Transmit bit rate divider. This register determines the I2S transmit bit rate by specifying the value to divide TX_MCLK by in order to produce the transmit bit clock */
__IO uint32_t RXBITRATE; /*!< I2S Receive bit rate divider. This register determines the I2S receive bit rate by specifying the value to divide RX_MCLK by in order to produce the receive bit clock */
__IO uint32_t TXMODE; /*!< I2S Transmit mode control */
__IO uint32_t RXMODE; /*!< I2S Receive mode control */
} IP_I2S_001_Type;
/**
* @brief I2S configuration parameter defines
*/
/** I2S Wordwidth bit */
#define I2S_WORDWIDTH_8 (0UL << 0)
#define I2S_WORDWIDTH_16 (1UL << 0)
#define I2S_WORDWIDTH_32 (3UL << 0)
/** I2S Channel bit */
#define I2S_STEREO (0UL << 2)
#define I2S_MONO (1UL << 2)
/** I2S Master/Slave mode bit */
#define I2S_MASTER_MODE (0UL << 5)
#define I2S_SLAVE_MODE (1UL << 5)
/** I2S Stop bit */
#define I2S_STOP_ENABLE (0UL << 3)
#define I2S_STOP_DISABLE (1UL << 3)
/** I2S Reset bit */
#define I2S_RESET_ENABLE (1UL << 4)
#define I2S_RESET_DISABLE (0UL << 4)
/** I2S Mute bit */
#define I2S_MUTE_ENABLE (1UL << 15)
#define I2S_MUTE_DISABLE (0UL << 15)
/**
* @brief Macro defines for DAO-Digital Audio Output register
*/
/** I2S wordwide - the number of bytes in data*/
#define I2S_DAO_WORDWIDTH_8 ((uint32_t) (0)) /** 8 bit */
#define I2S_DAO_WORDWIDTH_16 ((uint32_t) (1)) /** 16 bit */
#define I2S_DAO_WORDWIDTH_32 ((uint32_t) (3)) /** 32 bit */
#define I2S_DAO_WORDWIDTH_MASK ((uint32_t) (3))
/** I2S control mono or stereo format */
#define I2S_DAO_MONO ((uint32_t) (1 << 2))
/** I2S control stop mode */
#define I2S_DAO_STOP ((uint32_t) (1 << 3))
/** I2S control reset mode */
#define I2S_DAO_RESET ((uint32_t) (1 << 4))
/** I2S control master/slave mode */
#define I2S_DAO_SLAVE ((uint32_t) (1 << 5))
/** I2S word select half period minus one */
#define I2S_DAO_WS_HALFPERIOD(n) ((uint32_t) ((n & 0x1FF) << 6))
#define I2S_DAO_WS_HALFPERIOD_MASK ((uint32_t) ((0x1FF) << 6))
/** I2S control mute mode */
#define I2S_DAO_MUTE ((uint32_t) (1 << 15))
/**
* @brief Macro defines for DAI-Digital Audio Input register
*/
/** I2S wordwide - the number of bytes in data*/
#define I2S_DAI_WORDWIDTH_8 ((uint32_t) (0)) /** 8 bit */
#define I2S_DAI_WORDWIDTH_16 ((uint32_t) (1)) /** 16 bit */
#define I2S_DAI_WORDWIDTH_32 ((uint32_t) (3)) /** 32 bit */
#define I2S_DAI_WORDWIDTH_MASK ((uint32_t) (3))
/** I2S control mono or stereo format */
#define I2S_DAI_MONO ((uint32_t) (1 << 2))
/** I2S control stop mode */
#define I2S_DAI_STOP ((uint32_t) (1 << 3))
/** I2S control reset mode */
#define I2S_DAI_RESET ((uint32_t) (1 << 4))
/** I2S control master/slave mode */
#define I2S_DAI_SLAVE ((uint32_t) (1 << 5))
/** I2S word select half period minus one (9 bits)*/
#define I2S_DAI_WS_HALFPERIOD(n) ((uint32_t) ((n & 0x1FF) << 6))
#define I2S_DAI_WS_HALFPERIOD_MASK ((uint32_t) ((0x1FF) << 6))
/**
* @brief Macro defines for STAT register (Status Feedback register)
*/
/** I2S Status Receive or Transmit Interrupt */
#define I2S_STATE_IRQ ((uint32_t) (1))
/** I2S Status Receive or Transmit DMA1 */
#define I2S_STATE_DMA1 ((uint32_t) (1 << 1))
/** I2S Status Receive or Transmit DMA2 */
#define I2S_STATE_DMA2 ((uint32_t) (1 << 2))
/** I2S Status Current level of the Receive FIFO (5 bits)*/
#define I2S_STATE_RX_LEVEL(n) ((uint32_t) ((n & 1F) << 8))
/** I2S Status Current level of the Transmit FIFO (5 bits)*/
#define I2S_STATE_TX_LEVEL(n) ((uint32_t) ((n & 1F) << 16))
/**
* @brief Macro defines for DMA1 register (DMA1 Configuration register)
*/
/** I2S control DMA1 for I2S receive */
#define I2S_DMA1_RX_ENABLE ((uint32_t) (1))
/** I2S control DMA1 for I2S transmit */
#define I2S_DMA1_TX_ENABLE ((uint32_t) (1 << 1))
/** I2S set FIFO level that trigger a receive DMA request on DMA1 */
#define I2S_DMA1_RX_DEPTH(n) ((uint32_t) ((n & 0x1F) << 8))
/** I2S set FIFO level that trigger a transmit DMA request on DMA1 */
#define I2S_DMA1_TX_DEPTH(n) ((uint32_t) ((n & 0x1F) << 16))
/**
* @brief Macro defines for DMA2 register (DMA2 Configuration register)
*/
/** I2S control DMA2 for I2S receive */
#define I2S_DMA2_RX_ENABLE ((uint32_t) (1))
/** I2S control DMA1 for I2S transmit */
#define I2S_DMA2_TX_ENABLE ((uint32_t) (1 << 1))
/** I2S set FIFO level that trigger a receive DMA request on DMA1 */
#define I2S_DMA2_RX_DEPTH(n) ((uint32_t) ((n & 0x1F) << 8))
/** I2S set FIFO level that trigger a transmit DMA request on DMA1 */
#define I2S_DMA2_TX_DEPTH(n) ((uint32_t) ((n & 0x1F) << 16))
/**
* @brief Macro defines for IRQ register (Interrupt Request Control register)
*/
/** I2S control I2S receive interrupt */
#define I2S_IRQ_RX_ENABLE ((uint32_t) (1))
/** I2S control I2S transmit interrupt */
#define I2S_IRQ_TX_ENABLE ((uint32_t) (1 << 1))
/** I2S set the FIFO level on which to create an irq request */
#define I2S_IRQ_RX_DEPTH(n) ((uint32_t) ((n & 0x0F) << 8))
#define I2S_IRQ_RX_DEPTH_MASK ((uint32_t) ((0x0F) << 8))
/** I2S set the FIFO level on which to create an irq request */
#define I2S_IRQ_TX_DEPTH(n) ((uint32_t) ((n & 0x0F) << 16))
#define I2S_IRQ_TX_DEPTH_MASK ((uint32_t) ((0x0F) << 16))
/**
* @brief Macro defines for TXRATE/RXRATE register (Transmit/Receive Clock Rate register)
*/
/** I2S Transmit MCLK rate denominator */
#define I2S_TXRATE_Y_DIVIDER(n) ((uint32_t) (n & 0xFF))
/** I2S Transmit MCLK rate denominator */
#define I2S_TXRATE_X_DIVIDER(n) ((uint32_t) ((n & 0xFF) << 8))
/** I2S Receive MCLK rate denominator */
#define I2S_RXRATE_Y_DIVIDER(n) ((uint32_t) (n & 0xFF))
/** I2S Receive MCLK rate denominator */
#define I2S_RXRATE_X_DIVIDER(n) ((uint32_t) ((n & 0xFF) << 8))
/**
* @brief Macro defines for TXBITRATE & RXBITRATE register (Transmit/Receive Bit Rate register)
*/
#define I2S_TXBITRATE(n) ((uint32_t) (n & 0x3F))
#define I2S_RXBITRATE(n) ((uint32_t) (n & 0x3F))
/**
* @brief Macro defines for TXMODE/RXMODE register (Transmit/Receive Mode Control register)
*/
/** I2S Transmit select clock source (2 bits)*/
#define I2S_TXMODE_CLKSEL(n) ((uint32_t) (n & 0x03))
/** I2S Transmit control 4-pin mode */
#define I2S_TXMODE_4PIN_ENABLE ((uint32_t) (1 << 2))
/** I2S Transmit control the TX_MCLK output */
#define I2S_TXMODE_MCENA ((uint32_t) (1 << 3))
/** I2S Receive select clock source */
#define I2S_RXMODE_CLKSEL(n) ((uint32_t) (n & 0x03))
/** I2S Receive control 4-pin mode */
#define I2S_RXMODE_4PIN_ENABLE ((uint32_t) (1 << 2))
/** I2S Receive control the TX_MCLK output */
#define I2S_RXMODE_MCENA ((uint32_t) (1 << 3))
/**
* @brief I2S transmit/receive mode for configuration
*/
typedef enum {
I2S_TX_MODE,
I2S_RX_MODE,
} IP_I2S_TRxMode_Type;
/**
* @brief I2S DMA request channel define
*/
typedef enum {
IP_I2S_DMA_REQUEST_NUMBER_1,
IP_I2S_DMA_REQUEST_NUMBER_2,
} IP_I2S_DMARequestNumber_Type;
/**********************************************************************************
* I2S Init/DeInit functions
*********************************************************************************/
/**
* @brief Initialize for I2S
* @param pI2S : The base of I2S peripheral on the chip
* @return Nothing
*/
void IP_I2S_Init(IP_I2S_001_Type *pI2S);
/**
* @brief Shutdown I2S
* @param pI2S : The base of I2S peripheral on the chip
* @return Nothing
* Reset all relative registers (DMA, transmit/receive control, interrupt) to default value
*/
void IP_I2S_DeInit(IP_I2S_001_Type *pI2S);
/**********************************************************************************
* I2S configuration functions
*********************************************************************************/
/**
* @brief Selects the number of bytes in data
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param wordwidth : Data width, should be :
* - I2S_WORDWIDTH_8
* - I2S_WORDWIDTH_16
* - I2S_WORDWIDTH_32
* @return Nothing
*/
void IP_I2S_SetWordWidth(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t wordwidth);
/**
* @brief Set I2S data format is monaural or stereo
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param mono : Data channel, should be
* - I2S_STEREO
* - I2S_MONO
* @return Nothing
*/
void IP_I2S_SetMono(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t mono);
/**
* @brief Set I2S interface in master/slave mode
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param mode : Interface mode, should be
* - I2S_MASTER_MODE
* - I2S_SLAVE_MODE
* @return Nothing
*/
void IP_I2S_SetMasterSlaveMode(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t mode);
/**
* @brief Set the clock frequency for I2S interface
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param mclk_divider : Clock divider. This value plus one is used to divide MCLK to produce the clock frequency for I2S interface
* @return Nothing
* The value depends on the audio sample rate desired and the data size and format(stereo/mono) used.
* For example, a 48 kHz sample rate for 16-bit stereo data requires a bit rate of 48 000 x 16 x 2 = 1.536 MHz. So the mclk_divider should be MCLK/1.536 MHz
*/
void IP_I2S_SetBitRate(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t mclk_divider);
/**
* @brief Set the MCLK rate by using a fractional rate generator, dividing down the frequency of PCLK
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param x_divider : I2S transmit MCLK rate numerator
* @param y_devider : I2S transmit MCLK rate denominator
* @return Nothing
* Values of the numerator (X) and the denominator (Y) must be chosen to
* produce a frequency twice that desired for the transmitter MCLK, which
* must be an integer multiple of the transmitter bit clock rate.
* The equation for the fractional rate generator is:
* MCLK = PCLK * (X/Y) /2
* Note: If the value of X or Y is 0, then no clock is generated. Also, the value of Y must be
* greater than or equal to X.
*/
void IP_I2S_SetXYDivider(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint8_t x_divider, uint8_t y_devider);
/**
* @brief Set word select (WS) half period
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param ws_halfperiod : I2S word select half period minus one
* @return Nothing
* The Word Select period is configured separately for I2S input and I2S output.
* For example: if the WS is 64clk period -> ws_halfperiod = 31
*/
void IP_I2S_SetWS_Halfperiod(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t ws_halfperiod);
/**
* @brief Set the I2S operating modes
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param clksel : Clock source selection for the receive bit clock divider
* @param fpin : Receive 4-pin mode selection
* @param mcena : Enable for the RX_MCLK output
* @return Nothing
* In addition to master and slave modes, which are independently configurable for
* the transmitter and the receiver, several different clock sources are possible,
* including variations that share the clock and/or WS between the transmitter and
* receiver. It also allows using I2S with fewer pins, typically four.
*/
void IP_I2S_ModeConfig(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t clksel, uint32_t fpin, uint32_t mcena);
/**
* @brief Get the current level of the Transmit/Receive FIFO
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return Current level of the Transmit/Receive FIFO
*/
uint8_t IP_I2S_GetLevel(IP_I2S_001_Type *pI2S, uint8_t TRMode);
/**********************************************************************************
* I2S operate functions
*********************************************************************************/
/**
* @brief Send a 32-bit data to TXFIFO for transmition
* @param pI2S : The base of I2S peripheral on the chip
* @param data : Data to be transmited
* @return Nothing
* The function writes to TXFIFO without checking any condition.
*/
void IP_I2S_Send(IP_I2S_001_Type *pI2S, uint32_t data);
/**
* @brief Get received data from RXFIFO
* @param pI2S : The base of I2S peripheral on the chip
* @return Data received in RXFIFO
* The function reads from RXFIFO without checking any condition.
*/
uint32_t IP_I2S_Receive(IP_I2S_001_Type *pI2S);
/**
* @brief Start the I2S
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return Nothing
*/
void IP_I2S_Start(IP_I2S_001_Type *pI2S, uint8_t TRMode);
/**
* @brief Disables accesses on FIFOs, places the transmit channel in mute mode
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return Nothing
*/
void IP_I2S_Pause(IP_I2S_001_Type *pI2S, uint8_t TRMode);
/**
* @brief Transmit channel sends only zeroes
* @param pI2S : The base of I2S peripheral on the chip
* @param NewState : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return Nothing
* The data output from I2S transmit channel is always zeroes
*/
void IP_I2S_Mute(IP_I2S_001_Type *pI2S, FunctionalState NewState);
/**
* @brief Stop I2S asynchronously
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return Nothing
* Pause, resets the transmit channel and FIFO asynchronously
*/
void IP_I2S_Stop(IP_I2S_001_Type *pI2S, uint8_t TRMode);
/**********************************************************************************
* I2S DMA functions
*********************************************************************************/
/**
* @brief Set the FIFO level on which to create an DMA request
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param DMANum : I2S DMA request number, should be
* - IP_I2S_DMA_REQUEST_NUMBER_1
* - IP_I2S_DMA_REQUEST_NUMBER_2
* @param depth : FIFO level on which to create an DMA request
* @return Nothing
* DMA request is generated when rx_depth_dma <= rx_level or tx_depth_dma >= tx_level
*/
void IP_I2S_SetFIFODepthDMA(IP_I2S_001_Type *pI2S, uint8_t TRMode, IP_I2S_DMARequestNumber_Type DMANum, uint32_t depth);
/**
* @brief Enable/Disable DMA for the I2S
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param DMANum : I2S DMA request number, should be
* - IP_I2S_DMA_REQUEST_NUMBER_1
* - IP_I2S_DMA_REQUEST_NUMBER_2
* @param NewState : ENABLE or DISABLE DMA
* @return Nothing
*/
void IP_I2S_DMACmd(IP_I2S_001_Type *pI2S, IP_I2S_DMARequestNumber_Type DMANum, uint8_t TRMode, FunctionalState NewState);
/**********************************************************************************
* I2S IRQ functions
*********************************************************************************/
/**
* @brief Enable/Disable interrupt for the I2S
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param NewState : ENABLE or DISABLE Interrupt
* @return Nothing
* Interrupt request is generated when rx_depth_irq <= rx_level or tx_depth_irq >= tx_level
*/
void IP_I2S_InterruptCmd(IP_I2S_001_Type *pI2S, uint8_t TRMode, FunctionalState NewState);
/**
* @brief Set the FIFO level on which to create an irq request
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @param depth : FIFO level on which to create an irq request
* @return Nothing
*/
void IP_I2S_SetFIFODepthIRQ(IP_I2S_001_Type *pI2S, uint8_t TRMode, uint32_t depth);
/**
* @brief Get the status of I2S interrupt
* @param pI2S : The base of I2S peripheral on the chip
* @param TRMode : Transmit/Receive mode, should be I2S_RX_MODE or I2S_TX_MODE
* @return I2S interrupt status, SET or RESET
*/
Status IP_I2S_GetIntStatus(IP_I2S_001_Type *pI2S, uint8_t TRMode);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __I2S_001_H_ */