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

[复制链接]
baicai 发表于 2018-8-14 10:00:05 | 显示全部楼层 |阅读模式
本帖最后由 baicai 于 2018-8-18 10:02 编辑

环境:
  • 将SPI3配置成从模式,并且使用DMA来传输数据,在初始化完SPI3后,就立即配置DMA,将待传输的数据准备好。
  • 主机还未读取时,就重新更新数据,更新数据的方法为直接调用Spi3TxDmaStart


[C] 纯文本查看 复制代码
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







上一篇:ARM的对齐规则
下一篇:STM32L431之SPI时钟过高导致无法通信
jason_t 发表于 2018-8-14 17:37:52 | 显示全部楼层
不错,支持!!
回复

使用道具 举报

本版积分规则

QQ|Archiver|手机版|小黑屋|RD之家 - 研发工程师的伊甸园 ( 京ICP备18037383号 )
360导航 360安全浏览器 蚂蚁搜索 速搜全球 酷帝网站目录 搜狗导航 114啦网址导航

GMT+8, 2018-9-23 10:21

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表