46 uint32_t u32MasterSlave,
48 uint32_t u32DataWidth,
51 uint32_t u32ClkSrc = 0, u32Div, u32HCLKFreq;
55 spi->
I2SCTL &= ~SPI_I2SCTL_I2SEN_Msk;
57 if(u32DataWidth == 32)
71 if(u32BusClock >= u32HCLKFreq)
91 u32ClkSrc = (u32HCLKFreq / 2);
93 u32ClkSrc = u32HCLKFreq;
108 u32ClkSrc = (u32HCLKFreq / 2);
110 u32ClkSrc = u32HCLKFreq;
116 if(u32BusClock >= u32HCLKFreq)
123 else if(u32BusClock >= u32ClkSrc)
130 else if(u32BusClock == 0)
135 return (u32ClkSrc / (0xFF + 1));
139 u32Div = (((u32ClkSrc * 10) / u32BusClock + 5) / 10) - 1;
145 return (u32ClkSrc / (0xFF + 1));
151 return (u32ClkSrc / (u32Div + 1));
172 return (u32HCLKFreq / 2);
181 return (u32HCLKFreq / 2);
200 SYS->IPRST1 &= ~SYS_IPRST1_SPI0RST_Msk;
206 SYS->IPRST1 &= ~SYS_IPRST1_SPI1RST_Msk;
272 uint32_t u32ClkSrc, u32HCLKFreq;
278 if(u32BusClock >= u32HCLKFreq)
298 u32ClkSrc = (u32HCLKFreq / 2);
300 u32ClkSrc = u32HCLKFreq;
315 u32ClkSrc = (u32HCLKFreq / 2);
317 u32ClkSrc = u32HCLKFreq;
323 if(u32BusClock >= u32HCLKFreq)
330 else if(u32BusClock >= u32ClkSrc)
337 else if(u32BusClock == 0)
342 return (u32ClkSrc / (0xFF + 1));
346 u32Div = (((u32ClkSrc * 10) / u32BusClock + 5) / 10) - 1;
352 return (u32ClkSrc / (0xFF + 1));
358 return (u32ClkSrc / (u32Div + 1));
387 uint32_t u32ClkSrc, u32HCLKFreq;
406 u32ClkSrc = (u32HCLKFreq / 2);
408 u32ClkSrc = u32HCLKFreq;
423 u32ClkSrc = (u32HCLKFreq / 2);
425 u32ClkSrc = u32HCLKFreq;
432 return (u32ClkSrc / (u32Div + 1));
528 spi->
CTL &= ~SPI_CTL_UNITIEN_Msk;
532 spi->
SSCTL &= ~SPI_SSCTL_SSACTIEN_Msk;
536 spi->
SSCTL &= ~SPI_SSCTL_SSINAIEN_Msk;
540 spi->
SSCTL &= ~SPI_SSCTL_SLVURIEN_Msk;
544 spi->
SSCTL &= ~SPI_SSCTL_SLVBEIEN_Msk;
548 spi->
SSCTL &= ~SPI_SSCTL_SLVTOIEN_Msk;
552 spi->
FIFOCTL &= ~SPI_FIFOCTL_TXUFIEN_Msk;
556 spi->
FIFOCTL &= ~SPI_FIFOCTL_TXTHIEN_Msk;
560 spi->
FIFOCTL &= ~SPI_FIFOCTL_RXTHIEN_Msk;
564 spi->
FIFOCTL &= ~SPI_FIFOCTL_RXOVIEN_Msk;
568 spi->
FIFOCTL &= ~SPI_FIFOCTL_RXTOIEN_Msk;
594 uint32_t u32IntFlag = 0;
712 uint32_t u32Flag = 0;
759 uint32_t u32Freq, u32HCLKFreq;
771 u32Freq = (u32HCLKFreq / 2);
773 u32Freq = u32HCLKFreq;
808uint32_t
I2S_Open(
SPI_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32Channels, uint32_t u32DataFormat)
811 uint32_t u32BitRate, u32SrcClk;
812 uint32_t u32HCLKFreq;
816 SYS->IPRST1 &= ~SYS_IPRST1_SPI1RST_Msk;
819 i2s->
I2SCTL = u32MasterSlave | u32WordWidth | u32Channels | u32DataFormat;
830 u32Divider = ((u32SrcClk / u32BitRate) >> 1) - 1;
835 u32BitRate = u32SrcClk / ((u32Divider + 1) * 2);
843 return u32SampleRate;
848 i2s->
I2SCLK &= ~SPI_I2SCLK_BCLKDIV_Msk;
858 return (u32HCLKFreq / 2);
873 i2s->
I2SCTL &= ~SPI_I2SCTL_I2SEN_Msk;
943 i2s->
FIFOCTL &= ~SPI_FIFOCTL_TXTHIEN_Msk;
947 i2s->
FIFOCTL &= ~SPI_FIFOCTL_RXTHIEN_Msk;
951 i2s->
FIFOCTL &= ~SPI_FIFOCTL_RXOVIEN_Msk;
955 i2s->
FIFOCTL &= ~SPI_FIFOCTL_RXTOIEN_Msk;
959 i2s->
FIFOCTL &= ~SPI_FIFOCTL_TXUFIEN_Msk;
963 i2s->
I2SCTL &= ~SPI_I2SCTL_RZCIEN_Msk;
967 i2s->
I2SCTL &= ~SPI_I2SCTL_LZCIEN_Msk;
985 if(u32BusClock == u32SrcClk)
990 u32Divider = (((u32SrcClk * 10UL / u32BusClock) >> 1) + 5UL) / 10UL;
992 if(u32Divider > 0x3F)
1005 return ((u32SrcClk >> 1) / u32Divider);
1017 i2s->
I2SCTL &= ~SPI_I2SCTL_MCLKEN_Msk;
#define SPI_STATUS_TXFULL_Msk
#define SPI_SSCTL_SSACTPOL_Msk
#define SPI_FIFOCTL_RXOVIEN_Msk
#define SPI_STATUS_SSACTIF_Msk
#define SPI_CTL_UNITIEN_Msk
#define SPI_FIFOCTL_RXTH_Pos
#define SPI_FIFOCTL_TXTH_Msk
#define SPI_CTL_DWIDTH_Pos
#define SPI_I2SCTL_TXEN_Msk
#define SPI_STATUS_TXRXRST_Msk
#define SPI_STATUS_TXTHIF_Msk
#define SPI_I2SCTL_LZCIEN_Msk
#define SPI_STATUS_RXTHIF_Msk
#define SPI_SSCTL_SLVTOIEN_Msk
#define SPI_I2SCTL_RZCIEN_Msk
#define SPI_STATUS_UNITIF_Msk
#define SPI_SSCTL_SSACTIEN_Msk
#define SPI_CLKDIV_DIVIDER_Pos
#define SYS_IPRST1_SPI1RST_Msk
#define SPI_STATUS_SSINAIF_Msk
#define SYS_IPRST1_SPI0RST_Msk
#define SPI_FIFOCTL_TXUFIEN_Msk
#define SPI_STATUS_SLVTOIF_Msk
#define SPI_CLKDIV_DIVIDER_Msk
#define SPI_FIFOCTL_TXTH_Pos
#define SPI_CTL_SPIEN_Msk
#define SPI_SSCTL_SLVBEIEN_Msk
#define SPI_STATUS_TXEMPTY_Msk
#define SPI_SSCTL_SSINAIEN_Msk
#define SPI_STATUS_RXOVIF_Msk
#define SPI_I2SCTL_WDWIDTH_Pos
#define SPI_I2SCTL_RXEN_Msk
#define SPI_FIFOCTL_RXTOIEN_Msk
#define SPI_FIFOCTL_RXTHIEN_Msk
#define SPI_STATUS_RXFULL_Msk
#define SPI_FIFOCTL_RXTH_Msk
#define SPI_I2SCTL_I2SEN_Msk
#define SPI_STATUS_SLVBEIF_Msk
#define SPI_STATUS_RXTOIF_Msk
#define SPI_STATUS_RXEMPTY_Msk
#define SPI_STATUS_SSLINE_Msk
#define SPI_SSCTL_SLVURIEN_Msk
#define SPI_STATUS_TXUFIF_Msk
#define SPI_STATUS_SLVURIF_Msk
#define SPI_FIFOCTL_TXFBCLR_Msk
#define SPI_FIFOCTL_TXTHIEN_Msk
#define SPI_STATUS_SPIENSTS_Msk
#define SPI_FIFOCTL_RXFBCLR_Msk
#define SPI_SSCTL_AUTOSS_Msk
#define SPI_I2SCTL_MCLKEN_Msk
#define SPI_STATUS_BUSY_Msk
#define SPI_I2SCLK_MCLKDIV_Pos
#define SPI_I2SCLK_BCLKDIV_Pos
#define CLK_CLKSEL0_PCLK0SEL_HCLK_DIV2
#define CLK_CLKSEL0_PCLK1SEL_HCLK_DIV2
#define CLK_CLKSEL2_SPI0SEL_HXT
#define CLK_CLKSEL2_SPI0SEL_PLL
#define CLK_CLKSEL2_SPI1SEL_PCLK1
#define CLK_CLKSEL2_SPI1SEL_PLL
#define CLK_CLKSEL2_SPI0SEL_PCLK0
#define CLK_CLKSEL2_SPI1SEL_HXT
uint32_t CLK_GetHCLKFreq(void)
Get HCLK frequency.
__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
#define CLK_CLKSEL2_SPI1SEL_Msk
#define CLK_CLKSEL0_PCLK1SEL_Msk
#define CLK_CLKSEL2_SPI0SEL_Msk
#define CLK_CLKSEL0_PCLK0SEL_Msk
#define SPI_FIFO_RXTO_INT_MASK
#define I2S_FIFO_RXTO_INT_MASK
#define SPI_RX_EMPTY_MASK
#define SPI_FIFO_RXTH_INT_MASK
#define SPI_SLVBE_INT_MASK
#define SPI_SSACT_INT_MASK
#define SPI_SSLINE_STS_MASK
#define SPI_SSINACT_INT_MASK
#define I2S_FIFO_TX_LEVEL_WORD_2
#define I2S_FIFO_RX_LEVEL_WORD_2
#define SPI_SS_ACTIVE_LOW
#define SPI_UNIT_INT_MASK
#define SPI_FIFO_TXTH_INT_MASK
#define SPI_SLVTO_INT_MASK
#define SPI_TX_EMPTY_MASK
#define SPI_TXRX_RESET_MASK
#define SPI_TXUF_INT_MASK
#define SPI_FIFO_RXOV_INT_MASK
#define SPI_SLVUR_INT_MASK
#define SPI_SPIEN_STS_MASK
#define I2S_LEFT_ZC_INT_MASK
#define I2S_TXUF_INT_MASK
#define I2S_FIFO_RXTH_INT_MASK
#define I2S_RIGHT_ZC_INT_MASK
#define I2S_FIFO_TXTH_INT_MASK
#define I2S_FIFO_RXOV_INT_MASK
static uint32_t I2S_GetSourceClockFreq(SPI_T *i2s)
This function is used to get I2S source clock frequency.
void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask)
Disable interrupt function.
uint32_t SPI_GetIntFlag(SPI_T *spi, uint32_t u32Mask)
Get interrupt flag.
void I2S_SetFIFO(SPI_T *i2s, uint32_t u32TxThreshold, uint32_t u32RxThreshold)
Configure FIFO threshold setting.
void I2S_EnableInt(SPI_T *i2s, uint32_t u32Mask)
Enable interrupt function.
void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask)
Enable interrupt function.
void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel)
Enable the automatic slave selection function.
void SPI_DisableAutoSS(SPI_T *spi)
Disable the automatic slave selection function.
void SPI_ClearIntFlag(SPI_T *spi, uint32_t u32Mask)
Clear interrupt flag.
uint32_t I2S_EnableMCLK(SPI_T *i2s, uint32_t u32BusClock)
Enable master clock (MCLK).
void I2S_Close(SPI_T *i2s)
Disable I2S function.
uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock)
Set the SPI bus clock.
void SPI_Close(SPI_T *spi)
Disable SPI controller.
uint32_t I2S_Open(SPI_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32Channels, uint32_t u32DataFormat)
This function configures some parameters of I2S interface for general purpose use.
void SPI_SetFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold)
Configure FIFO threshold setting.
void I2S_DisableMCLK(SPI_T *i2s)
Disable master clock (MCLK).
uint32_t SPI_GetStatus(SPI_T *spi, uint32_t u32Mask)
Get SPI status.
void I2S_DisableInt(SPI_T *i2s, uint32_t u32Mask)
Disable interrupt function.
void SPI_ClearTxFIFO(SPI_T *spi)
Clear TX FIFO buffer.
uint32_t SPI_Open(SPI_T *spi, uint32_t u32MasterSlave, uint32_t u32SPIMode, uint32_t u32DataWidth, uint32_t u32BusClock)
This function make SPI module be ready to transfer.
uint32_t SPI_GetBusClock(SPI_T *spi)
Get the actual frequency of SPI bus clock. Only available in Master mode.
void SPI_ClearRxFIFO(SPI_T *spi)
Clear RX FIFO buffer.