|
STM32H7下使用LL库设置了SPI2的EOT中断,程序跑起来后不进EOT中断,找不到原因。
初始化代码如下:
static void bsp_Configure_SPI2(void)
{
/**SPI2 GPIO Configuration
PC3 ------> SPI2_MOSI
PC2 ------> SPI2_MISO
PB10 ------> SPI2_SCK
PB4 ------> SPI2_CS
*/
/* (1) Enables GPIO clock and configures the SPI2 pins ********************/
/* Enable the peripheral clock of GPIOA/GPIOB/GPIOC */
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA);
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB);
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);
/* Configure SCK Pin PB10*/
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_0_7(GPIOB, LL_GPIO_PIN_10, LL_GPIO_AF_5);
LL_GPIO_SetPinSpeed(GPIOB, LL_GPIO_PIN_10, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_10, LL_GPIO_PULL_DOWN);
/* Configure MISO Pin PC2*/
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_2, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_2, LL_GPIO_AF_5);
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_2, LL_GPIO_PULL_DOWN);
/* Configure MOSI Pin PC3*/
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_3, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_3, LL_GPIO_AF_5);
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_3, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_3, LL_GPIO_PULL_DOWN);
/* Configure CS2 Pin PB4*/
LL_GPIO_SetPinMode(GPIOB,LL_GPIO_PIN_4,LL_GPIO_MODE_OUTPUT);
LL_GPIO_SetPinSpeed(GPIOB,LL_GPIO_PIN_4,LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinPull(GPIOB,LL_GPIO_PIN_4,LL_GPIO_PULL_DOWN);
LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_4);
/* (2) Configure NVIC for SPI2 transfer complete/error interrupts **********/
/* Set priority for SPI2_IRQn */
NVIC_SetPriority(SPI2_IRQn, 0);
/* Enable SPI2_IRQn */
NVIC_EnableIRQ(SPI2_IRQn);
/* (3) Configure SPI2 functional parameters ********************************/
/* Enable the peripheral clock of SPI2 */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
/* Configure SPI2 communication */
LL_SPI_SetBaudRatePrescaler(SPI2,LL_SPI_BAUDRATEPRESCALER_DIV8);
LL_SPI_SetTransferDirection(SPI2,LL_SPI_FULL_DUPLEX);
LL_SPI_SetClockPhase(SPI2, LL_SPI_PHASE_2EDGE);
/* Setup Internal SS signal level to avoid a MODF Error if NSS Polarity is LOW, NSS Mode is SOFT and SPI Mode is Master */
LL_SPI_SetInternalSSLevel(SPI2, LL_SPI_SS_LEVEL_HIGH);
LL_SPI_SetClockPolarity(SPI2, LL_SPI_POLARITY_LOW);
/* Reset value is LL_SPI_MSB_FIRST */
LL_SPI_SetTransferBitOrder(SPI2, LL_SPI_MSB_FIRST);
LL_SPI_SetDataWidth(SPI2, LL_SPI_DATAWIDTH_8BIT);
LL_SPI_SetNSSMode(SPI2, LL_SPI_NSS_SOFT);
/* Reset value is LL_SPI_MODE_MASTER */
LL_SPI_SetMode(SPI2, LL_SPI_MODE_MASTER);
/* Lock GPIO for master to avoid glitches on the clock output */
LL_SPI_EnableGPIOControl(SPI2);
LL_SPI_EnableMasterRxAutoSuspend(SPI2);
/* Set number of data to transmit */
LL_SPI_SetTransferSize(SPI2, 6);
/* Enable TXP Interrupt */
// LL_SPI_EnableIT_TXP(SPI2);
/* Enable RXP Interrupt */
// LL_SPI_EnableIT_RXP(SPI2);
/* Enable SPI Errors Interrupt */
// LL_SPI_EnableIT_CRCERR(SPI2);
// LL_SPI_EnableIT_UDR(SPI2);
// LL_SPI_EnableIT_OVR(SPI2);
LL_SPI_EnableIT_EOT(SPI2);
/* Enable SPI2 */
LL_SPI_Enable(SPI2);
}
相同的方式配置SPI6,SPI6就可以正常的工作。感觉SPI2和SPI6两者之间是有差异的,就是不了解其中有何不同。
|
|