/* Private functions */ static void TM_SPIx_Init(SPI_TypeDef* SPIx, TM_SPI_PinsPack_t pinspack, TM_SPI_Mode_t SPI_Mode, uint16_t SPI_BaudRatePrescaler, uint16_t SPI_MasterSlave, uint16_t SPI_FirstBit) { SPI_InitTypeDef SPI_InitStruct; // 這一個 Function 直接呼叫到 STM32 所提供的 Function,此 Function 的功能在於,把 SPI 的結構,填上預設值。 /* Set default settings */ SPI_StructInit(&SPI_InitStruct); // 接下來的各個 Region,分別對於各自的 SPI 做個別的設定。 // 在這邊先只註解第一個 (SPI 1) #ifdef SPI1 if (SPIx == SPI1) { /* * 把 APB2 Enable 起來,因為 SPI 1 要使用 APB2 這一個 Bus * 我們注意到,SPI 1, 4, 5, 6 皆使用 APB2 這一個 Bus * SPI 2, 3 則是使用 APB1 這一個 Bus * * 因此藉由 RCC->APB2ENR 來 Enable Clock,並使用 API 給予的 Define。 * */ /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // 這邊進行 TM Library 的 Pin 的設定 /* Init pins */ TM_SPI1_INT_InitPins(pinspack); // 設定 SPI 1 DataSize,這邊比照 STM32 預設值 /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI1_DATASIZE; } #endif #ifdef SPI2 if (SPIx == SPI2) { /* Enable SPI clock */ RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; /* Init pins */ TM_SPI2_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI2_DATASIZE; } #endif #ifdef SPI3 if (SPIx == SPI3) { /* Enable SPI clock */ RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; /* Init pins */ TM_SPI3_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI3_DATASIZE; } #endif #ifdef SPI4 if (SPIx == SPI4) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; /* Init pins */ TM_SPI4_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI4_DATASIZE; } #endif #ifdef SPI5 if (SPIx == SPI5) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI5EN; /* Init pins */ TM_SPI5_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI5_DATASIZE; } #endif #ifdef SPI6 if (SPIx == SPI6) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI6EN; /* Init pins */ TM_SPI6_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI6_DATASIZE; } #endif // 這邊再重新給予一次 SPI 各個的參數 /* Fill SPI settings */ SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit; SPI_InitStruct.SPI_Mode = SPI_MasterSlave; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // 這邊給予不同的 SPI Mode,然後設定不一樣的 CPOL, CPHA // 看起來 STM 是靠 SPI_CPOL, SPI_CPHA 來決定 Mode (有點像是設定哪一種觸發方式、高低相位等) /* SPI mode */ if (SPI_Mode == TM_SPI_Mode_0) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; } else if (SPI_Mode == TM_SPI_Mode_1) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; } else if (SPI_Mode == TM_SPI_Mode_2) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; } else if (SPI_Mode == TM_SPI_Mode_3) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; } /* Disable first */ SPIx->CR1 &= ~SPI_CR1_SPE; // 先至 SPI Register 直接進行 Disable /* Init SPI */ SPI_Init(SPIx, &SPI_InitStruct); // 直接下至 STM32 所提供的 SPI Init Function /* Enable SPI */ SPIx->CR1 |= SPI_CR1_SPE; // Enable SPI Register }
/* Private functions */ static void TM_SPIx_Init(SPI_TypeDef* SPIx, TM_SPI_PinsPack_t pinspack, TM_SPI_Mode_t SPI_Mode, uint16_t SPI_BaudRatePrescaler, uint16_t SPI_MasterSlave, uint16_t SPI_FirstBit) { SPI_HandleTypeDef SPIHandle; /* Save instance */ SPIHandle.Instance = SPIx; #ifdef SPI1 if (SPIx == SPI1) { /* Enable SPI clock */ __HAL_RCC_SPI1_CLK_ENABLE(); /* Init pins */ TM_SPI1_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI1_DATASIZE; } #endif #ifdef SPI2 if (SPIx == SPI2) { /* Enable SPI clock */ __HAL_RCC_SPI2_CLK_ENABLE(); /* Init pins */ TM_SPI2_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI2_DATASIZE; } #endif #ifdef SPI3 if (SPIx == SPI3) { /* Enable SPI clock */ __HAL_RCC_SPI3_CLK_ENABLE(); /* Init pins */ TM_SPI3_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI3_DATASIZE; } #endif #ifdef SPI4 if (SPIx == SPI4) { /* Enable SPI clock */ __HAL_RCC_SPI4_CLK_ENABLE(); /* Init pins */ TM_SPI4_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI4_DATASIZE; } #endif #ifdef SPI5 if (SPIx == SPI5) { /* Enable SPI clock */ __HAL_RCC_SPI5_CLK_ENABLE(); /* Init pins */ TM_SPI5_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI5_DATASIZE; } #endif #ifdef SPI6 if (SPIx == SPI6) { /* Enable SPI clock */ __HAL_RCC_SPI6_CLK_ENABLE(); /* Init pins */ TM_SPI6_INT_InitPins(pinspack); /* Set options */ SPIHandle.Init.DataSize = TM_SPI6_DATASIZE; } #endif /* Fill SPI settings */ SPIHandle.Init.BaudRatePrescaler = SPI_BaudRatePrescaler; SPIHandle.Init.FirstBit = SPI_FirstBit; SPIHandle.Init.Mode = SPI_MasterSlave; SPIHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; SPIHandle.Init.CRCPolynomial = 7; SPIHandle.Init.TIMode = SPI_TIMODE_DISABLE; SPIHandle.Init.NSS = SPI_NSS_SOFT; SPIHandle.Init.Direction = SPI_DIRECTION_2LINES; #if defined(STM32F7xx) SPIHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; SPIHandle.Init.CRCLength = SPI_CRC_LENGTH_8BIT; #endif /* SPI mode */ if (SPI_Mode == TM_SPI_Mode_0) { SPIHandle.Init.CLKPolarity = SPI_POLARITY_LOW; SPIHandle.Init.CLKPhase = SPI_PHASE_1EDGE; } else if (SPI_Mode == TM_SPI_Mode_1) { SPIHandle.Init.CLKPolarity = SPI_POLARITY_LOW; SPIHandle.Init.CLKPhase = SPI_PHASE_2EDGE; } else if (SPI_Mode == TM_SPI_Mode_2) { SPIHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; SPIHandle.Init.CLKPhase = SPI_PHASE_1EDGE; } else if (SPI_Mode == TM_SPI_Mode_3) { SPIHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; SPIHandle.Init.CLKPhase = SPI_PHASE_2EDGE; } /* Disable first */ __HAL_SPI_DISABLE(&SPIHandle); /* Init SPI */ HAL_SPI_Init(&SPIHandle); /* Enable SPI */ __HAL_SPI_ENABLE(&SPIHandle); }
/* Private functions */ static void TM_SPIx_Init(SPI_TypeDef* SPIx, TM_SPI_PinsPack_t pinspack, TM_SPI_Mode_t SPI_Mode, uint16_t SPI_BaudRatePrescaler, uint16_t SPI_MasterSlave, uint16_t SPI_FirstBit) { SPI_InitTypeDef SPI_InitStruct; /* Set default settings */ SPI_StructInit(&SPI_InitStruct); #ifdef USE_SPI1 if (SPIx == SPI1) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; /* Init pins */ TM_SPI1_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI1_DATASIZE; } #endif #ifdef USE_SPI2 if (SPIx == SPI2) { /* Enable SPI clock */ RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; /* Init pins */ TM_SPI2_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI2_DATASIZE; } #endif #ifdef USE_SPI3 if (SPIx == SPI3) { /* Enable SPI clock */ RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; /* Init pins */ TM_SPI3_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI3_DATASIZE; } #endif #ifdef USE_SPI4 if (SPIx == SPI4) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; /* Init pins */ TM_SPI4_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI4_DATASIZE; } #endif #ifdef USE_SPI5 if (SPIx == SPI5) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI5EN; /* Init pins */ TM_SPI5_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI5_DATASIZE; } #endif #ifdef USE_SPI6 if (SPIx == SPI6) { /* Enable SPI clock */ RCC->APB2ENR |= RCC_APB2ENR_SPI6EN; /* Init pins */ TM_SPI6_INT_InitPins(pinspack); /* Set options */ SPI_InitStruct.SPI_DataSize = TM_SPI6_DATASIZE; } #endif /* Fill SPI settings */ SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit; SPI_InitStruct.SPI_Mode = SPI_MasterSlave; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; //SPI_InitStruct.SPI_DataSize = SPI_DataSize_16b; /* SPI mode */ if (SPI_Mode == TM_SPI_Mode_0) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; } else if (SPI_Mode == TM_SPI_Mode_1) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; } else if (SPI_Mode == TM_SPI_Mode_2) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; } else if (SPI_Mode == TM_SPI_Mode_3) { SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; } /* Disable first */ SPIx->CR1 &= ~SPI_CR1_SPE; /* Init SPI */ SPI_Init(SPIx, &SPI_InitStruct); /* Enable SPI */ SPIx->CR1 |= SPI_CR1_SPE; }