你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f4 DMA配置问题

[复制链接]
白马非马-403930 提问时间:2016-3-29 18:22 /
使用了两个DMA实现I2S接收24位音频数据、通过串口发送该数据
但是接收和发送的数据都有问题,DMA配置代码如下:
/*定义中断和DMA配置变量*/
  NVIC_InitTypeDef NVIC_InitStructure;
  DMA_InitTypeDef  DMA_InitStructure;  
  /* Enable DMA clock */
  RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE);  
  /* Reset DMA Stream registers (for debug purpose) */
  DMA_DeInit(DMA_STREAM);
  /* Check if the DMA Stream is disabled before enabling it.*/
  while (DMA_GetCmdStatus(DMA_STREAM) != DISABLE)
  {
  }
  /*清空STREAM上所有中断标志,(见main.h,DMA_STREAM==DMA1_Stream2)*/
  DMA_ClearITPendingBit(DMA_STREAM,DMA_IT_FEIF2|DMA_IT_DMEIF2|DMA_IT_TEIF2|DMA_IT_HTIF2|DMA_IT_TCIF2);
  /* Configure DMA Stream */
  DMA_InitStructure.DMA_Channel = DMA_CHANNEL;                             /*DMA1 数据流2 通道0 SPI3RX*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2Sx->DR;          /*外设地址是I2S3的数据寄存器*/
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&buf0;               /*存放DMA数据的内存地址*/
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                  /*传输方向外设到存储器*/
  DMA_InitStructure.DMA_BufferSize = (uint32_t)BUFFER_SIZE;                /*数据传输量*/
  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_Circular;                          /*循环模式*/
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                      /*优先级设为高*/
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                   /*不使用FIFO模式*/        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;            /*设置FIFO阈值,未开启,这里随便设无所谓*/
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;              /*储存器突发传输配置*/
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;      /*外设突发传输配置*/
  DMA_Init(DMA_STREAM, &DMA_InitStructure);                                /*初始化DMA数据流*/

  DMA_DoubleBufferModeConfig(DMA_STREAM,(uint32_t)&buf1,DMA_Memory_0);/*双缓冲模式配置*/
  DMA_DoubleBufferModeCmd(DMA_STREAM,ENABLE);                                 /*双缓冲模式开启*/

  //串口DMA配置
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;                             /*DMA1 数据流6 通道4 USART2TX*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR;          /*外设地址是I2S3的数据寄存器*/
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&buf0;               /*存放DMA数据的内存地址*/
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;                  /*传输方向存储器到外设*/
  DMA_InitStructure.DMA_BufferSize = (uint32_t)BUFFER_SIZE;                /*数据传输量*/
  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_Circular;                          /*循环模式*/
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                      /*优先级设为高*/
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                   /*不使用FIFO模式*/        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;            /*设置FIFO阈值,未开启,这里随便设无所谓*/
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;              /*储存器突发传输配置*/
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;      /*外设突发传输配置*/
  DMA_Init(DMA1_Stream6, &DMA_InitStructure);                                /*初始化DMA数据流*/

  DMA_DoubleBufferModeConfig(DMA1_Stream6,(uint32_t)&buf1,DMA_Memory_0);/*双缓冲模式配置*/
  DMA_DoubleBufferModeCmd(DMA1_Stream6,ENABLE);                                 /*双缓冲模式开启*/


参考手册上关于接收24位I2S数据的说明:
无标题.png
我理解的是I2S数据寄存器只有16位,需要读两次,那在配置DMA的时候外设数据长度PeripheralDataSize和存储器数据长度MemoryDataSize该怎么配置?还有单次传输和突发传输要怎么设置?

我应该怎么检测数据的完整性?原本想在串口DMA发送完成中断的时候通过串口发送数据包的编号,但是好像会产生冲突,数据都发不完。

收藏 评论1 发布时间:2016-3-29 18:22

举报

1个回答
adlu 回答时间:2016-4-5 10:00:58
串口的速率和I2S的速率差一两个量级,串口115200bps只相当于10kbyte/s,而如果I2S采样率是44.1k,宽度是24bit,立体声,则数据速率就是44.1k*24/8*2=264.6kbyte/s。你要用串口来发送I2S接收到的数据是不可能的。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版