es8388音频芯片驱动之六:ES8388+UAC的录音播放实例分享

原创 嵌入式Lee 2024-06-24 08:02

一. 前言

前面我们已经详细介绍了es8388的功能,重点是关注其ADCDAC链路的配置,同时也实现了其寄存器的读写驱动,并实现了es8388功能配置的驱动接口es8388.c/h。现在开始就可以实现具体应用了。前面我们也分享了UAC的诸多实例,现在我们就基于UACes8388实现麦克风和扬声器,录音和播放。

Uac相关实例参考:https://mp.weixin.qq.com/s/bLSLwPjl5cC_8X-YxZo89Q USB系列之-UAC扬声器+麦克风实例分享》

二. IIS通讯

首先控制器需要实现IIS驱动,这是平台相关这里就不再赘述。为了保证数据不断流,需要IIS驱动能实?现ping-pang传输,一般由DMA+Half中断实现。

同时确保前面寄存器读写驱动接口移植好,添加es8388.c/h这部分驱动代码,参考如下配置,16K,差分输入输出,单声道。如果ES8388IIS无输出,或者给了输入DAC无输出,参考前面分享的文章进行分析。

static int es8388_itf_cfg(void){    /* 见ES8388 user Guide.pdf的10.1 The Sequence for Start up codec */
    /* 1.设置ES8388为从模式 */    es8388_set_mode_bck(ES8388_MODE_SLAVE, 0, 0, 0);  
    /* 2.关闭DEM STM等电源 */    es8388_set_chip_pwr_bits(ES8388_ADC_DIGPDN | ES8388_DAC_DIGPDN | ES8388_ADC_STM_RST |  \                             ES8388_DAC_STM_RST | ES8388_ADCVREF_PDN | ES8388_DACVREF_PDN);
    /* 3.设置ADC DAC使用同样的LRCK */    es8388_set_lrck(ES8388_SLRCK_SAME,ES8388_LRCKSEL_DAC_LRCK);
    /* 4.Set Chip to Play&Record Mode */    es8388_set_enref(1);    es8388_set_vmidsel(ES8388_VMIDSEL_50K);
    /* 5.Power Up Analog and Ibias */    es8388_clr_chip_ctrl2_bits(ES8388_PDNIBIASGEN | ES8388_PDNANA | ES8388_LPVREFBUF);
    /* 6.Power up ADC / Analog Input /Micbias for Record */    es8388_clr_adc_pwr_bits(ES8388_PDNAINL | ES8388_PDNAINR | ES8388_PDNADCL |                               ES8388_PDNADCR | ES8388_PDNMICB | ES8388_PDNADCBIASGEN);
    /* 7.Power up DAC and Enable LOUT/ROUIT */    es8388_set_dac_pwr(ES8388_CH_L,1);    es8388_set_dac_pwr(ES8388_CH_R,1);    es8388_set_dac_out_en(ES8388_OUT_L1,1);    es8388_set_dac_out_en(ES8388_OUT_L2,1);    es8388_set_dac_out_en(ES8388_OUT_R1,1);    es8388_set_dac_out_en(ES8388_OUT_R2,1);
    /* ADC部分 */    es8388_set_adc_gain(ES8388_CH_L, 21);  /* PGA增益 24db */    es8388_set_adc_gain(ES8388_CH_R, 21);
    es8388_set_adc_ds(ES8388_DSSEL_LIN1_RIN1, ES8388_DSSEL_LIN2_RIN2);    es8388_set_adc_in(ES8388_CH_L,ES8388_INSEL_LR);    es8388_set_adc_in(ES8388_CH_R,ES8388_INSEL_LR);        es8388_set_adc_monomix(ES8388_MONOMIXSEL_STEREO);
    es8388_set_adc_format(DATSEL_LDATA_LADC_RDATA_RADC, LRP_NORMAL_2ND, WL_24, FORMAT_I2S);        es8388_set_adc_fs(ES8388_FS_MODE_SINGLE, ES8388_FS_RADIO_1000);
    es8388_set_adc_vol_attenuates(ES8388_CH_L, 86);  /* 先设置衰减大一点,避免ADC噪声过大或者超量程 */    es8388_set_adc_vol_attenuates(ES8388_CH_R, 86);        es8388_set_adc_pgagain_th(47, 0);
    es8388_alc_cfg_st alccfg=    {        .alcsel = ES8388_ALCSEL_LR,        .alclvl = -9,        .alchld = 0,        .alcdcy = 1,        .alcatk = 2,        .alcmode = ES8388_ALCMODE_NORMAL,        .alczc = 0,        .time_out = 0,        .win_size = 96,    };    es8388_set_adc_alc_cfg(&alccfg);    es8388_set_adc_noisegate(1, ES8388_NOISE_GATE_TYPE_MUTE, 81);
    /* DAC部分*/    es8388_set_dac_format(0, LRP_NORMAL_2ND, WL_24, FORMAT_I2S);     /* 设置DAC数据格式 */    es8388_set_dac_fs(ES8388_FS_MODE_SINGLE, ES8388_FS_RADIO_1000);
    es8388_set_dac_vol(ES8388_CH_L, 0);     /* 设置L通道音量 0db即不衰减,最大音量 */    es8388_set_dac_vol(ES8388_CH_R, 0);
    es8388_set_dac_mixen(ES8388_CH_L,ES8388_OUT_SRC_MIXSEL,0);     /* 设置OUT只来源于DAC,不来源于MIXSEL */    es8388_set_dac_mixen(ES8388_CH_L,ES8388_OUT_SRC_DAC,1);    es8388_set_dac_mixen(ES8388_CH_R,ES8388_OUT_SRC_MIXSEL,0);    es8388_set_dac_mixen(ES8388_CH_R,ES8388_OUT_SRC_DAC,1);
    es8388_set_dac_outvol(ES8388_OUT_L1,9);    /* 设置对应引脚的输出音量,使用L的1和2引脚, 先设置最小音量-90/2db避免输出过大 */    es8388_set_dac_outvol(ES8388_OUT_L2,9);    es8388_set_dac_outvol(ES8388_OUT_R1,9);    es8388_set_dac_outvol(ES8388_OUT_R2,9);
    /* 开DEM STM等电源 */    es8388_clr_chip_pwr_bits(ES8388_ADC_DIGPDN | ES8388_DAC_DIGPDN | ES8388_ADC_STM_RST |  \                             ES8388_DAC_STM_RST | ES8388_ADCVREF_PDN | ES8388_DACVREF_PDN);    return 0;}

