18#if defined(USE_FULL_LL_DRIVER)
26#include "stm32_assert.h"
28#define assert_param(expr) ((void)0U)
35#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6)
49#define SPI_CR1_CLEAR_MASK (SPI_CR1_CPHA | SPI_CR1_CPOL | SPI_CR1_MSTR | \
50 SPI_CR1_BR | SPI_CR1_LSBFIRST | SPI_CR1_SSI | \
51 SPI_CR1_SSM | SPI_CR1_RXONLY | SPI_CR1_DFF | \
52 SPI_CR1_CRCNEXT | SPI_CR1_CRCEN | SPI_CR1_BIDIOE | \
62#define IS_LL_SPI_TRANSFER_DIRECTION(__VALUE__) (((__VALUE__) == LL_SPI_FULL_DUPLEX) \
63 || ((__VALUE__) == LL_SPI_SIMPLEX_RX) \
64 || ((__VALUE__) == LL_SPI_HALF_DUPLEX_RX) \
65 || ((__VALUE__) == LL_SPI_HALF_DUPLEX_TX))
67#define IS_LL_SPI_MODE(__VALUE__) (((__VALUE__) == LL_SPI_MODE_MASTER) \
68 || ((__VALUE__) == LL_SPI_MODE_SLAVE))
70#define IS_LL_SPI_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_SPI_DATAWIDTH_8BIT) \
71 || ((__VALUE__) == LL_SPI_DATAWIDTH_16BIT))
73#define IS_LL_SPI_POLARITY(__VALUE__) (((__VALUE__) == LL_SPI_POLARITY_LOW) \
74 || ((__VALUE__) == LL_SPI_POLARITY_HIGH))
76#define IS_LL_SPI_PHASE(__VALUE__) (((__VALUE__) == LL_SPI_PHASE_1EDGE) \
77 || ((__VALUE__) == LL_SPI_PHASE_2EDGE))
79#define IS_LL_SPI_NSS(__VALUE__) (((__VALUE__) == LL_SPI_NSS_SOFT) \
80 || ((__VALUE__) == LL_SPI_NSS_HARD_INPUT) \
81 || ((__VALUE__) == LL_SPI_NSS_HARD_OUTPUT))
83#define IS_LL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV2) \
84 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV4) \
85 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV8) \
86 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV16) \
87 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV32) \
88 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV64) \
89 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV128) \
90 || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV256))
92#define IS_LL_SPI_BITORDER(__VALUE__) (((__VALUE__) == LL_SPI_LSB_FIRST) \
93 || ((__VALUE__) == LL_SPI_MSB_FIRST))
95#define IS_LL_SPI_CRCCALCULATION(__VALUE__) (((__VALUE__) == LL_SPI_CRCCALCULATION_ENABLE) \
96 || ((__VALUE__) == LL_SPI_CRCCALCULATION_DISABLE))
98#define IS_LL_SPI_CRC_POLYNOMIAL(__VALUE__) ((__VALUE__) >= 0x1U)
122ErrorStatus LL_SPI_DeInit(
const SPI_TypeDef *SPIx)
124 ErrorStatus status = ERROR;
133 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1);
136 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1);
145 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2);
148 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2);
157 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI3);
160 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI3);
169 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI4);
172 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI4);
181 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI5);
184 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI5);
193 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI6);
196 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI6);
214ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct)
216 ErrorStatus status = ERROR;
222 assert_param(IS_LL_SPI_TRANSFER_DIRECTION(SPI_InitStruct->TransferDirection));
224 assert_param(IS_LL_SPI_DATAWIDTH(SPI_InitStruct->DataWidth));
225 assert_param(IS_LL_SPI_POLARITY(SPI_InitStruct->ClockPolarity));
226 assert_param(IS_LL_SPI_PHASE(SPI_InitStruct->ClockPhase));
228 assert_param(IS_LL_SPI_BAUDRATE(SPI_InitStruct->BaudRate));
229 assert_param(IS_LL_SPI_BITORDER(SPI_InitStruct->BitOrder));
230 assert_param(IS_LL_SPI_CRCCALCULATION(SPI_InitStruct->CRCCalculation));
232 if (LL_SPI_IsEnabled(SPIx) == 0x00000000U)
246 MODIFY_REG(SPIx->CR1,
248 SPI_InitStruct->TransferDirection | SPI_InitStruct->Mode | SPI_InitStruct->DataWidth |
249 SPI_InitStruct->ClockPolarity | SPI_InitStruct->ClockPhase |
250 SPI_InitStruct->NSS | SPI_InitStruct->BaudRate |
251 SPI_InitStruct->BitOrder | SPI_InitStruct->CRCCalculation);
257 MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, (SPI_InitStruct->NSS >> 16U));
263 if (SPI_InitStruct->CRCCalculation == LL_SPI_CRCCALCULATION_ENABLE)
265 assert_param(IS_LL_SPI_CRC_POLYNOMIAL(SPI_InitStruct->CRCPoly));
266 LL_SPI_SetCRCPolynomial(SPIx, SPI_InitStruct->CRCPoly);
272 CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD);
282void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct)
285 SPI_InitStruct->TransferDirection = LL_SPI_FULL_DUPLEX;
286 SPI_InitStruct->Mode = LL_SPI_MODE_SLAVE;
287 SPI_InitStruct->DataWidth = LL_SPI_DATAWIDTH_8BIT;
288 SPI_InitStruct->ClockPolarity = LL_SPI_POLARITY_LOW;
289 SPI_InitStruct->ClockPhase = LL_SPI_PHASE_1EDGE;
290 SPI_InitStruct->NSS = LL_SPI_NSS_HARD_INPUT;
291 SPI_InitStruct->BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2;
292 SPI_InitStruct->BitOrder = LL_SPI_MSB_FIRST;
293 SPI_InitStruct->CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
294 SPI_InitStruct->CRCPoly = 7U;
320#define I2S_I2SCFGR_CLEAR_MASK (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | \
321 SPI_I2SCFGR_CKPOL | SPI_I2SCFGR_I2SSTD | \
322 SPI_I2SCFGR_I2SCFG | SPI_I2SCFGR_I2SMOD )
324#define I2S_I2SPR_CLEAR_MASK 0x0002U
333#define IS_LL_I2S_DATAFORMAT(__VALUE__) (((__VALUE__) == LL_I2S_DATAFORMAT_16B) \
334 || ((__VALUE__) == LL_I2S_DATAFORMAT_16B_EXTENDED) \
335 || ((__VALUE__) == LL_I2S_DATAFORMAT_24B) \
336 || ((__VALUE__) == LL_I2S_DATAFORMAT_32B))
338#define IS_LL_I2S_CPOL(__VALUE__) (((__VALUE__) == LL_I2S_POLARITY_LOW) \
339 || ((__VALUE__) == LL_I2S_POLARITY_HIGH))
341#define IS_LL_I2S_STANDARD(__VALUE__) (((__VALUE__) == LL_I2S_STANDARD_PHILIPS) \
342 || ((__VALUE__) == LL_I2S_STANDARD_MSB) \
343 || ((__VALUE__) == LL_I2S_STANDARD_LSB) \
344 || ((__VALUE__) == LL_I2S_STANDARD_PCM_SHORT) \
345 || ((__VALUE__) == LL_I2S_STANDARD_PCM_LONG))
347#define IS_LL_I2S_MODE(__VALUE__) (((__VALUE__) == LL_I2S_MODE_SLAVE_TX) \
348 || ((__VALUE__) == LL_I2S_MODE_SLAVE_RX) \
349 || ((__VALUE__) == LL_I2S_MODE_MASTER_TX) \
350 || ((__VALUE__) == LL_I2S_MODE_MASTER_RX))
352#define IS_LL_I2S_MCLK_OUTPUT(__VALUE__) (((__VALUE__) == LL_I2S_MCLK_OUTPUT_ENABLE) \
353 || ((__VALUE__) == LL_I2S_MCLK_OUTPUT_DISABLE))
355#define IS_LL_I2S_AUDIO_FREQ(__VALUE__) ((((__VALUE__) >= LL_I2S_AUDIOFREQ_8K) \
356 && ((__VALUE__) <= LL_I2S_AUDIOFREQ_192K)) \
357 || ((__VALUE__) == LL_I2S_AUDIOFREQ_DEFAULT))
359#define IS_LL_I2S_PRESCALER_LINEAR(__VALUE__) ((__VALUE__) >= 0x2U)
361#define IS_LL_I2S_PRESCALER_PARITY(__VALUE__) (((__VALUE__) == LL_I2S_PRESCALER_PARITY_EVEN) \
362 || ((__VALUE__) == LL_I2S_PRESCALER_PARITY_ODD))
385ErrorStatus LL_I2S_DeInit(
const SPI_TypeDef *SPIx)
387 return LL_SPI_DeInit(SPIx);
400ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct)
402 uint32_t i2sdiv = 2U;
403 uint32_t i2sodd = 0U;
404 uint32_t packetlength = 1U;
406 uint32_t sourceclock;
407 ErrorStatus status = ERROR;
412 assert_param(IS_LL_I2S_STANDARD(I2S_InitStruct->Standard));
413 assert_param(IS_LL_I2S_DATAFORMAT(I2S_InitStruct->DataFormat));
414 assert_param(IS_LL_I2S_MCLK_OUTPUT(I2S_InitStruct->MCLKOutput));
415 assert_param(IS_LL_I2S_AUDIO_FREQ(I2S_InitStruct->AudioFreq));
416 assert_param(IS_LL_I2S_CPOL(I2S_InitStruct->ClockPolarity));
418 if (LL_I2S_IsEnabled(SPIx) == 0x00000000U)
429 MODIFY_REG(SPIx->I2SCFGR,
430 I2S_I2SCFGR_CLEAR_MASK,
431 I2S_InitStruct->Mode | I2S_InitStruct->Standard |
432 I2S_InitStruct->DataFormat | I2S_InitStruct->ClockPolarity |
444 if (I2S_InitStruct->AudioFreq != LL_I2S_AUDIOFREQ_DEFAULT)
449 if (I2S_InitStruct->DataFormat != LL_I2S_DATAFORMAT_16B)
458 sourceclock = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
461 if (I2S_InitStruct->MCLKOutput == LL_I2S_MCLK_OUTPUT_ENABLE)
464 tmp = (((((sourceclock / 256U) * 10U) / I2S_InitStruct->AudioFreq)) + 5U);
469 tmp = (((((sourceclock / (32U * packetlength)) * 10U) / I2S_InitStruct->AudioFreq)) + 5U);
476 i2sodd = (tmp & (uint16_t)0x0001U);
479 i2sdiv = ((tmp - i2sodd) / 2U);
482 i2sodd = (i2sodd << 8U);
486 if ((i2sdiv < 2U) || (i2sdiv > 0xFFU))
494 WRITE_REG(SPIx->I2SPR, i2sdiv | i2sodd | I2S_InitStruct->MCLKOutput);
507void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct)
510 I2S_InitStruct->Mode = LL_I2S_MODE_SLAVE_TX;
511 I2S_InitStruct->Standard = LL_I2S_STANDARD_PHILIPS;
512 I2S_InitStruct->DataFormat = LL_I2S_DATAFORMAT_16B;
513 I2S_InitStruct->MCLKOutput = LL_I2S_MCLK_OUTPUT_DISABLE;
514 I2S_InitStruct->AudioFreq = LL_I2S_AUDIOFREQ_DEFAULT;
515 I2S_InitStruct->ClockPolarity = LL_I2S_POLARITY_LOW;
529void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity)
533 assert_param(IS_LL_I2S_PRESCALER_LINEAR(PrescalerLinear));
534 assert_param(IS_LL_I2S_PRESCALER_PARITY(PrescalerParity));
537 MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV | SPI_I2SPR_ODD, PrescalerLinear | (PrescalerParity << 8U));
540#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
555ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct)
558 ErrorStatus status = ERROR;
563 assert_param(IS_LL_I2S_STANDARD(I2S_InitStruct->Standard));
564 assert_param(IS_LL_I2S_DATAFORMAT(I2S_InitStruct->DataFormat));
565 assert_param(IS_LL_I2S_CPOL(I2S_InitStruct->ClockPolarity));
567 if (LL_I2S_IsEnabled(I2Sxext) == 0x00000000U)
578 WRITE_REG(I2Sxext->I2SPR, I2S_I2SPR_CLEAR_MASK);
581 if ((I2S_InitStruct->Mode == LL_I2S_MODE_MASTER_TX) || (I2S_InitStruct->Mode == LL_I2S_MODE_SLAVE_TX))
583 mode = LL_I2S_MODE_SLAVE_RX;
587 if ((I2S_InitStruct->Mode == LL_I2S_MODE_MASTER_RX) || (I2S_InitStruct->Mode == LL_I2S_MODE_SLAVE_RX))
589 mode = LL_I2S_MODE_SLAVE_TX;
594 MODIFY_REG(I2Sxext->I2SCFGR,
595 I2S_I2SCFGR_CLEAR_MASK,
596 I2S_InitStruct->Standard |
597 I2S_InitStruct->DataFormat | I2S_InitStruct->ClockPolarity |
598 SPI_I2SCFGR_I2SMOD | mode);
#define assert_param(expr)
Header file of BUS LL module.
Header file of RCC LL module.
Header file of SPI LL module.