×
单片机 > 单片机程序设计 > 详情

STM32L431之SPI从模式使用DMA时数据偏移3个字节

发布时间:2021-07-22 发布时间:
|

环境:

将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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
可升级和可配置的PSoC62系列MCU平台架构