使用逻辑分析仪抓取IIS通讯数据确认收发是否正确。

对于DAC可以输出正弦波数据进行测试,示波器查看输出是否是正弦波,并且可以检查数据是否有断流。一个比较常见的问题是驱动设计不合理无法保证两次传输之间的无缝连接,两笔传输之间可能存在抖动,可以通过正弦波测试,示波器分析输出信号的傅里叶变换通过谐波看出来。

对于ADC可以用手机下载固定频率声音播放器,播放固定频率音频,然后抓取IIS的数据看是否正确,或者通过控制器其他手段比如dumo内存的数据通过串口打印出来,到电脑上画出曲线进行分析。

一. 数据流设计

整个应用的核心就是播放和录音的两条数据流了,音频重点要保证的是数据的流式传输,必须保证不断流,无抖动。这里涉及到几个核心技术FIFO设计,FIFO池设计,ping-pang传输设计。

FIFO相关设计我们之前已经造过相关的轮子了,并且多出应用了,现在又派上用场了。

参考

https://mp.weixin.qq.com/s/MvL9eDesyuxD60fnbl1nag 《超级精简系列之十三:超级精简的循环FIFO,C实现》

https://mp.weixin.qq.com/s/PV-sUxzTEKbobgyt4BKRlA《超级精简系列之十九:超级精简的循环FIFO,C实现》

整个数据流分为两个方向,设计思路是一样的,

播放的数据流

