void Dma_SPI0_Transmit(u16 *pdata,u16 size)
{
dma_parameter_struct dma_init_struct;
dma_deinit(DMA0, DMA_CH2);
dma_init_struct.periph_addr = (uint32_t)(&SPI_DATA(SPI0));
dma_init_struct.memory_addr = (uint32_t)pdata;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init_struct.number = size;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init(DMA0, DMA_CH2, &dma_init_struct);
dma_circulation_disable(DMA0, DMA_CH2);
dma_memory_to_memory_disable(DMA0, DMA_CH2);
BL_CS0_OFF;
dma_channel_enable(DMA0, DMA_CH2);
spi_dma_enable(SPI0, SPI_DMA_TRANSMIT);
while(!dma_flag_get(DMA0,DMA_CH2, DMA_FLAG_FTF)){};
BL_CS0_ON;
}
项目使用GD32F303RCT6的SPI使用DMA发送数据,发送数据函数如代码,在打开通道之前CS脚手动拉低,等到检测发送完成标记之后CS脚手动拉高。实际测的波形是在数据没有发送完就检测到完成标记,CS就拉高了。最终导致从机接触不到完整数据。请问各位大神有碰到这种情况吗?试了先清楚标记的方法也不行,不知道为啥数据没有发送完,可是完成标记提前置1了。 |