Nucleo-F413ZH 工程版测评(下): DFSDM, SAI

在前面的若干测试(Nucleo-F413ZH 工程版测评(上): 外观,总线性能,功耗, Nucleo-F413ZH 工程版测评(中): 浮点计算, 频率计)之后,我来试用下STM32F413上面两个比较新的设备:DFSDM 和 SAI.

DFSDM是为Sigma-Delta解调准备的数字滤波器模块,内部结构做得也挺复杂的,在这里我能想到的唯一应用就是数字麦克风了。数字麦克风也许大家不熟悉,其实它就在身边:手机里面、笔记本电脑里面、平板电脑里面用的麦克风很可能就是它。在STM32F7-disco开发板上面就配备了数字麦克风,细心一点就不难观察到。

上面照片中的这颗数字麦克风是联想笔记本电脑里面的,在一块麦克风和指示灯组件小板上。单买这种麦克风不好买,但taobao买各种排线模组配件啥的就有了,玩玩也不贵,或者拆淘汰的电子设备上的。数字麦克风是1-bit编码输出,实际上就是Sigma-Delta调制过的音频信号。除了电源、地之外,主要就是Clock和Data两个信号了,Clock是控制器给麦克风的,一般按64倍的采样频率。还有一个特别点是数字麦克风可以两只共用一条Data线,分别把数据在Clock的上升沿和下降沿锁存,所以麦克风还有一个引脚用来配置是用哪个沿发送数据。

  如STM32F413手册上的麦克风连接例子图示

STM32F413ZH上有两个DFSDM部件,分别有2个和4个数字滤波器,所以最多可以处理6路麦克风信号,还带有延迟补偿,可以实现麦克风阵列,蛮强大的。不过我这个小板子上就两只麦克风,暂时就用一只接收音频看看吧。

DFSDM主要的部分是两个:串行接收模块(Channel),数字滤波器模块(Filter)。还有其它功能比如watchdog, 各种比较器, 还可以从APB上读数据作为滤波器输入,等等。我为了实验数字麦克风,就不必要的不管了。整到最后,发现要采集数字麦克风音频其实配置少量寄存器就是了:
  (1) APB使能DFSDM1硬件,GPIO把 DFSDM1_CKOUT (我用PC2),DFSDM1_DATIN0 (我用PB1)引脚设好
  (2) 把DFSDM1用的clock选好,这个clock不是APB接口的时钟
  (3) 配置 CH0CFGR1 寄存器,开启Channel0功能,设定输入模式,以及输出时钟分频:
DFSDM1_Channel0->CHCFGR1 = DFSDM_CHCFGR1_DFSDMEN|DFSDM_CHCFGR1_CHEN|15<<16|DFSDM_CHCFGR1_CKOUTSRC|DFSDM_CHCFGR1_SPICKSEL_0; 
  (4) 配置 FLT0FCR,设置sinc滤波器阶数,降采样率:我用5阶滤波器, 64倍降采样
DFSDM1_Filter0->FLTFCR = 5<<29|63<<16;
  (5) 配置 FLT0CR1,设置工作模式,数据来源,开启并启动转换:
DFSDM1_Filter0->FLTCR1 = DFSDM_FLTCR1_FAST|DFSDM_FLTCR1_RCONT|DFSDM_FLTCR1_DFEN;
DFSDM1_Filter0->FLTCR1 |= DFSDM_FLTCR1_RSWSTART;

  实验现场:从小板上的Testpad飞线出来,接插针,连到Nucleo

  示波器采到的数字麦克风Clock和Data波形:

用示波器很容易确认麦克风在工作,但还要在 FLT0ISR 寄存器中确认 REOCF 位变为1,才有转换后的数据可读。24-bit的转换值在 FLT0RDATAR 寄存器的高24位。我的时钟设定结果大约是 44100 的音频采样率,麦克风的时钟是这个的64倍。因为这里只是确认能读到数据,并没有任何数据处理比如声音检测算法啊,也暂时没做啥实际用途

依靠STM32F4的强大计算能力,只要不是依靠大量数据样本的简单的音频应用还是可能的。

数字麦克风接收的音频到底对不对,还得有办法检查一下。从STM32F413的12-bit DAC输出是一个办法,但对音频来说这个精度不够。用专用的数字音频接口吧:I2S或者SAI都可以胜任。

在STM32系列里面,I2S功能通常是和SPI复用的:大多数的SPI硬件都有I2S模式。但是这个硬件I2S不是很好用,特别是Slave模式有bug。ST在新一代的MCU里面加入了SAI——串行音频接口,就强多了。一个SAI有两个串行收发部分,可以同步也可以独立工作。

  现在我必须要开始吐槽一下STM32F413的手册了,上面这段是从Datasheet里面截图出来的,请注意,支持 SPDIF 输出哦。然后,看Reference manual的SAI部分

  竟然这里就没提 SPDIF ! 我搜遍整个Reference manual, 只字未提 SPDIF

ST啊,Nucleo你出一个ES工程版的也就罢了,手册也要来ES版吗?

  下面是RCC章节部分Clock tree的图

  PLL1的输出这里是连错了,R输出废弃么?

  ck_plli2s_ext 这是引脚么?还是什么信号?通篇都找不到。I2S_CKIN这是要标给什么呢?

  PLLDIVR,这里说的是 div 1 到 32,看好了

  但是后面描述的时候是这么说的

  对,说的是 div只能从1~31。还有,请注意 PLLDIVR 在寄存器中是 12:8 位,但是前面的表里面是这样的

  表格里面是 bit13 到 bit9,前后不符!我在这里就遇到了错误,怎么设都是蹊跷。后来才发现是手册上面自相矛盾。

  还有这样的错,一眼就能看出来。拜托,发布手册不要这么着急好么?

