STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】

1:平台 STM32F413 + GD5F4(spi nand flash)(没开启DMA中断,读写操作NAND 都是单片机发起,所以知道什么时候读,什么时候写)

2: 问题(STM32 SPI+DMA机制发送,接收理解不到位)
能狗发送数据,但是接收数据不对且接收后,SCK时钟一直存在

在不使用DMA情况下,正常读写


使用DMA后,DMA接收数据后一直有时钟存在

当时思想是单写和单读数据;

Direction_CfgSpiHard(SPI_Direction_1Line_Tx); //设置SPI工作模式及方向
NAND0_CS_0();

// bsp_spiWrite1(PROGRAM_LOAD);
// bsp_spiWrite1( 0x0f & ((0&0xff00)>>8)); //读内存块+地址
// bsp_spiWrite1(0&0xff);
SPI_DMACmd(SPI2,SPI_DMAReq_Tx,ENABLE); //使能串口1的DMA发送
MYDMA_Enable(SPI2_TX_DMA_STREAM,20); //开始一次DMA传输!
while(DMA_GetFlagStatus(SPI2_TX_DMA_STREAM,DMA_FLAG_TCIF4)==RESET)
{

	printf("\r\n write err! %d",DMA_GetCurrDataCounter(SPI2_TX_DMA_STREAM));  //得到当前还剩余多少个数据
};

//等待 DMA1_Steam4 传输完成

NAND0_CS_1();

单独写

void read_test(void)
{

  NAND0_CS_0();	
	Direction_CfgSpiHard(SPI_Direction_2Lines_FullDuplex);   //设置SPI工作模式及方向

	bsp_spiWrite1(READ_FROM_CACHE); //写入读命令
	bsp_spiWrite1(Byte_16 | ((0&0xff00)>>8)); //读内存块+地址			
	bsp_spiWrite1(0&0xff);
	bsp_spiWrite1(0x00);  //虚拟字节

//等待 DMA1_Steam4 传输完成

  Direction_CfgSpiHard(SPI_Direction_2Lines_RxOnly);   //设置SPI工作模式及方向  

 	SPI_DMACmd(SPI2,SPI_DMAReq_Rx,ENABLE);  //使能串口1的DMA发送     
	MYDMA_Enable(SPI2_RX_DMA_STREAM,20);     //开始一次DMA传输!
	while(DMA_GetFlagStatus(SPI2_RX_DMA_STREAM,DMA_FLAG_TCIF3)==RESET)
	{
		
		printf("\r\n read err! %d",DMA_GetCurrDataCounter(SPI2_RX_DMA_STREAM));  //得到当前还剩余多少个数据
		
	};
	DMA_ClearFlag(SPI2_RX_DMA_STREAM,DMA_FLAG_TCIF3);//清除DMA1_Steam3传输完成标志	
	DMA_Cmd(SPI2_RX_DMA_CHANNEL,DISABLE);
	SPI_DMACmd(SPI2,SPI_DMAReq_Rx,DISABLE);  //使能串口1的DMA发送     
	
NAND0_CS_1();

}
单独读;数据不对,后用SPI读设备ID,发现ID号滞后一个字节(估计是DMA接收后,读ID时没有清除标准位的原因);

后在网上查找说DMA操作SPI时读写同时进行的

STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】_第1张图片
参考这位博主的这段话 及 参考了官方的例程
STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】_第2张图片
现在收发同时进行
数据OK,波形正常

思考:DMA为什么不能通过SPI的单线收发工作模式,来接收收数据(难道是发送时需要清楚接收标准,接收时需要清楚发送标准?)

你可能感兴趣的:(STM32F4)