|
|
引言
乐鑫科技背靠国外开源和自己的努力,如今成为了一个市值 304.57亿 的巨无霸。买它的股票,最少得一手【100股】也得近2万了。这是道德的沦丧?还是人性的扭曲?让我们来看下ta如何从穷屌丝逆袭成高富帅:
https://www.bilibili.com/video/B ... 91c48e707c5a3773372
这几年大火的 3D打印机、小智Ai[很有意思,多模态ai大模型的应用]、物联网控制板、小米物联网设备等,背后都离不开乐鑫的esp系列rf mcu的身影。 https://espressif.com.cn/zh-hans/company/about-espressif
章节要点
本章要求读者了解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等场景。
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芯片【英飞凌的】
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接口】引脚,时序如下图,有经验的读者秒懂。
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,如下:
https://www.vlsi.fi/en/products/vs1003.html
https://www.vlsi.fi/en/products/vs1053.html
看完1053的手册,我们可以下定论了:
当你的mcu很弱鸡的时候,用它吧,解码aac和mp3很吃 sram,flash和mcu性能。
当你的mcu是stm32h7这种高性能的,扔掉1053吧,既省钱又少掉头发画板子,1053也不便宜,快赶上stm32h7的价格了。多掉点头发移植各种解码库就行了,都是开源的,开源世界真是好啊~~~可惜基本都是国外的成果,在这我想吹吹国内的库,也找不到啊~~~。
软解方案
有哪些库?
目前嵌入式,读者只用关心这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
esp官方audio库【一堆lib】
https://github.com/espressif/esp ... p_audio/lib/esp32s3
es8388等
https://github.com/espressif/esp-adf/tree/master
|
|