使用DMA循环模式写入SPI虚拟字节

使用DMA循环模式写入SPI虚拟字节

问题描述:

我正尝试从使用DMA的SPI从器件读取固定数量的字节(总共27个字节)。我正在运行一个STM32F4芯片。使用DMA循环模式写入SPI虚拟字节

“为了从SPI总线上读取,需要生成一个时钟,所以你需要写入才能读取。”我设置了我的DMA控制器以循环模式写入一个虚拟字节(0xFF)。

uint8_t tx_buffer[] = {0xFF}; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; 
DMA_InitStruct.DMA_BufferSize = 1; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)tx_buffer; 

,并使用双缓冲模式我的Rx DMA流是设置:

uint8_t rx_buffer0[27]; 
uint8_t rx_buffer1[27]; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; 
DMA_InitStruct.DMA_BufferSize = 27; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rx_buffer0; 

DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)rx_buffer1, DMA_Memory_0); 
DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE); 

(我已省略其它无关initialisations)

的27个字节之后接收到传输完成中断触发。

void DMA2_Stream0_IRQHandler(void) 
{ 
    if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0) == SET) 
    { 
     DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); 
     DMA_Cmd(DMA2_Stream1, DISABLE); // disable Tx circular writes 
    } 
} 

问题如下:我在第一个缓冲区中看到正确的数据。但是,当中断触发Tx循环DMA继续时,填充第二个缓冲区的前几个字节,直到它被禁用。

我想避免为虚拟数据保留27个字节,那么有什么办法可以在固定的周期数量后停止循环DMA流吗?

在正常模式下启用DMA并将元素数设置为27

后来,禁用内存和外围设备的内存增加,你的方法将工作。