STM32H7 Передача SPI DMA, всегда в состоянии занятости занят, HAL_SPI_STATE_BUSY_TX - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь передать данные в SPI, используя DMA, где мой статус Hal - HAL_SPI_STATUS_BUSY_TX. Требуемый статус - HAL_SPI_STATE_READY. Я хочу отправить некоторые объемные данные и команды (один байт) через SPI. Можно ли переключаться между режимами DMA и не DMA соответственно. Как показано на рисунке, он зацикливается в то время. enter image description here

hdma1_tx.Instance                 = DMA1_Stream7;
hdma1_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
hdma1_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
hdma1_tx.Init.MemBurst            = DMA_MBURST_INC4;
hdma1_tx.Init.PeriphBurst         = DMA_PBURST_INC4;
hdma1_tx.Init.Request             = DMA_REQUEST_SPI1_TX;
hdma1_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
hdma1_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
hdma1_tx.Init.MemInc              = DMA_MINC_ENABLE;
hdma1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma1_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
hdma1_tx.Init.Mode                = DMA_NORMAL;
hdma1_tx.Init.Priority            = DMA_PRIORITY_LOW;

if(HAL_DMA_Init(&hdma1_tx) != HAL_OK)
{
  // Error
}

/* Associate the initialized DMA handle to the the SPI handle */
__HAL_LINKDMA(hspi, hdmatx, hdma1_tx); 

/* Configure the DMA handler for Transmission process */
hdma_rx.Instance                 = DMA1_Stream1;
hdma_rx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
hdma_rx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
hdma_rx.Init.MemBurst            = DMA_MBURST_INC4;
hdma_rx.Init.PeriphBurst         = DMA_PBURST_INC4;
hdma_rx.Init.Request             = DMA_REQUEST_SPI1_RX;
hdma_rx.Init.Direction           = DMA_PERIPH_TO_MEMORY;
hdma_rx.Init.PeriphInc           = DMA_PINC_DISABLE;
hdma_rx.Init.MemInc              = DMA_MINC_ENABLE;
hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_rx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
hdma_rx.Init.Mode                = DMA_NORMAL;
hdma_rx.Init.Priority            = DMA_PRIORITY_HIGH;

HAL_DMA_Init(&hdma_rx);

/* Associate the initialized DMA handle to the the SPI handle */
__HAL_LINKDMA(hspi, hdmarx, hdma_rx);

/*##-4- Configure the NVIC for DMA #########################################*/ 
/* NVIC configuration for DMA transfer complete interrupt (SPI1_TX) */
HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 1, 1);
HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn); 

HAL_NVIC_SetPriority(SPI1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(SPI1_IRQn);

HAL_STATUS должен быть HAL_SPI_STATE_READY.

Длина моих данных загружена в NDTR. enter image description here

После включения SPI NDTR = 0x00

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я изменил поток TX DMA с DAM1_Stream7 на DMA1_Stream2, Это было решено. Не знаю первопричину, почему не работает на stream7.

0 голосов
/ 04 октября 2019

Одной из причин, которая может вызвать такую ​​проблему, является то, что переменная, в которой хранятся данные для отправки, помещена в неправильный регистр ОЗУ, просмотрите файл карты и измените скрипт компоновщика

. Вы можете найти больше здесь https://community.st.com/s/article/FAQ-DMA-is-not-working-on-STM32H7-devices

...