排除了手册的bug,我终于把SAI的I2S master模式调通了。按44100采样频率的设计,从PLL需要产生271MHz的时钟,除以6以后得到45.1667MHz, 再除以1024得到44.1081kHz,是很接近组合。因为PLL R输出最多只能除以7,所以后面分频是用PLLDIVR来除以4, 得到11.2917MHz 作为SAI部分的时钟。同时,PLL R时钟也给DFSDM1, 因为它内部有最大256的分频系数,用在麦克风没有问题,除以16是麦克风的Clock.

  在SAI A block中,11.2917MHz 除以4是SCK_A的频率,再除以64就是FS_A的频率。协议及数据格式设置如下:
        SAI1_Block_A->CR1 = SAI_xCR1_DS_2|SAI_xCR1_DS_1;
                                // 24-bit, master out, sync mode, free protocol
        SAI1_Block_A->FRCR = SAI_xFRCR_FSOFF|SAI_xFRCR_FSDEF|(31<<8)|63;
      SAI1_Block_A->SLOTR = (3<<16)|(1<<8)|SAI_xSLOTR_SLOTSZ_1; // slot 0 & 1, 32-bit

因为DFSDM1和SAI1用同一个时钟,数据速率也相同,因此传输是同步的。可以用两个DMA通道来实现自动传输,CPU完全闲出来处理其它事情。这样,数字麦克风的1-bit 64倍超采样信号经DFSDM降采样处理后,得到44100采样频率的PCM数据流,再送给SAI,以I2S数据格式输出。我用自己手头别的硬件工具可以采集I2S数据传入电脑了。

用Cooledit一分析,声音是采到了,回放听起来正常,但增益实在太高了,容易截顶失真。需要增加设置 DFSDM1 中积分器之后数据右移,偏移量也需要再修正一下。

总结:STM32F413 有丰富的硬件资源给音频相关应用提供便利。再结合100MHz处理速度和320kB片上SRAM、FPU,在音频领域发挥一下创意还是很有前途的。

(0)

相关推荐

  • 【精品博文】STM32F7开箱初体验

    赢一个双肩背包 有多难? 戳一下试试看! →_→ 长摁识别 STM32最强F7探索大冒险活动已经评选出15名获得开发板的网友,并已经顺利寄出.现在已经进入到了网友分享阶段.昨天刚刚拿到开发板的网友已经 ...

  • 【精品博文】STM32F767 Nucleo-USART移花接木OK

    赢一个双肩背包有多难?戳一下试试看!→_→长摁识别今天继续查找问题原因,使用十六进制查看串口收到的数据,根本不是ASCII码,根据之前的思路,开始查找时钟配置:首先发现一个以前没有注意的问题,Nucl ...

  • Nucleo-F413ZH 工程版测评(中): 浮点计算, 频率计

    浮点计算单元(FPU)的测试.先还是用前面那个程序,修改了一下,避免了中间的double/single类型转换:uint32_t test(int32_t *data, uint32_t size){ ...

  • Nucleo-F413ZH 工程版测评(上)

    ST的STM32产品线更新很快,旧的还没玩热,新的就出来了.得益于STM32系列封装的引脚兼容性,Nucleo系列的板子不用大改,就可以搭配新产品发布.F413作为目前F4系列当中片上SRAM容量最高 ...

  • 【课文 单词mp3】外研版九下Module 1

    对话音频: [对话翻译] 玲玲:欢迎归来,各位! 贝蒂:你好,玲玲!你的假期怎么样? 玲玲:还不错!我去看望了在河南省的祖父母.火车里挤满了人,我不得不站了3个多小时! 贝蒂:真倒霉.为什么在冬天旅行 ...

  • 【课文 单词mp3】外研版八下Module 10

    对话音频: [对话翻译] 陈欢:嗨,大家好.我是北京广播电台新闻部的主任. 玲玲:感谢您带我们参观 陈欢:不客气!现在,这边请.看那个红灯.当它亮时,表示我们 正在广播.在背景中我们应该避免制造任何噪 ...

  • 【课文 单词mp3】外研版八下Module 9

    对话音频: [对话翻译] 服务热线:你好,友谊服务热线.请问您是哪位? 玲玲:你好,我是玲玲. 服务热线:你好,玲玲!我可以为你做些什么? 玲玲:我和我最好的朋友之间有点问题.她叫-- 服务热线:不, ...

  • 【课文 单词mp3】外研版八下Module 8

    对话音频: [对话翻译] 玲玲:我们到了.欢迎来到北海公园. 托尼:哇!这里如此安静以至于我甚至能听见鸟儿在歌唱!我几乎不能相信我们在市中心. 玲玲:这个公园因为它的湖.桥和山上的古建筑而闻名.湖占据 ...

  • 【课文 单词mp3】外研版八下Module 7

    对话音频: [对话翻译] (玲玲正在为她的洛杉矾之旅作准备.) 玲玲:你好,贝蒂,我正在列旅行用品清单.我喜欢提前准备好东西.你能帮我吗? 贝蒂:当然可以.我怎么帮你? 玲玲:嗯,这听起来荒唐,但是我 ...

  • 【课文 单词mp3】外研版八下Module 6

    对话音频: [对话翻译] 玲玲:嗨,大家好!进来找地方坐下.不好意思,(家里)有点乱.我来把这些扇子放到架子上. 贝蒂:让我看一看.你有这么多扇子. 玲玲:是啊,大约六十把. 贝蒂:你从哪儿得到它们的 ...

  • 【课文 单词mp3】外研版八下Module 5

    对话音频: [对话翻译] 托尼:大明,我们已经完成了家庭作业.到看动画片的时间了. 大明:好主意,托尼.让我们看<超人>吧! 托尼:我们昨天看过<超人>了.我们为什么不看< ...