当前位置:   article > 正文

STM32F103 SPI DMA接收异常处理机制_stm32f103的hal库的spi使用dma

stm32f103的hal库的spi使用dma

STM32F103 SPI DMA接收异常处理机制

背景:使用SPI从机接收数据,当SCK管脚异常悬浮的时候,SPI接收的数据总是Tx比Rx滞留1Byte.

当出现上述问题的时候,无论是重新开SPI,还是重新开DMA,总是不能恢复正常,只有重启单片机才能回复正常。但是在方案设计中又不允许芯片重启。直到用keil调试的时候把DMA相关的寄存器打印出来才发现,有个寄存器异常了。
下面先上两个寄存器的截图
DMA_CCR在这里插入图片描述在这里插入图片描述
—正常的时候—
在这里插入图片描述
在这里插入图片描述

—出问题的时候—

在这里插入图片描述
在这里插入图片描述
可以明显看到 Tx的CNDTR多了一个字节,导致数据延后了。所以处理的方法在调用HAL_SPI_TransmitReceive_DMA之后再回读CNDTR寄存器,如果数据不对就重新更新。

void CheckDma()
{
	if( ( hdma_spi1_rx.Instance->CCR != 0x8F ) || ( hdma_spi1_rx.Instance->CNDTR != SPI_USER_DATA_LEN ) )
	{
		hdma_spi1_rx.Instance->CCR = 0x8E;
		hdma_spi1_rx.Instance->CNDTR = 0x14;
		hdma_spi1_rx.Instance->CCR = 0x8F;
	}
	
	if( ( hdma_spi1_tx.Instance->CCR != 0x9B ) || ( hdma_spi1_tx.Instance->CNDTR != SPI_USER_DATA_LEN - 1 ) )
	{
		hdma_spi1_tx.Instance->CCR = 0x9A;
		hdma_spi1_tx.Instance->CNDTR = 0x13;
		hdma_spi1_tx.Instance->CCR = 0x9B;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
				HAL_SPI_TransmitReceive_DMA(&hspi1, s_pTxData, s_pRxData, SPI_USER_DATA_LEN);
				CheckDma();
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/801118
推荐阅读
相关标签
  

闽ICP备14008679号