C++ STM32H7 SPI DMA传输,始终处于忙传输状态,HAL\U SPI\U状态\U busy\U TX

C++ STM32H7 SPI DMA传输,始终处于忙传输状态,HAL\U SPI\U状态\U busy\U TX,c++,c,embedded,C++,C,Embedded,我正在尝试使用DMA在SPI中传输数据,其中我的Hal状态为Hal\U SPI\U status\U BUSY\U TX。所需状态为Hal\U SPI\U STATE\U READY。我想通过SPI发送一些大容量数据和命令(单字节)。是否可以分别在DMA和非DMA模式之间切换。如图所示,它在while中循环。 HAL_状态必须为HAL_SPI_状态 我的数据长度加载在NDTR中。 SPI启用后NDTR=0x00 可能导致此问题的一个原因是存储要发送的数据的变量放置在错误的RAM中,请查看映射

我正在尝试使用DMA在SPI中传输数据,其中我的Hal状态为Hal\U SPI\U status\U BUSY\U TX。所需状态为Hal\U SPI\U STATE\U READY。我想通过SPI发送一些大容量数据和命令(单字节)。是否可以分别在DMA和非DMA模式之间切换。如图所示,它在while中循环。

HAL_状态必须为HAL_SPI_状态

我的数据长度加载在NDTR中。

SPI启用后NDTR=0x00


可能导致此问题的一个原因是存储要发送的数据的变量放置在错误的RAM中,请查看映射文件并修改链接器脚本

你可以在这里找到更多

我将TX DMA流从DAM1_流7更改为DMA1_流2,它得到了解决。不知道不在stream7上工作的根本原因

谢谢你,Hossam Alzomor。我已经在>RAM_D2部分配置了dma缓冲区。并将数据对齐。尽管如此,问题仍然是一样的。我用DMA寄存器检查,S7NDTR(数据寄存器)是0x0。我的流位被禁用,因此数据寄存器处于写入模式,即使我的数据未填入寄存器。在参考手册中明确提到,如果数据寄存器为空,则无法进行传输。如果启用,请尝试禁用缓存。我禁用了缓存,并且我的数据缓冲区加载地址也是RAM_D2。我仔细检查了一下。我不知道为什么我的数据寄存器是0x00。我发现我的NDTR寄存器正在加载要传输的数据数,当SPI启用时,NDTR寄存器变成0x00。我的状态是HAL_DMA_STATE_BUSY,并锁定在循环中。
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);