硬汉嵌入式论坛

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

[STM32H7] 基于STM32H7和ESP32S3的网络收音机开发实战指南[硬件篇]双MCU的通信方案分析【5】

[复制链接]

4

主题

12

回帖

29

积分

新手上路

积分
29
发表于 昨天 18:23 | 显示全部楼层 |阅读模式
引言
    乐鑫科技背靠国外开源和自己的努力,如今成为了一个市值 304.57亿 的巨无霸。买它的股票,最少得一手【100股】也得近2万了。这是道德的沦丧?还是人性的扭曲?让我们来看下ta如何从穷屌丝逆袭成高富帅:
    https://www.bilibili.com/video/B ... 91c48e707c5a3773372
         21.png
    这几年大火的 3D打印机、小智Ai[很有意思,多模态ai大模型的应用]、物联网控制板、小米物联网设备等,背后都离不开乐鑫的esp系列rf mcu的身影。           https://espressif.com.cn/zh-hans/company/about-espressif
       20.png


章节要点
    本章要求读者了解usart,spi,qspi外设,有波形时序图的概念,不懂的地方问ai/baidu/google
    有需求或疑问,欢迎交流。想实时沟通可进QQ群交流 532183273

选型的背景知识与抉择

wifi芯片哪家强?中国上海找乐鑫吗?
    乐鑫的rf mcu ,micropython和circuitpython都为它适配了驱动,arduino基于idf为其进一步进行了封装,老外的这些奉献为全球爱好者降低使用门槛。当然,它自家的idf【基于freertos设计】,adf【音频框架】也写的不错,不过核心的东西都是lib,尤其音频这块,这几种解码都是烂大街的,我们还是在h7上逐个实现吧。
     https://github.com/espressif/esp-adf
    本章不讨论用于soc上的wifi【例如著名的螃蟹logo的瑞昱半导体(Realtek)【你电脑里的无线网卡】和 正基科技(AMPAK)【linux开发板上的常客,sdio接口的wifi】等】,驱动难度太大,但是笔者后面可以折腾下sdio wifi,提升下网络性能,这里挖坑待填。
    国内有哪些做wifi的呢?
        它们的资料齐全吗?技术支持到位吗?性能怎么样?
    国外有哪些做wifi的呢?
        它们的资料齐全吗?技术支持到位吗?性能怎么样?
    有兴趣的读者可以去了解了解。

    这里笔者想单独简要写下开源硬件里常见的2个国外wifi模组:
    1.openmv使用的winc1500-mr210pa spi/usart/iic接口的wifi模组,用于jpeg图传、无线py脚本debug等场景。
                53e51c96-1e93-4381-8a30-ec743ce9e72c.png
        flash:512KB  sram:64KB  
        https://openmv.io/products/wifi- ... F67yH2JBMus9hw_EufX
        https://docs.openmv.io/library/network.WINC.html
        https://ww1.microchip.com/downlo ... 210pa_datasheet.pdf

    2.树莓派pico w使用的 UART/PCM/SDIO 接口的wifi模组,主控为:CYW43439芯片【英飞凌的】
       3dec370b-a282-4945-91f3-91861cbf5639.png
        flash:576KB  sram:160KB  
        https://www.infineon.com/part/CYW43439

    为什么选乐鑫?
        上面提到的2个国外模组,资源不够该项目的挥霍,更贵。esp32s3-n16r8,量大管饱,小智ai也用的它。
        贵,但是生态好,性能足够且外设还可以(除adc,RF的痛点)。跑micropython,代码和开发环境(如thonny)都超级简单,够了。

MCU芯片哪家好?
    个人开发者友好又资料齐全还功能强大,选ST【意法半导体】。个中细节,不在本文的讨论之内。
    这里就得批一下国民的m7内核的芯片了,几个月了,官网还是英文版的参考手册,中文版的遥遥无期,但凡生态上点心,优势不就来了。

