簡體   English   中英

使用中斷時STM32 SPI丟棄數據

[英]STM32 SPI dropping data while using interrupt

我正在嘗試使用中斷通過SPI發送可變大小的字節數組。 該系統由兩個核STM32L432板組成。 發送器板工作正常,但是接收器板出現問題。 具體來說,我注意到很多時候會丟棄一些字節。 除了CubeMX提供的默認初始化之外,我的init函數還具有以下設置:

// Trigger RXNE when the FIFO is 1/4 full
LL_SPI_SetRxFIFOThreshold(sw.spi_sw2pc,LL_SPI_RX_FIFO_TH_QUARTER);

// Enable RXNE interrupt
LL_SPI_EnableIT_RXNE(sw.spi_sw2pc);

// Enable SPI
if((SPI3->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
{
    // If disabled, I enable it
    SET_BIT(sw.spi_sw2pc->CR1, SPI_CR1_SPE);
}

SPI設置為以10 Mbit / s的速度工作。 可能是通訊速度太快了嗎?

以下是IRQ處理程序和回調。

IRQ處理程序

void SPI3_IRQHandler(void)
{
  /* USER CODE BEGIN SPI3_IRQn 0 */
  /* Check RXNE flag value in ISR register */
    if(LL_SPI_IsActiveFlag_RXNE(SPI3))
    {
        /* Call function Slave Reception Callback */
        SW_rx_callback();
    }

  /* USER CODE END SPI3_IRQn 0 */
  /* USER CODE BEGIN SPI3_IRQn 1 */

  /* USER CODE END SPI3_IRQn 1 */
}

打回來

void SW_rx_callback(void)
{
    // RXNE flag is cleared by reading data in DR register

    while(LL_SPI_IsActiveFlag_RXNE(SPI3))
        recv_buffer[recv_buffer_index++] = LL_SPI_ReceiveData8(SPI3);

    if(LL_SPI_GetRxFIFOLevel(SPI3) == LL_SPI_RX_FIFO_EMPTY)
    {
        // If there are no more data
        new_data_arrived = true;
        memset(recv_buffer,'\0',recv_buffer_index);
        recv_buffer_index = 0;
    }

}

預先感謝您的幫助。

10 Mbit的SPI意味着您每秒將有1.25百萬個中斷(在8位傳輸的情況下),這足以處理中斷,尤其是與HAL結合使用時。

STM32L4xx的速度非常快(80MHz),但是在這種情況下,這意味着每個中斷調用都不能超過64個周期。 但是調用中斷需要12個周期,退出中斷需要10個周期(它處於理想狀態,總線上沒有等待狀態),因此,如果您的中斷代碼需要42個或更多個周期,則可以確保丟失某些字節。

這是我的建議:

  • 首先嘗試啟用一些編譯器優化,以加速代碼。
  • 更改中斷例程並從中斷處理程序中刪除所有不必要的內容(使用SW FIFO並在主循環中處理接收到的數據)
  • 但是,根據您的情況,最佳解決方案是使用DMA傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM