HM Yoong / cmsis-

Description: Bug report: CMSIS - Incomplete compilation log

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lpc17xx_i2s.c Source File

lpc17xx_i2s.c

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