MINI58_BSP V3.01.005
The Board Support Package for Mini58 Series MCU
spi.c
Go to the documentation of this file.
1/**************************************************************************/
12#include "Mini58Series.h"
39uint32_t SPI_Open(SPI_T *spi,
40 uint32_t u32MasterSlave,
41 uint32_t u32SPIMode,
42 uint32_t u32DataWidth,
43 uint32_t u32BusClock)
44{
45 if(u32DataWidth == 32)
46 u32DataWidth = 0;
47
48 spi->CTL = u32MasterSlave | (u32DataWidth << SPI_CTL_DWIDTH_Pos) | (u32SPIMode);
49
50 if(u32MasterSlave == SPI_SLAVE)
52
53 return ( SPI_SetBusClock(spi, u32BusClock) );
54}
55
61void SPI_Close(SPI_T *spi)
62{
63 /* Reset SPI */
64 SYS->IPRST1 |= SYS_IPRST1_SPI0RST_Msk;
65 SYS->IPRST1 &= ~SYS_IPRST1_SPI0RST_Msk;
66}
67
74{
76}
77
84{
86}
87
94{
95 spi->SSCTL &= ~SPI_SSCTL_AUTOSS_Msk;
96}
97
105void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel)
106{
107 spi->SSCTL = (spi->SSCTL & ~(SPI_SSCTL_SSACTPOL_Msk | SPI_SSCTL_SS_Msk)) | (u32SSPinMask | u32ActiveLevel) | SPI_SSCTL_AUTOSS_Msk;
108}
109
116uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock)
117{
118 uint32_t u32Div = 0;
119 uint32_t u32ClkSrc;
120
122 {
123 if((u32ClkSrc = CLK_GetHXTFreq()) == 0)
124 u32ClkSrc = CLK_GetLXTFreq();
125 }
126 else if((CLK->CLKSEL1 & CLK_CLKSEL1_SPISEL_Msk) == CLK_CLKSEL1_SPISEL_PLL)
127 u32ClkSrc = CLK_GetPLLClockFreq();
128 else
129 u32ClkSrc = CLK_GetHCLKFreq();
130
131 if(u32BusClock > u32ClkSrc)
132 u32BusClock = u32ClkSrc;
133
134 if(u32BusClock != 0)
135 {
136 u32Div = (((u32ClkSrc / u32BusClock) + 1) >> 1) - 1;
137 if(u32Div > SPI_CLKDIV_DIVIDER_Msk)
138 u32Div = SPI_CLKDIV_DIVIDER_Msk;
139 }
140 else
141 return 0;
142
143 spi->CLKDIV = (spi->CLKDIV & ~SPI_CLKDIV_DIVIDER_Msk) | u32Div;
144
145 return ( u32ClkSrc / ((u32Div+1)*2) );
146}
147
155void SPI_EnableFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold)
156{
158 (u32TxThreshold << SPI_FIFOCTL_TXTH_Pos) |
159 (u32RxThreshold << SPI_FIFOCTL_RXTH_Pos));
160
161 spi->CTL |= SPI_CTL_FIFOEN_Msk;
162}
163
170{
171 spi->CTL &= ~SPI_CTL_FIFOEN_Msk;
172}
173
179uint32_t SPI_GetBusClock(SPI_T *spi)
180{
181 uint32_t u32Div;
182 uint32_t u32ClkSrc;
183
185 {
186 if((u32ClkSrc = CLK_GetHXTFreq()) == 0)
187 u32ClkSrc = CLK_GetLXTFreq();
188 }
189 else if((CLK->CLKSEL1 & CLK_CLKSEL1_SPISEL_Msk) == CLK_CLKSEL1_SPISEL_PLL)
190 u32ClkSrc = CLK_GetPLLClockFreq();
191 else
192 u32ClkSrc = CLK_GetHCLKFreq();
193
194 u32Div = spi->CLKDIV & SPI_CLKDIV_DIVIDER_Msk;
195
196 return ( u32ClkSrc / ((u32Div + 1)*2) );
197}
198
209void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask)
210{
211 if((u32Mask & SPI_IE_MASK) == SPI_IE_MASK)
212 spi->CTL |= SPI_CTL_UNITIEN_Msk;
213
216
219
222
225
228}
229
240void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask)
241{
242 if((u32Mask & SPI_IE_MASK) == SPI_IE_MASK)
243 spi->CTL &= ~SPI_CTL_UNITIEN_Msk;
244
246 spi->SLVCTL &= ~SPI_SLVCTL_SLVSTIEN_Msk;
247
249 spi->FIFOCTL &= ~SPI_FIFOCTL_TXTHIEN_Msk;
250
252 spi->FIFOCTL &= ~SPI_FIFOCTL_RXTHIEN_Msk;
253
255 spi->FIFOCTL &= ~SPI_FIFOCTL_RXOVIEN_Msk;
256
258 spi->FIFOCTL &= ~SPI_FIFOCTL_RXTOIEN_Msk;
259}
260 /* end of group Mini58_SPI_EXPORTED_FUNCTIONS */
262 /* end of group Mini58_SPI_Driver */
264 /* end of group Mini58_Device_Driver */
266
267/*** (C) COPYRIGHT 2022 Nuvoton Technology Corp. ***/
Mini58 series peripheral access layer header file. This file contains all the peripheral register's d...
#define SPI_SSCTL_SSACTPOL_Msk
#define SPI_FIFOCTL_RXOVIEN_Msk
#define SPI_CTL_FIFOEN_Msk
#define SPI_SSCTL_SS_Msk
#define SPI_CTL_UNITIEN_Msk
#define SPI_FIFOCTL_RXTH_Pos
#define SPI_FIFOCTL_TXTH_Msk
#define SPI_CTL_DWIDTH_Pos
#define SPI_SSCTL_SSLTEN_Msk
#define SPI_FIFOCTL_RXRST_Msk
#define SPI_FIFOCTL_TXRST_Msk
#define SYS_IPRST1_SPI0RST_Msk
#define SPI_CLKDIV_DIVIDER_Msk
#define SPI_FIFOCTL_TXTH_Pos
#define SPI_FIFOCTL_RXTOIEN_Msk
#define SPI_FIFOCTL_RXTHIEN_Msk
#define SPI_FIFOCTL_RXTH_Msk
#define SPI_FIFOCTL_TXTHIEN_Msk
#define SPI_SSCTL_AUTOSS_Msk
#define SPI_SLVCTL_SLVSTIEN_Msk
#define CLK_CLKSEL1_SPISEL_XTAL
Definition: clk.h:78
#define CLK_CLKSEL1_SPISEL_PLL
Definition: clk.h:80
uint32_t CLK_GetHCLKFreq(void)
This function get HCLK frequency. The frequency unit is Hz.
Definition: clk.c:115
uint32_t CLK_GetLXTFreq(void)
This function get external low frequency crystal frequency. The frequency unit is Hz.
Definition: clk.c:103
__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
Definition: clk.h:197
uint32_t CLK_GetHXTFreq(void)
This function get external high frequency crystal frequency. The frequency unit is Hz.
Definition: clk.c:91
#define CLK_CLKSEL1_SPISEL_Msk
#define CLK
Pointer to CLK register structure.
#define SYS
Pointer to SYS register structure.
#define SPI_FIFO_TIMEOUT_INTEN_MASK
Definition: spi.h:50
#define SPI_FIFO_RX_INTEN_MASK
Definition: spi.h:48
#define SPI_SSTA_INTEN_MASK
Definition: spi.h:46
#define SPI_SLAVE
Definition: spi.h:38
#define SPI_FIFO_TX_INTEN_MASK
Definition: spi.h:47
#define SPI_FIFO_RXOV_INTEN_MASK
Definition: spi.h:49
#define SPI_IE_MASK
Definition: spi.h:45
void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask)
Disable FIFO related interrupts specified by u32Mask parameter.
Definition: spi.c:240
void SPI_DisableFIFO(SPI_T *spi)
Disable FIFO mode.
Definition: spi.c:169
void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask)
Enable FIFO related interrupts specified by u32Mask parameter.
Definition: spi.c:209
void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel)
Enable the automatic slave select function. Only available in Master mode.
Definition: spi.c:105
void SPI_EnableFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold)
Enable FIFO mode with user-specified Tx FIFO threshold and Rx FIFO threshold configurations.
Definition: spi.c:155
void SPI_DisableAutoSS(SPI_T *spi)
Disable the automatic slave select function.
Definition: spi.c:93
uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock)
Set the SPI bus clock. Only available in Master mode.
Definition: spi.c:116
void SPI_Close(SPI_T *spi)
Reset SPI module and disable SPI peripheral clock.
Definition: spi.c:61
void SPI_ClearTxFIFO(SPI_T *spi)
Clear Tx FIFO buffer.
Definition: spi.c:83
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. By default, the SPI transfer sequence is MSB firs...
Definition: spi.c:39
uint32_t SPI_GetBusClock(SPI_T *spi)
Get the actual frequency of SPI bus clock. Only available in Master mode.
Definition: spi.c:179
void SPI_ClearRxFIFO(SPI_T *spi)
Clear Rx FIFO buffer.
Definition: spi.c:73
__IO uint32_t CTL
__IO uint32_t CLKDIV
__IO uint32_t FIFOCTL
__IO uint32_t SSCTL
__IO uint32_t SLVCTL