双MCU间如何通信?
    我们来梳理下mcu的通信接口:
    fsmc/fmc ? esp没有,排除
    rmii/mii ? 有意思,先排除
    sdio ? 有意思,先排除
        micropython没提供api呀,,,高速wifi一般都是这种接口,那通信速度不得起飞了【学习sdio从机通信,完美的平台啊】
    iis ? 有意思,先排除
        https://forum.anfulai.cn/forum.p ... ght=i2s%CD%A8%D0%C5
    iic ? 最高才1MHz,这么慢,怪不得老塞车,i3c协议都得皱眉头
        这里既然提到i3c了,文末把ti的介绍手册放上去,目前i3c在国外的高性能mcu上,已开始应用了,h7的新型号都支持了,我们也要与时俱进学习了。
        https://www.ti.com/content/dam/v ... logy_training_2.pdf
        如果读者看了,内心应该有这几个问题的答案:i3c和i2c的区别?i3c的优势在哪,和usart和spi比怎么样?该协议的时序图是什么样的,如何实现读写?
    qspi ?
        micropython也没提供api呀,,,
    usart ? spi ? 可以,算下通信速度
       我们来算算250KB要传多久【一个ts文件的体积】?
       假设stm32和esp32的usart最高波特率都是5Mbps【懒得查了】,在[color=rgba(0, 0, 0, 0.85)]8 位数据位 + 1 位停止位 + 无校验位(最常用的 8N1 格式)的情况下,耗时 512ms
       esp32的spi最高是80Mbps,stm32h7的可达上百Mbps,那么80M的速度耗时为 25.6ms //这里注意 spi传8bit和16bit,耗时是一样的。只是dma一次传输的数据宽度不同,提高了总线传输效率而已,并非提高传输速度。
       既然理论上,spi是usart的20倍,无疑,就是它了,注意这个耗时是理论最快传输速度~~~实际会慢点点,有各种小开销。
     既然上述分析已经确定接口了,接下来得思考下一个问题了:
     两mcu的spi通信接口如何设计?
      只有 csn,mosi,miso,sck够不够?
      mcu的dma一次只能传65536个 字节/半字/字 ,就算按字传,一次最多传 256KB【被带偏了哦,spi的data寄存器才半字】,mcu spi dma满载最多才128KB,但是
ts文件可是接近250KB,怎么办呢?分包。

    加一个busy【参考vs1053】和frame【参考camera接口】引脚,时序如下图,有经验的读者秒懂。
         e9e44627-4af3-482a-b2dd-b89c26ffc414.png     busy:当mcu忙,busy=1,空闲则=0,表示esp可以下发数据
    frame: 250KB数据的起始和结束
    csn:每个分包65536的起始和结束
    mosi:采用spi dma传输,耗时最低,且mcu在这个期间可以干其他活
   连线如下:
     esp32s3           stm32h7
      frame ----------- frame   //当超出spi一次最大传输量时,分包是必须的,参考camera,则需要“帧信号”告知整个包传输结束
      csn ------------- csn
      mosi ------------- mosi  //对于mcu来说,接收简直轻轻松松,把frame和csn设置为下降沿触发,在中断里使能 HAL_SPI_TransmitReceive_DMA即可,代码十分的简单,这种分包收发配合时序,实现较为简单。
      miso ------------ miso
      sck ------------ sck
      busy ---------- busy
    如上,通信方案确定完毕,那么解码方案呢?我们知道esp32的python太慢了,当然无法py解码,除非将解码库在py下实现,调接口才行【circuitpython就这么干实现了mp3的py解码,但是局限性很大】。

解码方案?
    硬解方案
        vs1003 和 vs1053 这两个内置dsp处理器的可以吗?
         我们去翻翻官网,结果是 1003的dsp只能解码mp3,wma,midi,那看来不能用了,我们要解包括aac在内的。1053支持Ogg Vorbis / MP3 / AAC / WMA / FLAC / MIDI 用的时候记得加上补丁,它们的dsp代码有bug,通过后续的补丁修复了很多bug,如下:

100.png 102.png    https://www.vlsi.fi/en/products/vs1003.html
            https://www.vlsi.fi/en/products/vs1053.html
             v_58d24a706c.png v_ceb5c64d23.png cn.png
    看完1053的手册,我们可以下定论了:
        当你的mcu很弱鸡的时候,用它吧,解码aac和mp3很吃 sram,flash和mcu性能。
        当你的mcu是stm32h7这种高性能的,扔掉1053吧,既省钱又少掉头发画板子,1053也不便宜,快赶上stm32h7的价格了。多掉点头发移植各种解码库就行了,都是开源的,开源世界真是好啊~~~可惜基本都是国外的成果,在这我想吹吹国内的库,也找不到啊~~~。
         26 (2).png
   
   软解方案
        有哪些库?
                  27.png
        目前嵌入式,读者只用关心这3个能解aac的就行了,笔者选的helix aac库,功能最弱,但是好在央广也不想解码器编码器太复杂,刚好ok。
        aac背后的基础理论是什么?有哪些种类?怎么调api?我们后面再专题讲解。

