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