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

📄 drvi2s.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:

/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_EnableInt                                                                              */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*           Type        - [in]     I2S_RX_UNDERFLOW / I2S_RX_OVERFLOW / I2S_RX_FIFO_THRESHOLD             */
/*                                  I2S_TX_UNDERFLOW / I2S_TX_OVERFLOW / I2S_TX_FIFO_THRESHOLD             */
/*                                  I2S_TX_RIGHT_ZERO_CROSS / I2S_TX_LEFT_ZERO_CROSS                       */
/*           callbackfn  - [in]     The call back function for specified I2S function                      */
/*                                                                                                         */
/* Returns:                                                                                                */
/*           0      Success                                                                                */
/*          <0      Incorrect Argument                                                                     */
/*                                                                                                         */
/* Description:                                                                                            */
/*           This function is used to enable the I2S relative interrupt and install callback function      */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvI2S_EnableInt(E_I2S_CALLBACK_TYPE Type, I2S_CALLBACK callbackfn)
{
    switch (Type)
    {
        case I2S_RX_UNDERFLOW:
        {
            I2SHandler.RxUnderflowFn = callbackfn;  
            break;
        }
        case I2S_RX_OVERFLOW:
        {
            I2SHandler.RxOverflowFn = callbackfn; 
            break;
        }
        case I2S_RX_FIFO_THRESHOLD:
        {
            I2SHandler.RxFifoThresholdFn = callbackfn;  
            break;
        }        
        case I2S_TX_UNDERFLOW:
        {
            I2SHandler.TxUnderflowFn = callbackfn;  
            break;
        }
        case I2S_TX_OVERFLOW:
        {
            I2SHandler.TxOverflowFn = callbackfn;  
            break;
        }
        case I2S_TX_FIFO_THRESHOLD:
        {
            I2SHandler.TxFifoThresholdFn = callbackfn;  
            break;
        }
        case I2S_TX_RIGHT_ZERO_CROSS:
        {
            I2SHandler.TxRightZeroCrossFn = callbackfn; 
            break;
        }
        case I2S_TX_LEFT_ZERO_CROSS:
        {
            I2SHandler.TxLeftZeroCrossFn = callbackfn; 
            break;
        }        
        default:
            return E_DRVI2S_ERR_ARGUMENT;       
    }
        
    outp32(&(I2S->I2SIE), inp32(&(I2S->I2SIE)) | (1<<Type));    
    NVIC_SetPriority(I2S_IRQn, (1<<__NVIC_PRIO_BITS) - 2);
    NVIC_EnableIRQ(I2S_IRQn);
    
    return E_SUCCESS;
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_DisableInt                                                                             */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*           Type - [in] I2S_RX_UNDERFLOW / I2S_RX_OVERFLOW / I2S_RX_FIFO_THRESHOLD                        */
/*                       I2S_TX_UNDERFLOW / I2S_TX_OVERFLOW / I2S_TX_FIFO_THRESHOLD                        */
/*                       I2S_TX_RIGHT_ZERO_CROSS / I2S_TX_LEFT_ZERO_CROSS                                  */
/*                                                                                                         */
/* Returns:                                                                                                */
/*           0      Success                                                                                */
/*          <0      Incorrect Argument                                                                     */
/*                                                                                                         */
/* Description:                                                                                            */
/*           This function is used to disable the I2S relative interrupt and uninstall callback function   */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvI2S_DisableInt(E_I2S_CALLBACK_TYPE Type)
{   
    outp32(&(I2S->I2SIE), inp32(&(I2S->I2SIE)) & ~(1<<Type));
    
    switch(Type)
    {
        case I2S_RX_UNDERFLOW:
        {
            I2SHandler.RxUnderflowFn = NULL;  
            break;
        }
        case I2S_RX_OVERFLOW:
        {
            I2SHandler.RxOverflowFn = NULL; 
            break;
        }
        case I2S_RX_FIFO_THRESHOLD:
        {
            I2SHandler.RxFifoThresholdFn = NULL;  
            break;
        }        
        case I2S_TX_UNDERFLOW:
        {
            I2SHandler.TxUnderflowFn = NULL;  
            break;
        }
        case I2S_TX_OVERFLOW:
        {
            I2SHandler.TxOverflowFn = NULL;  
            break;
        }
        case I2S_TX_FIFO_THRESHOLD:
        {
            I2SHandler.TxFifoThresholdFn = NULL;  
            break;
        }
        case I2S_TX_RIGHT_ZERO_CROSS:
        {
            I2SHandler.TxRightZeroCrossFn = NULL; 
            break;
        }
        case I2S_TX_LEFT_ZERO_CROSS:
        {
            I2SHandler.TxLeftZeroCrossFn = NULL; 
            break;
        }        
        default:
            return E_DRVI2S_ERR_ARGUMENT;    
    }
    
    return E_SUCCESS;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_GetBCLKFreq                                                                            */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               I2S BCLK (Bit Clock) frequency                                                            */
/*                                                                                                         */
/* Description:                                                                                            */
/*               Get I2S BCLK (Bit Clock) frequency. BCLK = I2S source clock / (2x(BCLK_DIV + 1))          */       
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvI2S_GetBCLKFreq(void)
{
    uint32_t u32Reg, u32SrcClk;
    
    u32SrcClk = DrvI2S_GetSourceClockFreq();
    
    u32Reg = I2S->I2SCLKDIV.BCLK_DIV;
    
    return ((u32SrcClk >> 1) / (u32Reg + 1));
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_SetBCLKFreq                                                                            */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               u32Bclk    - [in]      I2S bit clock frequency (Hz)                                       */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               None                                                                                      */
/*                                                                                                         */
/* Description:                                                                                            */
/*               Set bit clock divider if I2S operates in master mode.                                     */   
/*               BCLK = I2S source clock / (2x(BCLK_DIV + 1))                                              */
/*---------------------------------------------------------------------------------------------------------*/
void DrvI2S_SetBCLKFreq(uint32_t u32Bclk)
{
    uint8_t u8Divider;
    uint32_t u32SrcClk;

    u32SrcClk = DrvI2S_GetSourceClockFreq(); 
    
    u8Divider = ((u32SrcClk*10)/(u32Bclk * 2) + 5) / 10 - 1;

    I2S->I2SCLKDIV.BCLK_DIV = u8Divider;
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvI2S_GetMCLKFreq                                                                            */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*                                                                                                         */
/* Returns:                                                                                                */

⌨️ 快捷键说明

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