OpenEdv-开源电子网

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

stm32f4 通过DMA接收24位I2S数据 如何配置

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-29
在线时间
12 小时
发表于 2016-3-29 11:11:22 | 显示全部楼层 |阅读模式
3金钱
打算通过DMA接收24位I2S数据,stm32参考手册(中文版)p748,描述如下:

I2S接收24位数据

I2S接收24位数据


也就是通过两次读操作来接收数据,I2S数据缓存是16位的。

在配置DMA时,如果将外设(I2S数据存储器)数据长度设为Word,存储器设成Word,程序如下:

/*定义中断和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_Word;  /*外设数据长度*/
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;          /*存储器数据长度*/
  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_Single;      /*外设突发传输配置*/
  DMA_Init(DMA_STREAM, &DMA_InitStructure);                                /*初始化DMA数据流*/

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



运行后缓存里的内容:
无标题.png

DMA只读取了一次,只有16位的数据;
如果将如果将外设(I2S数据存储器)数据长度设为HalfWord,存储器设成Word,结果就是缓存里只装了一半的数据,如下图:

缓存2

缓存2


无论怎么设置,似乎DMA只读取了一次,只传输16位的数据。如果要像参考手册上写的那样读两次I2S数据存储器,该如何配置DMA?



无标题.png

最佳答案

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

以16位读取,读2次,然后软件上做处理,将2个16位合并为一个24位.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-3-29 11:11:23 | 显示全部楼层
以16位读取,读2次,然后软件上做处理,将2个16位合并为一个24位.
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-29
在线时间
12 小时
 楼主| 发表于 2016-3-29 14:30:01 | 显示全部楼层
人工置顶 求解答~~~~
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-29
在线时间
12 小时
 楼主| 发表于 2016-3-30 11:17:02 | 显示全部楼层
正点原子 发表于 2016-3-29 11:11
以16位读取,读2次,然后软件上做处理,将2个16位合并为一个24位.

那DMA应该全设置成HalfWord?
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-8-23
在线时间
34 小时
发表于 2017-9-1 15:03:50 | 显示全部楼层
楼主,我暂时没用DMA来接收数据,直接定义一个数组收,我也是24位的,连着收两次的话,中间要不要加判断,如果不加判断,我怎么知道低16位已经更新完成
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
发表于 2019-1-14 14:50:08 | 显示全部楼层
依宝 发表于 2017-9-1 15:03
楼主,我暂时没用DMA来接收数据,直接定义一个数组收,我也是24位的,连着收两次的话,中间要不要加判断, ...

你好,请问你的接收24位数据搞定了吗?我现在也要接收24位数据,不知道如何实现?
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2012-10-16
在线时间
9 小时
发表于 2019-2-28 15:40:41 | 显示全部楼层
搞定了吗,我想用I2S取数字麦克风INMP441的数据
我要赚钱
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-5-15
在线时间
7 小时
发表于 2019-5-15 08:59:39 来自手机 | 显示全部楼层
sbitxihc0616 发表于 2019-2-28 15:40
搞定了吗,我想用I2S取数字麦克风INMP441的数据

老哥  做出来了吗 inmp441的  
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-10-31
在线时间
2 小时
发表于 2019-11-12 16:45:22 | 显示全部楼层
同问,手册上写读两次,那么这两次读中间没有其他操作吗?怎么判断第一次读取后数据寄存器更新完了?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-11-7
在线时间
2 小时
发表于 2019-11-18 17:13:53 | 显示全部楼层
NIEHUGH 发表于 2019-5-15 08:59
老哥  做出来了吗 inmp441的

老哥  您做出来了吗,小弟现在也需要做这个
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-10-15
在线时间
17 小时
发表于 2019-11-22 21:14:18 | 显示全部楼层
DSDSHS 发表于 2019-11-18 17:13
老哥  您做出来了吗,小弟现在也需要做这个

您好,我现在也需要做这个,能交流一下吗?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-10-15
在线时间
17 小时
发表于 2019-12-12 18:21:51 | 显示全部楼层
z36308662 发表于 2019-11-22 21:14
您好,我现在也需要做这个,能交流一下吗?

您好,我也需要做这个能加Q交流一下码?36308662
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2022-3-24
在线时间
12 小时
发表于 2024-4-27 15:25:05 | 显示全部楼层
要设置成HalfWord吧?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 15:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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