2017-02-16 343 views
1

我有一個簡單的項目,使用CubeMX創建外圍設備初始化。STM32F0 SPI接收中斷沒有觸發

SPI處於從機模式,似乎被正確初始化,但是當我時鐘8位數據時,中斷不會被調用。

下面的代碼

/* SPI1 init function */ 
static void MX_SPI1_Init(void) 
{ 

    hspi1.Instance = SPI1; 
    hspi1.Init.Mode = SPI_MODE_SLAVE; 
    hspi1.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi1.Init.NSS = SPI_NSS_SOFT; 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi1.Init.CRCPolynomial = 7; 
    hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; 
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; 

    if (HAL_SPI_Init(&hspi1) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) 
{ 

    GPIO_InitTypeDef GPIO_InitStruct; 
    if(hspi->Instance==SPI1) 
    { 
    /* USER CODE BEGIN SPI1_MspInit 0 */ 

    /* USER CODE END SPI1_MspInit 0 */ 
    /* Peripheral clock enable */ 
    __HAL_RCC_SPI1_CLK_ENABLE(); 

    /**SPI1 GPIO Configuration  
    PA5  ------> SPI1_SCK 
    PA6  ------> SPI1_MISO 
    PA7  ------> SPI1_MOSI 
    */ 
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; 
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

    /* Peripheral interrupt init */ 
    HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(SPI1_IRQn); 
    /* USER CODE BEGIN SPI1_MspInit 1 */ 

    /* USER CODE END SPI1_MspInit 1 */ 
    } 

} 

void SPI1_IRQHandler(void) 
{ 
    /* USER CODE BEGIN SPI1_IRQn 0 */ 

    /* USER CODE END SPI1_IRQn 0 */ 
    HAL_SPI_IRQHandler(&hspi1); 
    /* USER CODE BEGIN SPI1_IRQn 1 */ 
    spi_interrupt(); 
    /* USER CODE END SPI1_IRQn 1 */ 
} 

spi_interrupt()是我中斷動作特定代碼,並在一個斷點永遠不會觸發。

我在CLKIN引腳上有一個範圍,它的確有8個時鐘。

+1

您是否在代碼中的任何位置調用過'HAL_SPI_Receive_IT'?因爲實際啓用中斷,你必須調用這個宏__HAL_SPI_ENABLE_IT(hspi,(SPI_IT_RXNE | SPI_IT_ERR));''HAL_SPI_Receive_IT'爲你調用它,IRQ處理程序在收到給定字節數後禁用它。 –

+0

謝謝你本斯,這是正確的解決方案:) – OXO

+0

很高興在這裏,我會把它放在答案然後。 –

回答

2

ST的HAL庫不會在初始化函數中啓用實際的外設中斷。

對於幾乎所有的外設,都必須調用一個附加函數,它總是具有以下名稱結構HAL_<peripheral>_<action>_IT,因此在SPI RX的情況下,它被稱爲HAL_SPI_Receive_IT

這實際上允許通過使用名爲__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR))的宏設置正確的位來接收SPI RX中斷。

注意,如果達到(這個值在HAL_SPI_Receive_IT由用戶通過)預期的字節數,則HAL_SPI_IRQHandler將禁止SPI RX再次中斷,因此需要在新接收的情況下重複HAL_SPI_Receive_IT通話。