📄 drvi2s.c
字号:
/*---------------------------------------------------------------------------------------------------------*/
/* 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 + -