环境:
将SPI3配置成从模式,并且使用DMA来传输数据,在初始化完SPI3后,就立即配置DMA,将待传输的数据准备好。
主机还未读取时,就重新更新数据,更新数据的方法为直接调用Spi3TxDmaStart
static void Spi3TxDmaStart(void * buf,unsigned int len,int enableInterrupt){
DMA2_Channel2->CCR &= 0xFFFFFFFE; // disable DMA first
DMA2_Channel2->CMAR = (unsigned int)buf;
DMA2_Channel2->CNDTR = len & 0xFFFF;
DMA2_Channel2->CCR |= 1; // start
DMA2->IFCR |= 0xF0;
if (enableInterrupt) {
NVIC_EnableIRQ(DMA2_Channel2_IRQn);
}else{
NVIC_DisableIRQ(DMA2_Channel2_IRQn);
}
}
问题现象:
主机读取从机数据时,发现从机的数据从第四个字节开始。
原因:
SPI3的Tx和Rx带有一个FIFO,当使能Tx的DMA时,DMA就会把数据填到Tx的FIFO中
可以发现使能DMA后就会传输3个字节的数据到FIFO中,此时主机还未读取数据。当想要更新数据时,由于TxFIFO中的数据并未清除,所以会导致数据读取时偏移三个字节
解决方法:
清除FIFO,STM32L4xx芯片没有直接清除FIFO的寄存器,只能通过以下步骤清除:
1. 关闭DMA,如果没有关闭DMA,会导致清除FIFO后里面又有数据填充到FIFO中。
2. 置位RCC中的RSTR寄存器
RCC->APB1RSTR1 |= RCC_APB1RSTR1_SPI3RST;
RCC->APB1RSTR1 &= ~(RCC_APB1RSTR1_SPI3RST);
3.重新配置SPI3
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』