设置DMA双缓冲模式以仅在STM32上与SPI RX配合使用时出现问题

时间:2019-08-23 18:22:59

标签: c stm32 spi dma

我正在尝试创建一个数据记录器,该数据记录器从具有三种模态的传感器节点获取数据,并使用三种不同的SPI总线将该数据传输到Nucleo-f746zg。然后,我想使用DMA外设到内存模式从每个总线获取传入的数据,并将其放入三个缓冲区之一,这些缓冲区最终将使用FATFS写入USB闪存驱动器。我在双缓冲模式下初始化DMA时遇到问题。当我查看每个寄存器时,似乎配置正确,但是没有中断触发,也不会发生数据传输。

我知道SPI数据即将传入。我最初使用中断来尝试此操作,但是数据速率太快并且丢失了数据,因此我转向了DMA。数据一旦进入寄存器,也将正确写入USB驱动器。我正在为SPI和DMA使用“ LL”驱动程序。

这是我当前的DMA初始化代码:

uint16_t TEST_BUFFER_0[10000];
uint16_t TEST_BUFFER_1[10000];

LL_DMA_SetChannelSelection(DMA1,LL_DMA_STREAM_3, LL_DMA_CHANNEL_0);

LL_DMA_SetDataTransferDirection(DMA1,LL_DMA_STREAM_3, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

LL_DMA_EnableDoubleBufferMode(DMA1,LL_DMA_STREAM_3);

LL_DMA_SetPeriphIncMode(DMA1,LL_DMA_STREAM_3, LL_DMA_PERIPH_NOINCREMENT);

LL_DMA_SetMemoryIncMode(DMA1,LL_DMA_STREAM_3, LL_DMA_MEMORY_INCREMENT);

LL_DMA_SetPeriphSize(DMA1,LL_DMA_STREAM_3, LL_DMA_PDATAALIGN_HALFWORD);

LL_DMA_SetMemorySize(DMA1,LL_DMA_STREAM_3, LL_DMA_MDATAALIGN_HALFWORD);

LL_DMA_DisableFifoMode(DMA1,LL_DMA_STREAM_3);

LL_DMA_SetMemoryAddress(DMA1,LL_DMA_STREAM_3,TEST_BUFFER_1);

LL_DMA_SetMemory1Address(DMA1,LL_DMA_STREAM_3, TEST_BUFFER_0);

LL_DMA_SetDataLength(DMA1,LL_DMA_STREAM_3, 10000);

LL_DMA_SetPeriphAddress(DMA1,LL_DMA_STREAM_3, LL_SPI_DMA_GetRegAddr(SPI2));

LL_DMA_EnableIT_HT(DMA1,LL_DMA_STREAM_3);

LL_DMA_EnableIT_TC(DMA1,LL_DMA_STREAM_3);

LL_DMA_EnableStream(DMA1,LL_DMA_STREAM_3);

LL_SPI_EnableDMAReq_RX(SPI2);

LL_SPI_Enable(SPI2);

我没有看到任何中断触发,也没有看到缓冲区已满。我不确定百分百真正发起DMA传输的是什么,除了暗示数据输入时会自动发生的文档之外。我有点卡在这一点上,我不确定还有什么尝试。

0 个答案:

没有答案