embedded
runtime_error
ai_generated
true
SPI: DMA FIFO overrun, data lost on channel 2
ID: embedded/spi-dma-fifo-overrun
78%Fix Rate
85%Confidence
1Evidence
2024-03-15First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| STM32Cube_FW_H7_V1.11.0 | active | — | — | — |
| FreeRTOSv202212.01 | active | — | — | — |
| ARM GCC 12.2.1 | active | — | — | — |
Root Cause
SPI DMA transfer rate exceeds FIFO drain speed, causing data loss in the RX FIFO.
generic中文
SPI DMA传输速率超过FIFO排空速度,导致接收FIFO中数据丢失。
Official Documentation
https://www.st.com/resource/en/application_note/dm00204416-spi-dma-communication-on-stm32-microcontrollers-stmicroelectronics.pdfWorkarounds
-
85% success Reduce SPI baud rate prescaler (e.g., from 2 to 4) in MX_SPI1_Init(): hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; then regenerate code.
Reduce SPI baud rate prescaler (e.g., from 2 to 4) in MX_SPI1_Init(): hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; then regenerate code.
-
90% success Enable SPI RX FIFO threshold interrupt and use DMA with circular mode: set hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; and configure DMA in circular mode.
Enable SPI RX FIFO threshold interrupt and use DMA with circular mode: set hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; and configure DMA in circular mode.
-
75% success Use DMA flow controller with burst transfers: configure DMA2_Stream0 with DMA_SxCR_PBURST and DMA_SxCR_MBURST enabled.
Use DMA flow controller with burst transfers: configure DMA2_Stream0 with DMA_SxCR_PBURST and DMA_SxCR_MBURST enabled.
中文步骤
Reduce SPI baud rate prescaler (e.g., from 2 to 4) in MX_SPI1_Init(): hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; then regenerate code.
Enable SPI RX FIFO threshold interrupt and use DMA with circular mode: set hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; and configure DMA in circular mode.
Use DMA flow controller with burst transfers: configure DMA2_Stream0 with DMA_SxCR_PBURST and DMA_SxCR_MBURST enabled.
Dead Ends
Common approaches that don't work:
-
Increasing SPI clock speed to match DMA rate
90% fail
Higher clock speed worsens the FIFO overflow issue as data arrives faster.
-
Disabling DMA and using polling mode
70% fail
Polling mode reduces throughput and may cause CPU starvation in real-time systems.
-
Adding software delay loops in the DMA ISR
80% fail
Delays in ISR increase latency and can cause other interrupts to be missed.