OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2740|回复: 2

SPI主机DMA接收数据出错是什么原因

[复制链接]

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-8-1
在线时间
12 小时
发表于 2017-8-10 13:40:41 | 显示全部楼层 |阅读模式
10金钱
我用的是STM32F103C8T6,设置SPI为主机,DMA接收方式,左图是轮询读到正确的数据,右图是DMA接收错误的数据
SPI.png DMA.png

初始化代码:
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                //8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;                                //4.5MHZ
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStructure);
        SPI_NSSInternalSoftwareConfig(SPI1,  SPI_NSSInternalSoft_Set);

        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);


        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)EcgBuff;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 0;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);

        DMA_Cmd(DMA1_Channel2, DISABLE);

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DummyClock;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel3, DISABLE);

        DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
        DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);


DMA读取len字节
void  SPIReadBuf(uint8_t *buf, uint16_t len)
{
        DMA_Cmd(DMA1_Channel2, DISABLE);
        DMA_Cmd(DMA1_Channel3, DISABLE);
        DMA1_Channel2->CNDTR = len;
        DMA1_Channel3->CNDTR = len;
        SPI1->DR;
        DMA_Cmd(DMA1_Channel2, ENABLE);       
        DMA_Cmd(DMA1_Channel3, ENABLE);

}

最佳答案

查看完整内容[请看2#楼]

开DMA接收中断,及时处理数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-8-10 13:40:42 | 显示全部楼层
阿成HAC 发表于 2017-8-10 13:57
现在发现是接收溢出错误的原因,但是为什么DMA接收会溢出?

开DMA接收中断,及时处理数据

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-8-1
在线时间
12 小时
 楼主| 发表于 2017-8-10 13:57:20 | 显示全部楼层
现在发现是接收溢出错误的原因,但是为什么DMA接收会溢出?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 15:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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