LINKED LIST TEST on mbed

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lpc17xx_i2s.c Source File

lpc17xx_i2s.c

Go to the documentation of this file.
00001 /***********************************************************************//**
00002  * @file        lpc17xx_i2s.c
00003  * @brief        Contains all functions support for I2S firmware library on LPC17xx
00004  * @version        3.0
00005  * @date        18. June. 2010
00006  * @author        NXP MCU SW Application Team
00007  **************************************************************************
00008  * Software that is described herein is for illustrative purposes only
00009  * which provides customers with programming information regarding the
00010  * products. This software is supplied "AS IS" without any warranties.
00011  * NXP Semiconductors assumes no responsibility or liability for the
00012  * use of the software, conveys no license or title under any patent,
00013  * copyright, or mask work right to the product. NXP Semiconductors
00014  * reserves the right to make changes in the software without
00015  * notification. NXP Semiconductors also make no representation or
00016  * warranty that such application will be suitable for the specified
00017  * use without further testing or modification.
00018  **********************************************************************/
00019 
00020 /* Peripheral group ----------------------------------------------------------- */
00021 /** @addtogroup I2S
00022  * @{
00023  */
00024 
00025 /* Includes ------------------------------------------------------------------- */
00026 //#include "mbed.h"
00027 #include "lpc17xx_i2s.h"
00028 #include "lpc17xx_clkpwr.h"
00029 #include "mbed.h"
00030 
00031 
00032 /* If this source file built with example, the LPC17xx FW library configuration
00033  * file in each example directory ("lpc17xx_libcfg.h") must be included,
00034  * otherwise the default FW library configuration file must be included instead
00035  */
00036 #ifdef __BUILD_WITH_EXAMPLE__
00037 #include "lpc17xx_libcfg.h"
00038 #else
00039 #include "lpc17xx_libcfg_default.h"
00040 #endif /* __BUILD_WITH_EXAMPLE__ */
00041 
00042 
00043 #ifdef _I2S
00044 
00045 /* Private Functions ---------------------------------------------------------- */
00046 
00047 static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode);
00048 static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode);
00049 
00050 /********************************************************************//**
00051  * @brief        Get I2S wordwidth value
00052  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00053  * @param[in]    TRMode is the I2S mode, should be:
00054  *                 - I2S_TX_MODE = 0: transmit mode
00055  *                 - I2S_RX_MODE = 1: receive mode
00056  * @return         The wordwidth value, should be: 8,16 or 32
00057  *********************************************************************/
00058 static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) {
00059     uint8_t value;
00060 
00061     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00062     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00063 
00064     if (TRMode == I2S_TX_MODE) {
00065         value = (I2Sx->I2SDAO) & 0x03; /* get wordwidth bit */
00066     } else {
00067         value = (I2Sx->I2SDAI) & 0x03; /* get wordwidth bit */
00068     }
00069     switch (value) {
00070     case I2S_WORDWIDTH_8:
00071         return 8;
00072     case I2S_WORDWIDTH_16:
00073         return 16;
00074     default:
00075         return 32;
00076     }
00077 }
00078 
00079 /********************************************************************//**
00080  * @brief        Get I2S channel value
00081  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00082  * @param[in]    TRMode is the I2S mode, should be:
00083  *                 - I2S_TX_MODE = 0: transmit mode
00084  *                 - I2S_RX_MODE = 1: receive mode
00085  * @return         The channel value, should be: 1(mono) or 2(stereo)
00086  *********************************************************************/
00087 static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) {
00088     uint8_t value;
00089 
00090     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00091     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00092 
00093     if (TRMode == I2S_TX_MODE) {
00094         value = (I2Sx->I2SDAO) & 0x04; /* get bit[2] */
00095     } else {
00096         value = (I2Sx->I2SDAI) & 0x04; /* get bit[2] */
00097     }
00098         if(value == I2S_MONO) return 1;
00099           return 2;
00100 }
00101 
00102 /* End of Private Functions --------------------------------------------------- */
00103 
00104 
00105 /* Public Functions ----------------------------------------------------------- */
00106 /** @addtogroup I2S_Public_Functions
00107  * @{
00108  */
00109 
00110 /********************************************************************//**
00111  * @brief        Initialize I2S
00112  *                     - Turn on power and clock
00113  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00114  * @return         none
00115  *********************************************************************/
00116 void I2S_Init(LPC_I2S_TypeDef *I2Sx) {
00117     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00118 
00119     // Turn on power and clock
00120     CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, ENABLE);
00121     LPC_I2S->I2SDAI = LPC_I2S->I2SDAO = 0x00;
00122 }
00123 
00124 /********************************************************************//**
00125  * @brief        Configuration I2S, setting:
00126  *                     - master/slave mode
00127  *                     - wordwidth value
00128  *                     - channel mode
00129  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00130  * @param[in]    TRMode transmit/receive mode, should be:
00131  *                     - I2S_TX_MODE = 0: transmit mode
00132  *                     - I2S_RX_MODE = 1: receive mode
00133  * @param[in]    ConfigStruct pointer to I2S_CFG_Type structure
00134  *              which will be initialized.
00135  * @return         none
00136  *********************************************************************/
00137 void I2S_Config(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, I2S_CFG_Type* ConfigStruct)
00138 {
00139     uint32_t bps, config;
00140 
00141     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00142 
00143     CHECK_PARAM(PARAM_I2S_WORDWIDTH(ConfigStruct->wordwidth));
00144     CHECK_PARAM(PARAM_I2S_CHANNEL(ConfigStruct->mono));
00145     CHECK_PARAM(PARAM_I2S_STOP(ConfigStruct->stop));
00146     CHECK_PARAM(PARAM_I2S_RESET(ConfigStruct->reset));
00147     CHECK_PARAM(PARAM_I2S_WS_SEL(ConfigStruct->ws_sel));
00148     CHECK_PARAM(PARAM_I2S_MUTE(ConfigStruct->mute));
00149 
00150     /* Setup clock */
00151     bps = (ConfigStruct->wordwidth +1)*8;
00152 
00153     /* Calculate audio config */
00154     config = (bps - 1)<<6 | (ConfigStruct->ws_sel)<<5 | (ConfigStruct->reset)<<4 |
00155         (ConfigStruct->stop)<<3 | (ConfigStruct->mono)<<2 | (ConfigStruct->wordwidth);
00156 
00157     if(TRMode == I2S_RX_MODE){
00158         LPC_I2S->I2SDAI = config;
00159     }else{
00160         LPC_I2S->I2SDAO = config;
00161     }
00162 }
00163 
00164 /********************************************************************//**
00165  * @brief        DeInitial both I2S transmit or receive
00166  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00167  * @return         none
00168  *********************************************************************/
00169 void I2S_DeInit(LPC_I2S_TypeDef *I2Sx) {
00170     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00171 
00172     // Turn off power and clock
00173     CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, DISABLE);
00174 }
00175 
00176 /********************************************************************//**
00177  * @brief        Get I2S Buffer Level
00178  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00179  * @param[in]    TRMode Transmit/receive mode, should be:
00180  *                     - I2S_TX_MODE = 0: transmit mode
00181  *                     - I2S_RX_MODE = 1: receive mode
00182  * @return         current level of Transmit/Receive Buffer
00183  *********************************************************************/
00184 uint8_t I2S_GetLevel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode)
00185 {
00186     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00187     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00188 
00189     if(TRMode == I2S_TX_MODE)
00190     {
00191         return ((I2Sx->I2SSTATE >> 16) & 0xFF);
00192     }
00193     else
00194     {
00195         return ((I2Sx->I2SSTATE >> 8) & 0xFF);
00196     }
00197 }
00198 
00199 /********************************************************************//**
00200  * @brief        I2S Start: clear all STOP,RESET and MUTE bit, ready to operate
00201  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00202  * @return         none
00203  *********************************************************************/
00204 void I2S_Start(LPC_I2S_TypeDef *I2Sx)
00205 {
00206     //Clear STOP,RESET and MUTE bit
00207     I2Sx->I2SDAO &= ~I2S_DAI_RESET;
00208     I2Sx->I2SDAI &= ~I2S_DAI_RESET;
00209     I2Sx->I2SDAO &= ~I2S_DAI_STOP;
00210     I2Sx->I2SDAI &= ~I2S_DAI_STOP;
00211     I2Sx->I2SDAO &= ~I2S_DAI_MUTE;
00212 }
00213 
00214 /********************************************************************//**
00215  * @brief        I2S Send data
00216  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00217  * @param[in]    BufferData pointer to uint32_t is the data will be send
00218  * @return         none
00219  *********************************************************************/
00220 void I2S_Send(LPC_I2S_TypeDef *I2Sx, uint32_t BufferData) {
00221     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00222 
00223     I2Sx->I2STXFIFO = BufferData;
00224 }
00225 
00226 /********************************************************************//**
00227  * @brief        I2S Receive Data
00228  * @param[in]    I2Sx pointer to LPC_I2S_TypeDef
00229  * @return         received value
00230  *********************************************************************/
00231 uint32_t I2S_Receive(LPC_I2S_TypeDef* I2Sx) {
00232     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00233 
00234     return (I2Sx->I2SRXFIFO);
00235 
00236 }
00237 
00238 /********************************************************************//**
00239  * @brief        I2S Pause
00240  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00241  * @param[in]    TRMode is transmit/receive mode, should be:
00242  *                 - I2S_TX_MODE = 0: transmit mode
00243  *                 - I2S_RX_MODE = 1: receive mode
00244  * @return         none
00245  *********************************************************************/
00246 void I2S_Pause(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) {
00247     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00248     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00249 
00250     if (TRMode == I2S_TX_MODE) //Transmit mode
00251     {
00252         I2Sx->I2SDAO |= I2S_DAO_STOP;
00253     } else //Receive mode
00254     {
00255         I2Sx->I2SDAI |= I2S_DAI_STOP;
00256     }
00257 }
00258 
00259 /********************************************************************//**
00260  * @brief        I2S Mute
00261  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00262  * @param[in]    TRMode is transmit/receive mode, should be:
00263  *                 - I2S_TX_MODE = 0: transmit mode
00264  *                 - I2S_RX_MODE = 1: receive mode
00265  * @return         none
00266  *********************************************************************/
00267 void I2S_Mute(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) {
00268     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00269     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00270 
00271     if (TRMode == I2S_TX_MODE) //Transmit mode
00272     {
00273         I2Sx->I2SDAO |= I2S_DAO_MUTE;
00274     } else //Receive mode
00275     {
00276         I2Sx->I2SDAI |= I2S_DAI_MUTE;
00277     }
00278 }
00279 
00280 /********************************************************************//**
00281  * @brief        I2S Stop
00282  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00283  * @param[in]    TRMode is transmit/receive mode, should be:
00284  *                 - I2S_TX_MODE = 0: transmit mode
00285  *                 - I2S_RX_MODE = 1: receive mode
00286  * @return         none
00287  *********************************************************************/
00288 void I2S_Stop(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) {
00289     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00290     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00291 
00292     if (TRMode == I2S_TX_MODE) //Transmit mode
00293     {
00294         I2Sx->I2SDAO &= ~I2S_DAO_MUTE;
00295         I2Sx->I2SDAO |= I2S_DAO_STOP;
00296         I2Sx->I2SDAO |= I2S_DAO_RESET;
00297     } else //Receive mode
00298     {
00299         I2Sx->I2SDAI |= I2S_DAI_STOP;
00300         I2Sx->I2SDAI |= I2S_DAI_RESET;
00301     }
00302 }
00303 
00304 /********************************************************************//**
00305  * @brief        Set frequency for I2S
00306  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00307  * @param[in]    Freq is the frequency for I2S will be set. It can range
00308  *                 from 16-96 kHz(16, 22.05, 32, 44.1, 48, 96kHz)
00309  * @param[in]    TRMode is transmit/receive mode, should be:
00310  *                 - I2S_TX_MODE = 0: transmit mode
00311  *                 - I2S_RX_MODE = 1: receive mode
00312  * @return         Status: ERROR or SUCCESS
00313  *********************************************************************/
00314 Status I2S_FreqConfig(LPC_I2S_TypeDef *I2Sx, uint32_t Freq, uint8_t TRMode) {
00315 
00316     /* Calculate bit rate
00317      * The formula is:
00318      *      bit_rate = channel*wordwidth - 1
00319      * 48kHz sample rate for 16 bit stereo date requires
00320      * a bit rate of 48000*16*2=1536MHz (MCLK)
00321      */
00322     uint32_t i2sPclk;
00323     uint64_t divider;
00324     uint8_t bitrate, channel, wordwidth;
00325     uint32_t x, y;
00326     uint16_t dif;
00327     uint16_t error;
00328     uint8_t x_divide, y_divide=0;
00329     uint16_t ErrorOptimal = 0xFFFF;
00330 
00331     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00332     CHECK_PARAM(PRAM_I2S_FREQ(Freq));
00333     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00334 
00335     i2sPclk = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_I2S);
00336     printf("I2S_PCLK = %dHz\r\n",i2sPclk);
00337     if(TRMode == I2S_TX_MODE)
00338     {
00339         channel = i2s_GetChannel(I2Sx,I2S_TX_MODE);
00340         wordwidth = i2s_GetWordWidth(I2Sx,I2S_TX_MODE);
00341     }
00342     else
00343     {
00344         channel = i2s_GetChannel(I2Sx,I2S_RX_MODE);
00345         wordwidth = i2s_GetWordWidth(I2Sx,I2S_RX_MODE);
00346     }
00347     bitrate = channel * wordwidth - 1;
00348     if (TRMode == I2S_TX_MODE)// Transmitter
00349     {
00350         I2Sx->I2STXBITRATE = bitrate;
00351     } else //Receiver
00352     {
00353         I2Sx->I2SRXBITRATE = bitrate;
00354     }
00355     printf("TX CHANNEL= %d\r\n",i2s_GetChannel(I2Sx,I2S_TX_MODE));
00356     printf("TX WORDWIDTH= %dbits \r\n",i2s_GetWordWidth(I2Sx,I2S_TX_MODE));
00357     printf("I2STXBITRATE= %d,bitrate= %d \r\n",I2Sx->I2STXBITRATE,bitrate);
00358     /* Calculate X and Y divider
00359      * The MCLK rate for the I2S transmitter is determined by the value
00360      * in the I2STXRATE/I2SRXRATE register. The required I2STXRATE/I2SRXRATE
00361      * setting depends on the desired audio sample rate desired, the format
00362      * (stereo/mono) used, and the data size.
00363      * The formula is:
00364      *         I2S_MCLK = PCLK * (X/Y) / 2
00365      * We have:
00366      *         I2S_MCLK = Freq * bit_rate;
00367      * So: (X/Y) = (Freq * bit_rate)/PCLK*2
00368      * We use a loop function to chose the most suitable X,Y value
00369      */
00370 
00371     divider = ((uint64_t)(Freq *( bitrate+1)/* * 2*/)<<16) / i2sPclk;
00372     for (y = 255; y > 0; y--) {
00373         x = y * divider;
00374         dif = x & 0xFFFF;
00375         if(dif>0x8000) error = 0x10000-dif;
00376         else error = dif;
00377         if (error == 0)
00378         {
00379             y_divide = y;
00380             break;
00381         }
00382         else if (error < ErrorOptimal)
00383         {
00384             ErrorOptimal = error;
00385             y_divide = y;
00386         }
00387     }
00388     //y_divide--;//for test
00389     x_divide = (y_divide * Freq *( bitrate+1)* 2)/i2sPclk;
00390     if (TRMode == I2S_TX_MODE)// Transmitter
00391     {
00392         I2Sx->I2STXRATE = y_divide | (x_divide << 8);
00393     } else //Receiver
00394     {
00395         I2Sx->I2SRXRATE = y_divide | (x_divide << 8);
00396     }
00397     
00398     printf("I2STXRATE=%d, x_divide=%d, y_divide=%d \r\n",I2Sx->I2STXRATE,x_divide,y_divide);
00399     return SUCCESS;
00400 }
00401 
00402 /********************************************************************//**
00403  * @brief        I2S set bitrate
00404  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00405  * @param[in]    bitrate value will be set, it can be calculate as follows:
00406  *                     bitrate = channel * wordwidth - 1
00407  *                 bitrate value should be in range: 0 .. 63
00408  * @param[in]    TRMode is transmit/receive mode, should be:
00409  *                 - I2S_TX_MODE = 0: transmit mode
00410  *                 - I2S_RX_MODE = 1: receive mode
00411  * @return         none
00412  *********************************************************************/
00413 void I2S_SetBitRate(LPC_I2S_TypeDef *I2Sx, uint8_t bitrate, uint8_t TRMode)
00414 {
00415     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00416     CHECK_PARAM(PARAM_I2S_BITRATE(bitrate));
00417     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00418 
00419     if(TRMode == I2S_TX_MODE)
00420     {
00421         I2Sx->I2STXBITRATE = bitrate;
00422     }
00423     else
00424     {
00425         I2Sx->I2SRXBITRATE = bitrate;
00426     }
00427 }
00428 
00429 /********************************************************************//**
00430  * @brief        Configuration operating mode for I2S
00431  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00432  * @param[in]    ModeConfig pointer to I2S_MODEConf_Type will be used to
00433  *                 configure
00434  * @param[in]    TRMode is transmit/receive mode, should be:
00435  *                 - I2S_TX_MODE = 0: transmit mode
00436  *                 - I2S_RX_MODE = 1: receive mode
00437  * @return         none
00438  *********************************************************************/
00439 void I2S_ModeConfig(LPC_I2S_TypeDef *I2Sx, I2S_MODEConf_Type* ModeConfig,
00440         uint8_t TRMode)
00441 {
00442     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00443     CHECK_PARAM(PARAM_I2S_CLKSEL(ModeConfig->clksel));
00444     CHECK_PARAM(PARAM_I2S_4PIN(ModeConfig->fpin));
00445     CHECK_PARAM(PARAM_I2S_MCLK(ModeConfig->mcena));
00446     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00447 
00448     if (TRMode == I2S_TX_MODE) {
00449         I2Sx->I2STXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register
00450         if (ModeConfig->clksel == I2S_CLKSEL_MCLK) {
00451             I2Sx->I2STXMODE |= 0x02;
00452         }
00453         if (ModeConfig->fpin == I2S_4PIN_ENABLE) {
00454             I2Sx->I2STXMODE |= (1 << 2);
00455         }
00456         if (ModeConfig->mcena == I2S_MCLK_ENABLE) {
00457             I2Sx->I2STXMODE |= (1 << 3);
00458         }
00459     } else {
00460         I2Sx->I2SRXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register
00461         if (ModeConfig->clksel == I2S_CLKSEL_MCLK) {
00462             I2Sx->I2SRXMODE |= 0x02;
00463         }
00464         if (ModeConfig->fpin == I2S_4PIN_ENABLE) {
00465             I2Sx->I2SRXMODE |= (1 << 2);
00466         }
00467         if (ModeConfig->mcena == I2S_MCLK_ENABLE) {
00468             I2Sx->I2SRXMODE |= (1 << 3);
00469         }
00470     }
00471 }
00472 
00473 /********************************************************************//**
00474  * @brief        Configure DMA operation for I2S
00475  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00476  * @param[in]    DMAConfig pointer to I2S_DMAConf_Type will be used to configure
00477  * @param[in]    TRMode is transmit/receive mode, should be:
00478  *                 - I2S_TX_MODE = 0: transmit mode
00479  *                 - I2S_RX_MODE = 1: receive mode
00480  * @return         none
00481  *********************************************************************/
00482 void I2S_DMAConfig(LPC_I2S_TypeDef *I2Sx, I2S_DMAConf_Type* DMAConfig,
00483         uint8_t TRMode)
00484 {
00485     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00486     CHECK_PARAM(PARAM_I2S_DMA(DMAConfig->DMAIndex));
00487     CHECK_PARAM(PARAM_I2S_DMA_DEPTH(DMAConfig->depth));
00488     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00489 
00490     if (TRMode == I2S_RX_MODE) {
00491         if (DMAConfig->DMAIndex == I2S_DMA_1) {
00492             LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 8;
00493         } else {
00494             LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 8;
00495         }
00496     } else {
00497         if (DMAConfig->DMAIndex == I2S_DMA_1) {
00498             LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 16;
00499         } else {
00500             LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 16;
00501         }
00502     }
00503 }
00504 
00505 /********************************************************************//**
00506  * @brief        Enable/Disable DMA operation for I2S
00507  * @param[in]    I2Sx: I2S peripheral selected, should be: LPC_I2S
00508  * @param[in]    DMAIndex chose what DMA is used, should be:
00509  *                 - I2S_DMA_1 = 0: DMA1
00510  *                 - I2S_DMA_2 = 1: DMA2
00511  * @param[in]    TRMode is transmit/receive mode, should be:
00512  *                 - I2S_TX_MODE = 0: transmit mode
00513  *                 - I2S_RX_MODE = 1: receive mode
00514  * @param[in]    NewState is new state of DMA operation, should be:
00515  *                 - ENABLE
00516  *                 - DISABLE
00517  * @return         none
00518  *********************************************************************/
00519 void I2S_DMACmd(LPC_I2S_TypeDef *I2Sx, uint8_t DMAIndex, uint8_t TRMode,
00520         FunctionalState NewState)
00521 {
00522     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00523     CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
00524     CHECK_PARAM(PARAM_I2S_DMA(DMAIndex));
00525     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00526 
00527     if (TRMode == I2S_RX_MODE) {
00528         if (DMAIndex == I2S_DMA_1) {
00529             if (NewState == ENABLE)
00530                 I2Sx->I2SDMA1 |= 0x01;
00531             else
00532                 I2Sx->I2SDMA1 &= ~0x01;
00533         } else {
00534             if (NewState == ENABLE)
00535                 I2Sx->I2SDMA2 |= 0x01;
00536             else
00537                 I2Sx->I2SDMA2 &= ~0x01;
00538         }
00539     } else {
00540         if (DMAIndex == I2S_DMA_1) {
00541             if (NewState == ENABLE)
00542                 I2Sx->I2SDMA1 |= 0x02;
00543             else
00544                 I2Sx->I2SDMA1 &= ~0x02;
00545         } else {
00546             if (NewState == ENABLE)
00547                 I2Sx->I2SDMA2 |= 0x02;
00548             else
00549                 I2Sx->I2SDMA2 &= ~0x02;
00550         }
00551     }
00552 }
00553 
00554 /********************************************************************//**
00555  * @brief        Configure IRQ for I2S
00556  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00557  * @param[in]    TRMode is transmit/receive mode, should be:
00558  *                 - I2S_TX_MODE = 0: transmit mode
00559  *                 - I2S_RX_MODE = 1: receive mode
00560  * @param[in]    level is the FIFO level that triggers IRQ request
00561  * @return         none
00562  *********************************************************************/
00563 void I2S_IRQConfig(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, uint8_t level) {
00564     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00565     CHECK_PARAM(PARAM_I2S_TRX(TRMode));
00566     CHECK_PARAM(PARAM_I2S_IRQ_LEVEL(level));
00567 
00568     if (TRMode == I2S_RX_MODE) {
00569         I2Sx->I2SIRQ |= (level << 8);
00570     } else {
00571         I2Sx->I2SIRQ |= (level << 16);
00572     }
00573 }
00574 
00575 /********************************************************************//**
00576  * @brief        Enable/Disable IRQ for I2S
00577  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00578  * @param[in]    TRMode is transmit/receive mode, should be:
00579  *                 - I2S_TX_MODE = 0: transmit mode
00580  *                 - I2S_RX_MODE = 1: receive mode
00581  * @param[in]    NewState is new state of DMA operation, should be:
00582  *                 - ENABLE
00583  *                 - DISABLE
00584  * @return         none
00585  *********************************************************************/
00586 void I2S_IRQCmd(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, FunctionalState NewState) {
00587     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00588     CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
00589 
00590     if (TRMode == I2S_RX_MODE) {
00591         if (NewState == ENABLE)
00592             I2Sx->I2SIRQ |= 0x01;
00593         else
00594             I2Sx->I2SIRQ &= ~0x01;
00595         //Enable DMA
00596 
00597     } else {
00598         if (NewState == ENABLE)
00599             I2Sx->I2SIRQ |= 0x02;
00600         else
00601             I2Sx->I2SIRQ &= ~0x02;
00602     }
00603 }
00604 
00605 /********************************************************************//**
00606  * @brief        Get I2S interrupt status
00607  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00608  * @param[in]    TRMode is transmit/receive mode, should be:
00609  *                 - I2S_TX_MODE = 0: transmit mode
00610  *                 - I2S_RX_MODE = 1: receive mode
00611  * @return         FunctionState    should be:
00612  *                 - ENABLE: interrupt is enable
00613  *                 - DISABLE: interrupt is disable
00614  *********************************************************************/
00615 FunctionalState I2S_GetIRQStatus(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode)
00616 {
00617     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00618     if(TRMode == I2S_TX_MODE)
00619         return (FunctionalState)((I2Sx->I2SIRQ >> 1)&0x01);
00620     else
00621         return (FunctionalState)((I2Sx->I2SIRQ)&0x01);
00622 }
00623 
00624 /********************************************************************//**
00625  * @brief        Get I2S interrupt depth
00626  * @param[in]    I2Sx I2S peripheral selected, should be: LPC_I2S
00627  * @param[in]    TRMode is transmit/receive mode, should be:
00628  *                 - I2S_TX_MODE = 0: transmit mode
00629  *                 - I2S_RX_MODE = 1: receive mode
00630  * @return         depth of FIFO level on which to create an irq request
00631  *********************************************************************/
00632 uint8_t I2S_GetIRQDepth(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode)
00633 {
00634     CHECK_PARAM(PARAM_I2Sx(I2Sx));
00635     if(TRMode == I2S_TX_MODE)
00636         return (((I2Sx->I2SIRQ)>>16)&0xFF);
00637     else
00638         return (((I2Sx->I2SIRQ)>>8)&0xFF);
00639 }
00640 /**
00641  * @}
00642  */
00643 
00644 #endif /* _I2S */
00645 
00646 /**
00647  * @}
00648  */
00649 
00650 /* --------------------------------- End Of File ------------------------------ */