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

时间:2017-08-16 09:22:22

标签: c arm embedded stm32 spi

我试图使用DMA从SPI从设备读取固定数量的字节(总共27个字节)。我正在运行STM32F4芯片。

"为了从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);

(我已经省略了其他不相关的初始化。)

接收到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流?

1 个答案:

答案 0 :(得分:0)

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

稍后,禁用内存和外设的内存增加,您的方法将起作用。