PC(或其他主机) ->  USB(UAC) - > FIFO - > 算法处理 -> 发送ping-pang缓存 -> IIS发送 ->ES8388 - >PA -> 喇叭。

整个流程有两个重点节点:一个是接收FIFOUAC收到数据存入该FIFO,一是发送ping-pang缓存,算法任务从接收FIFO中取出数据进行算法处理,然后写入ping-pang缓存进行发送。注意这里算法任务等待上一次IISDMA传输完才进行下一次处理,所以是由IISDMA发送中断驱动的,IISDMA在两个缓存之间无缝连接(依赖于硬件的HALF中断或者DMA描述符链表机制)DMA中断通过信号通知任务。为了启动DMA的流,所以一开始必须先提交两笔传输,即ping-pang缓存的两个缓存都处于待发送状态,一个发送完后硬件自动切换到下一个,并且产生中断发送信号通知任务运算,准备下一个发送。任务需要从接收FIFO获取数据进行处理存在DMA发送完一笔,但是接收FIFO中还不足一笔数据的情况,这个时候就是断流的情况,可以先接收FIFO积蓄至少两笔以上才进行IIS DMA发送,这样足够的冗余避免断流,详见下一节断流分析。

录音的数据流

MIC->ES8388>IIS->接收-ping-pang缓存->发送FIFO-> UAC->USB主机

整个流程有两个重点节点:一个是发送FIFOUAC从该FIFO读出数据进行发送,一是接收ping-pang缓存,算法任务从ping-pang缓存中取出数据进行算法处理,然后写入发送FIFO等待UAC发送。注意这里算法任务等待上一次IISDMA传输完才进行下一次处理,所以是由IISDMA接收中断驱动的,IISDMA在两个缓存之间无缝连接(依赖于硬件的HALF中断或者DMA描述符链表机制)DMA中断通过信号通知任务。为了启动DMA的流,所以一开始必须先提交两笔传输,即ping-pang缓存的两个缓存都处于待接收状态,一个接收完后硬件自动切换到下一个,并且产生中断发送信号通知任务运算,准备下一个接收。任务需要从ping-pang缓存获取数据进行处理存入发送FIFOUAC发送。UAC发现发送FIFO不足一笔数据的情况,这个时候就是断流的情况,可以先等待发送FIFO积蓄至少两笔以上才进行UAC发送,这样足够的冗余避免断流,详见下一节断流分析。

四. 断流问题

前面数据流设计中提到了两个方向的数据断流的问题,这里再详细分析下。

UAC发送FIFO中时可能存在断流问题,因为发送FIFO是一个水池,IIS DMA接收驱动任务算法处理往该FIFO写数据。理论上IIS采样率和UAC发送率是匹配的,但是不可避免存在一点抖动偏差,这个抖动偏差就可能使得错过,比如往发送FIFO写数据第一次的时间间隔是9mS,下一次是11mS,那么UAC发送间隔时可能写数据还差一点时间才到就读不到数据导致断流,如下图生产者消费者模型所示

解决方法是消费者延迟消费,即等待生产生产两笔以上数据,再进行消费,那么水池里就继续了两笔以上数据下次消费时由于抖动,来的快一点,或者生产下一次生产的慢一点也不会导致断流,因为里面有两次传输的冗余可以协调。只要抖动不超过这个水池的积蓄量就不会断流,因为平均速率是基本一样的,所以不会导致太大的偏差,只会偶尔小的偏差,所以这个积蓄量就可以保证不断流。

从接收FIFO读数据处理也有同样的断流问题,也是一样的,不再赘述。

五. 总结

本篇是es8388应用案例分享系列的完结篇,以一个具体的应用结尾,该应用完全按照产品应用级设计,直接可以应用到自己的产品设计当中去。通过以上应用,其中IO模拟IICFIFO设计等基础技术,也可以体验到之前我们设计自己趁手的轮子的必要性了。


评论
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 138浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 175浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 31浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 23浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 164浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 165浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 113浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 162浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 32浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 36浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 143浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 38浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 121浏览
我要评论
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