音频芯片的选择?
    目前esp的开发板板载audio chip挺火的,官方有现成的驱动,例如es8388啥的,很多开源项目都用这个,但是万变不离其宗,反正都是送iis数据,芯片选谁就看谁性能好咯?
    如何看性能呢?一般人也别管了,反正能响,i2s/sai能驱动就行。如果是驱动耳机吧,那就ti的pcm5102;喇叭随便吧,普通的8002功放+mcu dac就ok了,要好点音质,wm8978也够了。无所谓的,有资料能驱动就行。不是发烧友,就别太注重这个了。
这块要是细究起来,又是一篇文章了。wm8978这里笔者不多介绍了,一般的开发板普遍都是它,资料一堆。这里给出野火的在线文档,没有基础的读者,去读读吧。熟悉的就看下8978的框图就行了
    es8388、wm8978 在线数据手册
    http://www.everest-semi.com/pdf/ES8388%20DS.pdf
    Microsoft Word - WM8978_DS _DATASHEET - 1019963 - 1 - 4.5 - 1_.DOC

   野火在线文档链接:https://doc.embedfire.com/mcu/stm32/f767_h743_h750/hal_general/zh/latest/doc/chapter36_0/chapter36_0.html

结语
    stm32 使用 spi 与 esp32通信;
    esp32端采用micropython编程,stm32采用c语言。
    esp32只负责网络通信和spi交互、usart交互,stm32负责解析ts,解码aac,驱动音频芯片播放与全局控制。
    本文内容涉及的东西比较广泛,并且没打算展开一些细节(没有多年使用高性能mcu的读者,可能一头雾水),本文着重介绍了选型的思路和实施方案。
   笔者注:
    从本文的写作中,读者应该能看出来 会查原厂资料和英语的重要性。希望刚从事嵌入式的读者,能从中受益匪浅,本项目并非只科普具体技术,更多的是给出方向让读者自己去探索细节(不是一篇文章能交待清楚的),让大家真正系统性的学到东西,有解决问题的能力,比掌握这个现成的技术,更为重要。掌握技能,打牢基础,千万不要忘记基础知识的重要性的奠基性的作用。浮于表面,永远学不深的。

下章预告
    硬件准备好了,就差软件和算法了,是时候分析mp3和aac,揭开它们背后的秘密了,熟悉底层是为了更好的使用开源库api,熟悉其数据结构为我所用。

开发参考资源
    部分链接已在文中相应位置标记,方便读者查询。
vs芯片原理图,中文在线文档,应用说明【1053 CVDD -- 1.8V  1003 CVDD -- 2.8V】
      https://w.electrodragon.com/w/images/e/e8/VS1003.pdf
      https://w.electrodragon.com/w/im ... odule_CN_manual.pdf
      https://w.electrodragon.com/w/images/c/c4/VS1053_cn.pdf


    vs官方demo c代码链接
      https://www.vlsi.fi/en/support/s ... rollersoftware.html


   FAAD2/FDK-AAC/Helix-AAC 给出faad2的解码库
      https://github.com/knik0/faad2
      https://github.com/knik0/faad2/tree/master





   网络收音机应用
     https://www.eetree.cn/project/detail/879
     开源代码链接:https://github.com/Daweiandhislittlefriend/esp32s2-radio
104.png



   esp官方audio库【一堆lib】
    https://github.com/espressif/esp ... p_audio/lib/esp32s3
   es8388等
     https://github.com/espressif/esp-adf/tree/master






回复

使用道具 举报

0

主题

300

回帖

300

积分

高级会员

积分
300
发表于 昨天 23:05 | 显示全部楼层
可以QSPI
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119685
QQ
发表于 13 分钟前 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 10:33 , Processed in 0.046087 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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