G32R430 Device Driver Layer v1.0.4
G32R4xx Device Driver Layer API Reference
g32r4xx_ddl_spi.c
Go to the documentation of this file.
1
43#if defined(USE_FULL_DDL_DRIVER)
44
45/* Includes ------------------------------------------------------------------*/
46#include "g32r4xx_ddl_spi.h"
47#include "g32r4xx_ddl_rcm.h"
48
49#ifdef USE_FULL_ASSERT
50#include "g32_assert.h"
51#else
52#define ASSERT_PARAM(_PARAM_) ((void)0U)
53#endif /* USE_FULL_ASSERT */
54
58
62
63/* Private types -------------------------------------------------------------*/
64/* Private variables ---------------------------------------------------------*/
65
66/* Private constants ---------------------------------------------------------*/
70/* SPI registers Masks */
71#define SPI_CTRL1_CLEAR_MASK (SPI_CTRL1_CPHA | SPI_CTRL1_CPOL | SPI_CTRL1_MSMCFG | \
72 SPI_CTRL1_BRSEL | SPI_CTRL1_LSBSEL | SPI_CTRL1_ISSEL | \
73 SPI_CTRL1_SSEN | SPI_CTRL1_RXOMEN | SPI_CTRL1_DFLSEL | \
74 SPI_CTRL1_CRCNXT | SPI_CTRL1_CRCEN | SPI_CTRL1_BMOEN | \
75 SPI_CTRL1_BMEN)
76
79
80/* Private macros ------------------------------------------------------------*/
84#define IS_DDL_SPI_TRANSFER_DIRECTION(__VALUE__) (((__VALUE__) == DDL_SPI_FULL_DUPLEX) \
85 || ((__VALUE__) == DDL_SPI_SIMPLEX_RX) \
86 || ((__VALUE__) == DDL_SPI_HALF_DUPLEX_RX) \
87 || ((__VALUE__) == DDL_SPI_HALF_DUPLEX_TX))
88
89#define IS_DDL_SPI_MODE(__VALUE__) (((__VALUE__) == DDL_SPI_MODE_MASTER) \
90 || ((__VALUE__) == DDL_SPI_MODE_SLAVE))
91
92#define IS_DDL_SPI_DATAWIDTH(__VALUE__) (((__VALUE__) == DDL_SPI_DATAWIDTH_8BIT) \
93 || ((__VALUE__) == DDL_SPI_DATAWIDTH_16BIT))
94
95#define IS_DDL_SPI_POLARITY(__VALUE__) (((__VALUE__) == DDL_SPI_POLARITY_LOW) \
96 || ((__VALUE__) == DDL_SPI_POLARITY_HIGH))
97
98#define IS_DDL_SPI_PHASE(__VALUE__) (((__VALUE__) == DDL_SPI_PHASE_1EDGE) \
99 || ((__VALUE__) == DDL_SPI_PHASE_2EDGE))
100
101#define IS_DDL_SPI_NSS(__VALUE__) (((__VALUE__) == DDL_SPI_NSS_SOFT) \
102 || ((__VALUE__) == DDL_SPI_NSS_HARD_INPUT) \
103 || ((__VALUE__) == DDL_SPI_NSS_HARD_OUTPUT))
104
105#define IS_DDL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV2) \
106 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV4) \
107 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV8) \
108 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV16) \
109 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV32) \
110 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV64) \
111 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV128) \
112 || ((__VALUE__) == DDL_SPI_BAUDRATEPRESCALER_DIV256))
113
114#define IS_DDL_SPI_BITORDER(__VALUE__) (((__VALUE__) == DDL_SPI_LSB_FIRST) \
115 || ((__VALUE__) == DDL_SPI_MSB_FIRST))
116
117#define IS_DDL_SPI_CRCCALCULATION(__VALUE__) (((__VALUE__) == DDL_SPI_CRCCALCULATION_ENABLE) \
118 || ((__VALUE__) == DDL_SPI_CRCCALCULATION_DISABLE))
119
120#define IS_DDL_SPI_CRC_POLYNOMIAL(__VALUE__) ((__VALUE__) >= 0x1U)
121
125
126/* Private function prototypes -----------------------------------------------*/
127
128/* Exported functions --------------------------------------------------------*/
132
136
144ErrorStatus DDL_SPI_DeInit(SPI_TypeDef *SPIx)
145{
146 (void)SPIx;
147
148 ErrorStatus status = ERROR;
149
150 /* Check the parameters */
151 ASSERT_PARAM(IS_SPI_ALL_INSTANCE(SPIx));
152
154
155 /* Force reset of SPI clock */
157
158 /* Release reset of SPI clock */
160
161 status = SUCCESS;
162
163 return status;
164}
165
174ErrorStatus DDL_SPI_Init(SPI_TypeDef *SPIx, DDL_SPI_InitTypeDef *SPI_InitStruct)
175{
176 ErrorStatus status = ERROR;
177
178 /* Check the SPI Instance SPIx*/
179 ASSERT_PARAM(IS_SPI_ALL_INSTANCE(SPIx));
180
181 /* Check the SPI parameters from SPI_InitStruct*/
183 ASSERT_PARAM(IS_DDL_SPI_MODE(SPI_InitStruct->Mode));
186 ASSERT_PARAM(IS_DDL_SPI_PHASE(SPI_InitStruct->ClockPhase));
187 ASSERT_PARAM(IS_DDL_SPI_NSS(SPI_InitStruct->NSS));
188 ASSERT_PARAM(IS_DDL_SPI_BAUDRATE(SPI_InitStruct->BaudRate));
189 ASSERT_PARAM(IS_DDL_SPI_BITORDER(SPI_InitStruct->BitOrder));
191
192 if (DDL_SPI_IsEnabled(SPIx) == 0x00000000U)
193 {
194 /*---------------------------- SPIx CTRL1 Configuration ------------------------
195 * Configure SPIx CTRL1 with parameters:
196 * - TransferDirection: SPI_CTRL1_BMEN, SPI_CTRL1_BMOEN and SPI_CTRL1_RXOMEN bits
197 * - Master/Slave Mode: SPI_CTRL1_MSMCFG bit
198 * - DataWidth: SPI_CTRL1_DFLSEL bit
199 * - ClockPolarity: SPI_CTRL1_CPOL bit
200 * - ClockPhase: SPI_CTRL1_CPHA bit
201 * - NSS management: SPI_CTRL1_SSEN bit
202 * - BaudRate prescaler: SPI_CTRL1_BRSEL[2:0] bits
203 * - BitOrder: SPI_CTRL1_LSBSEL bit
204 * - CRCCalculation: SPI_CTRL1_CRCEN bit
205 */
206 MODIFY_REG(SPIx->CTRL1,
208 SPI_InitStruct->TransferDirection | SPI_InitStruct->Mode | SPI_InitStruct->DataWidth |
209 SPI_InitStruct->ClockPolarity | SPI_InitStruct->ClockPhase |
210 SPI_InitStruct->NSS | SPI_InitStruct->BaudRate |
211 SPI_InitStruct->BitOrder | SPI_InitStruct->CRCCalculation);
212
213 /*---------------------------- SPIx CTRL2 Configuration ------------------------
214 * Configure SPIx CTRL2 with parameters:
215 * - NSS management: SSOE bit
216 */
217 MODIFY_REG(SPIx->CTRL2, SPI_CTRL2_SSOEN, (SPI_InitStruct->NSS >> 16U));
218
219 /*---------------------------- SPIx CRCPOLY Configuration ----------------------
220 * Configure SPIx CRCPR with parameters:
221 * - CRCPoly: CRCPOLY[15:0] bits
222 */
223 if (SPI_InitStruct->CRCCalculation == DDL_SPI_CRCCALCULATION_ENABLE)
224 {
226 DDL_SPI_SetCRCPolynomial(SPIx, SPI_InitStruct->CRCPoly);
227 }
228 status = SUCCESS;
229 }
230
231 return status;
232}
233
241{
242 /* Set SPI_InitStruct fields to default values */
243 SPI_InitStruct->TransferDirection = DDL_SPI_FULL_DUPLEX;
244 SPI_InitStruct->Mode = DDL_SPI_MODE_SLAVE;
245 SPI_InitStruct->DataWidth = DDL_SPI_DATAWIDTH_8BIT;
246 SPI_InitStruct->ClockPolarity = DDL_SPI_POLARITY_LOW;
247 SPI_InitStruct->ClockPhase = DDL_SPI_PHASE_1EDGE;
248 SPI_InitStruct->NSS = DDL_SPI_NSS_HARD_INPUT;
250 SPI_InitStruct->BitOrder = DDL_SPI_MSB_FIRST;
252 SPI_InitStruct->CRCPoly = 7U;
253}
254
258
262
266
270
271#endif /* USE_FULL_DDL_DRIVER */
272
G32 assert template file. This file should be copied to the application folder and renamed to g32_ass...
#define ASSERT_PARAM(_PARAM_)
Definition g32_assert.h:58
Header file of RCM DDL module.
Header file of SPI DDL module.
#define DDL_RCM_APB_RESET_SPI
__STATIC_INLINE void DDL_RCM_Unlock(void)
Unlock the RCM register.
__STATIC_INLINE void DDL_RCM_EnableAPBReset(uint32_t Peripheral)
Enable the APB peripheral reset.
__STATIC_INLINE void DDL_RCM_DisableAPBReset(uint32_t Peripheral)
Disable the APB peripheral reset.
#define DDL_SPI_BAUDRATEPRESCALER_DIV2
#define DDL_SPI_MSB_FIRST
#define DDL_SPI_CRCCALCULATION_ENABLE
#define DDL_SPI_CRCCALCULATION_DISABLE
#define DDL_SPI_DATAWIDTH_8BIT
#define DDL_SPI_MODE_SLAVE
#define DDL_SPI_NSS_HARD_INPUT
#define DDL_SPI_PHASE_1EDGE
#define DDL_SPI_POLARITY_LOW
#define DDL_SPI_FULL_DUPLEX
__STATIC_INLINE void DDL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly)
Set polynomial for CRC calculation.
__STATIC_INLINE uint32_t DDL_SPI_IsEnabled(SPI_TypeDef *SPIx)
Check if SPI peripheral is enabled.
ErrorStatus DDL_SPI_Init(SPI_TypeDef *SPIx, DDL_SPI_InitTypeDef *SPI_InitStruct)
Initialize the SPI registers according to the specified parameters in SPI_InitStruct.
void DDL_SPI_StructInit(DDL_SPI_InitTypeDef *SPI_InitStruct)
Set each DDL_SPI_InitTypeDef field to default value.
ErrorStatus DDL_SPI_DeInit(SPI_TypeDef *SPIx)
De-initialize the SPI registers to their default reset values.
#define SPI_CTRL1_CLEAR_MASK
#define IS_DDL_SPI_CRC_POLYNOMIAL(__VALUE__)
#define IS_DDL_SPI_BITORDER(__VALUE__)
#define IS_DDL_SPI_NSS(__VALUE__)
#define IS_DDL_SPI_DATAWIDTH(__VALUE__)
#define IS_DDL_SPI_POLARITY(__VALUE__)
#define IS_DDL_SPI_CRCCALCULATION(__VALUE__)
#define IS_DDL_SPI_PHASE(__VALUE__)
#define IS_DDL_SPI_BAUDRATE(__VALUE__)
#define IS_DDL_SPI_MODE(__VALUE__)
#define IS_DDL_SPI_TRANSFER_DIRECTION(__VALUE__)
SPI Init structures definition.