我正在尝试创建一个数据记录器,该数据记录器从具有三种模态的传感器节点获取数据,并使用三种不同的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传输的是什么,除了暗示数据输入时会自动发生的文档之外。我有点卡在这一点上,我不确定还有什么尝试。>