硬汉嵌入式论坛

 找回密码
 立即注册
查看: 15008|回复: 7
收起左侧

[有问必答] STM32F407 I2S+DMA

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2014-11-23 00:10:29 | 显示全部楼层 |阅读模式
各位大神好
      我用STM32F407的I2S+DMA采集正弦波信号,采用三种方式,第一种是I2S中断获取数据,第二种是I2S+DMA,在DMA采用人工切换的方式变化缓冲地址来获取数据,第三种是采用stm32F407 I2S+DMA自带的双缓冲获取数据,获取的数据如下:
interrupt.jpg autoDMA.jpg mannual.jpg

其中第一幅度为中断获取的数据,第二幅图为双缓冲获取的数据,第三幅度为手工切换缓冲区模拟双缓冲获取的数据。从图中可以看出,中断方式获取的数据是没有问题的,而通过DMA方式获取的数据就会出现相位的变化。这种相位的变化是没有规律的,只是偶尔出现一次(图中是截取其中的一个相位变化)。
请问一下各位大神,出现这个现象的问题在哪里,怎么去解决。先跪谢了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2014-11-23 10:57:28 | 显示全部楼层
我觉得是DMA切换的过程中数据丢失了。把I2S的采样率设置低一些,比如8K, 数据之间有125us的处理时间,这个应该够了。先确定是不是这个问题造成。然后再确定是不是由于配置上的问题。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2014-11-23 16:35:53 | 显示全部楼层
我确定过了,不是切换的原因。假设如果是切换的原因,应该每次切换都会出现,而我采集到的信号偶尔才会出现这个问题。DMA的配置上我个人觉得没有问题。
uint32_t add=0;
#define MYSTREAM DMA1_Stream3
#define MYIRQ    DMA1_Stream3_IRQn
#define MYCH     DMA_Channel_0
#define BUFF_SZ  10000
void DMA_I2S_RX_Configuration(void)
{

DMA_InitTypeDef DMA_InitStructure;
add=(uint32_t)(&(SPI2->DR));
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

DMA_Cmd(MYSTREAM,DISABLE);
DMA_DeInit(MYSTREAM);   
//DMA_StructInit( &DMA_InitStructure);                                 
DMA_InitStructure.DMA_Channel =MYCH;                              
DMA_InitStructure.DMA_PeripheralBaseAddr =add;                           
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)data_buff1;                  
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;                  
DMA_InitStructure.DMA_BufferSize = BUFF_SZ;                                 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                  
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   
DMA_InitStructure.DMA_Mode =DMA_Mode_Circular;                           
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                        
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable ;                  
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;        
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;            
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;         

DMA_DoubleBufferModeConfig(DMA1_Stream3,(uint32_t)data_buff2, DMA_Memory_1);
DMA_DoubleBufferModeCmd(DMA1_Stream3, ENABLE);                              //

//DMA_SetCurrDataCounter(DMA1_Stream3,BUFF_SZ);
DMA_Init(MYSTREAM, &DMA_InitStructure);                                 //
                                                     


}
void NVIC_I2SRX_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = MYIRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(MYSTREAM, DMA_IT_TC, ENABLE);                              
DMA_Cmd(MYSTREAM,ENABLE);                                             
}
以上是我的DMA配置。我个人觉得没有问题的。我猜想是不是在传输的过程中,总线的数据有变化导致外设到内存通过DMA的数据变化?
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2014-11-23 17:55:42 | 显示全部楼层
QQ截图20141123164104.jpg 图中两个比较大的脉冲是buffer切换的地方,可以看出,切换过程中数据是没有丢失的。框出来的地方是一个buffer里面的数据,从中可以判断,数据发生错误的时候不是在buffer切换的地方,而是在DMA传输的过程中产生的。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2014-11-23 17:56:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:我觉得是DMA切换的过程中数据丢失了。把I2S的采样率设置低一些,比如8K, 数据之间有125us的处理时间,这个应该够了。先确定是不是这个问题造成。然后再确定是不是由于配置上的问题。 (2014-11-23 10:57) 
您再帮我看看,我再帖子下又贴了图和代码,谢谢~
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2014-11-25 11:02:25 | 显示全部楼层
求帮助呀,求帮助
回复

使用道具 举报

3

主题

60

回帖

69

积分

初级会员

积分
69
发表于 2014-12-16 11:11:50 | 显示全部楼层
是不是其他中断引起~~的?
回复

使用道具 举报

6

主题

33

回帖

51

积分

初级会员

积分
51
发表于 2019-5-20 20:40:08 | 显示全部楼层
楼主你的问题解决了吗?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 12:45 , Processed in 0.045610 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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