⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvi2s.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "DrvI2S.h"
#include "DrvSYS.h"


/*---------------------------------------------------------------------------------------------------------*/
/* I2S Interrupt Flag                                                                                      */
/*---------------------------------------------------------------------------------------------------------*/
#define I2S_I2SRXINT                0x00000002
#define I2S_I2STXINT                0x00000004

#define I2S_RXUDF                   0x00000100
#define I2S_RXOVF                   0x00000200

#define I2S_TXUDF                   0x00010000
#define I2S_TXOVF                   0x00020000
#define I2S_RZCF                    0x00400000
#define I2S_LZCF                    0x00800000


static I2S_CALLBACK_T I2SHandler = {0};

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     <I2S_IRQHandler>                                                                          */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*               None                                                                                      */
/* Returns:                                                                                                */
/*               None                                                                                      */
/*                                                                                                         */
/* Description:                                                                                            */
/*               ISR to handle I2S interrupt event                                                         */
/*---------------------------------------------------------------------------------------------------------*/
void I2S_IRQHandler(void)
{
    uint32_t u32Reg;

    u32Reg = inpw(&(I2S->I2SSTATUS));

    if (u32Reg & I2S_I2STXINT)
    {
        /* Tx underflow */
        if ((u32Reg & I2S_TXUDF) && (I2S->I2SIE.TXUDFIE == 1))
        {
            if (I2SHandler.TxUnderflowFn)
                I2SHandler.TxUnderflowFn(u32Reg);
            
            outp32(&(I2S->I2SSTATUS), I2S_TXUDF);
        }
        /* Tx overflow */
        else if ((u32Reg & I2S_TXOVF) && (I2S->I2SIE.TXOVFIE == 1))
        {
            if (I2SHandler.TxOverflowFn)
                I2SHandler.TxOverflowFn(u32Reg);
            
            outp32(&(I2S->I2SSTATUS), I2S_TXOVF); 
        }
        /* Tx right zero cross */
        else if ((u32Reg & I2S_RZCF) && (I2S->I2SIE.RZCIE == 1))
        {
            if (I2SHandler.TxRightZeroCrossFn)
                I2SHandler.TxRightZeroCrossFn(u32Reg);
            outp32(&(I2S->I2SSTATUS), I2S_RZCF);   
        }
        /* Tx left zero cross */
        else if ((u32Reg & I2S_LZCF) && (I2S->I2SIE.LZCIE == 1))
        {
            if (I2SHandler.TxLeftZeroCrossFn)
                I2SHandler.TxLeftZeroCrossFn(u32Reg);
            outp32(&(I2S->I2SSTATUS), I2S_LZCF);   
        }   
        /* Tx threshold level */
        else if (I2S->I2SIE.TXTHIE == 1)
        {
            if (I2SHandler.TxFifoThresholdFn)
                I2SHandler.TxFifoThresholdFn(u32Reg);  
        }
    }
    else if (u32Reg & I2S_I2SRXINT)
    {
        /* Rx underflow */
        if ((u32Reg & I2S_RXUDF) && (I2S->I2SIE.RXUDFIE == 1))
        {
            if (I2SHandler.RxUnderflowFn)
                I2SHandler.RxUnderflowFn(u32Reg);
            
            outp32(&(I2S->I2SSTATUS), I2S_RXUDF);  
        }
        /* Rx overflow */
        else if ((u32Reg & I2S_RXOVF) && (I2S->I2SIE.RXOVFIE == 1))
        {
            if (I2SHandler.RxOverflowFn)
                I2SHandler.RxOverflowFn(u32Reg);

            outp32(&(I2S->I2SSTATUS), I2S_RXOVF);    
        }
        /* Rx threshold level */
        else if (I2S->I2SIE.RXTHIE == 1)
        {
            if (I2SHandler.RxFifoThresholdFn)
                I2SHandler.RxFifoThresholdFn(u32Reg);  
        }   
    }   
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_Open                                                                                   */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*          S_DRVI2S_DATA_T *sParam - [in]  Data structure to configure                                    */
/*          u32SampleRate                   Sampling rate.                                                 */
/*                                          The setting takes effect when I2S operates as master mode      */
/*          u8WordWidth                     Data length - DRVI2S_DATABIT_8  :  8-bit Data                  */
/*                                                        DRVI2S_DATABIT_16 : 16-bit Data                  */
/*                                                        DRVI2S_DATABIT_24 : 24-bit Data                  */
/*                                                        DRVI2S_DATABIT_32 : 32-bit Data                  */
/*          u8AudioFormat                   Audio format- DRVI2S_MONO: Mono / DRVI2S_STEREO: Stereo        */
/*          u8DataFormat                    Data format - DRVI2S_FORMAT_I2S : I2S format                   */
/*                                                        DRVI2S_FORMAT_MSB : MSB justified format         */
/*          u8Mode                          I2S operation mode - DRVI2S_MODE_MASTER: master mode           */
/*                                                               DRVI2S_MODE_SLAVE : slave mode            */
/*          u8TxFIFOThreshold               Tx FIFO Threshold Level - DRVI2S_FIFO_LEVEL_WORD_0 : 0 Word    */ 
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_1 : 1 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_2 : 2 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_3 : 3 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_4 : 4 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_5 : 5 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_6 : 6 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_7 : 7 Word    */
/*          u8TxFIFOThreshold               Rx FIFO Threshold Level - DRVI2S_FIFO_LEVEL_WORD_1 : 1 Word    */ 
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_2 : 2 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_3 : 3 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_4 : 4 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_5 : 5 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_6 : 6 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_7 : 7 Word    */
/*                                                                    DRVI2S_FIFO_LEVEL_WORD_8 : 8 Word    */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               0      Success                                                                            */
/*                                                                                                         */
/* Description:                                                                                            */
/*          This function is used to configure the I2S mode/format/FIFO threshold function/Bit Clock (BCLK)*/       
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvI2S_Open(S_DRVI2S_DATA_T *sParam)
{
    uint8_t u8Divider;
    uint32_t u32BitRate, u32SrcClk;
    
    SYS->IPRSTC2.I2S_RST = 1;
    SYS->IPRSTC2.I2S_RST = 0;

    SYSCLK->APBCLK.I2S_EN = 1;
    
    I2S->I2SCON.WORDWIDTH  = sParam->u8WordWidth;
    I2S->I2SCON.MONO       = sParam->u8AudioFormat;
    I2S->I2SCON.FORMAT     = sParam->u8DataFormat;
    I2S->I2SCON.SLAVE      = sParam->u8Mode;
    I2S->I2SCON.TXTH       = sParam->u8TxFIFOThreshold;
    I2S->I2SCON.RXTH       = sParam->u8RxFIFOThreshold - 1;

    u32SrcClk = DrvI2S_GetSourceClockFreq();
    
    u32BitRate = sParam->u32SampleRate * (sParam->u8WordWidth + 1) * 16;

    u8Divider = ((u32SrcClk*10)/(u32BitRate * 2) + 5) / 10 - 1;
    
    I2S->I2SCLKDIV.BCLK_DIV = u8Divider;   
    
    I2S->I2SCON.I2SEN = 1; 

    return E_SUCCESS;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_Close                                                                                  */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/* Returns:                                                                                                */
/*               None                                                                                      */
/*                                                                                                         */
/* Description:                                                                                            */
/*               Disable I2S function and I2S clock                                                        */       
/*---------------------------------------------------------------------------------------------------------*/
void DrvI2S_Close(void)
{
    I2S->I2SCON.I2SEN = 0;
    SYS->IPRSTC2.I2S_RST = 1;
    SYS->IPRSTC2.I2S_RST = 0;
    SYSCLK->APBCLK.I2S_EN = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -