Audio(Mic/Speaker/I2S)

Audio部分的说明
1、就4G模组来说,从主芯片是否支持Audio音频功能来看,大致可以分为2类;
- 主芯片支持Audio音频功能,比如合宙老型号Air724UG;
- 主芯片不支持Audio音频功能,比如合宙Air780Exx系列、Air8000系列、Air700ECH;
2、虽然Air780Exx系列、Air8000系列的主芯片不支持Audio音频功能,但可以通过与Audio Codec芯片配合实现Audio音频功能,比如Air780EHV,内置了Audio Codec芯片顺芯ES8311,进而实现Audio音频功能;
3、有些型号,比如Air780EHM/Air780EGH/Air780EGG/Air700ECH/Air8000全系列,虽然没有内置ES8311,但可以将ES8311外置,通过I2S接口进行驱动;
4、即便可以搭配Audio Codec芯片顺芯ES8311,有些配置较低的模组型号(主要是指Flash和RAM为4MB的型号),比如Air780EPM/Air780EGP/Air700ECP,也无法支持Audio音频功能;
5、综上,我们可以将是否支持Audio音频功能的模组型号归类如下;
| 支持Audio音频功能且内置Audio Codec芯片ES8311 | Air780EHV |
|---|---|
| 支持Audio音频功能但未内置Audio Codec芯片ES8311 | Air780EHM/Air780EGH/Air780EGG/Air700ECHAir8000A/Air8000W/Air8000D/Air8000T/Air8000DB/Air8000AB/Air8000U/Air8000N 说明! 虽然Air8000U/Air8000N可以支持Audio功能,但我们并未在海外场测,需要自行测试确认! |
| 不支持Audio音频功能 | Air700EPM/Air780EGP/Air700ECP |
6、Air780EHV,内置了Audio Codec芯片ES8311,相应的,有一些管脚资源必然会被占用,明细如下;
| Air780EHV | 管脚号 | 说明 |
|---|---|---|
| I2S_BCLK | PIN30 | 内部已使用,外部不可以再用 |
| I2S_LRCK | PIN31 | |
| I2S_DIN | PIN32 | |
| I2S_DOUT | PIN33 | |
| I2S_MCLK | PIN26 | |
| I2C0_SCL | PIN57 | 内部已使用,外部理论上可以再外挂I2C外设,在Air780EHV默认当外部不可使用处理;外部外设如需使用I2C接口,推荐使用I2C1; |
| I2C0_SDA | PIN58 | |
| GPIO20 | PIN102 | 内部Audio Codec芯片ES8311使能开关,高打开,低关闭 |
| AudioPA_EN | PIN19 | GPIO22,固定用作外部音频PA的使能信号,搭配扩展库exaudio,有效滤除POP音 |
7、对于Air780EHV来讲,硬件参考设计如下;

- 我们设计了AirAUDIO_1000,可以帮助大家搭配Air780EHV快速验证音频功能;
- https://docs.openluat.com/accessory/airaudio_1000/
- 驻极体麦克风,Air780EHV已内置Micbias偏置,外面无需再加;
- 喇叭,必须外置音频PA,内置ES8311的音频输出无法直接驱动喇叭;
- AudioPA_EN,芯片PA使能信号,涉及到POP音的控制,详情见audio核心库中的描述; https://docs.openluat.com/osapi/core/audio/
audio.config(id, paPin, onLevel, dacDelay, paDelay, dacPin, dacLevel, dacTimeDelay)
paPin
参数含义:PA(音频放大器)控制IO;
数据类型:number;
取值范围:具体硬件环境支持的GPIO;
是否必选:非必须传入此参数;
注意事项:
1.配合dacPin,onLevel,dacDelay,paDelay,dacTimeDelay音频参数,可以有效的降低pop 音;
2.如果不传入则不对pa进行任何控制
参数示例:0,GPIO0 控制PA 的打开或者关闭 ;
8、对于没有内置ES8311的模组型号,比如Air780EHM和Air780EGG/EGH,则需要同时使用I2S和I2C接口外置;



- I2C推荐默认使用PIN57/58复用的I2C0,与Air780EHV保持一致;
- 以Air780EGG/Air780EGH为例,硬件参考设计如下;

- 在使用I2S和I2C0(PIN57/58)功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;
- 关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

9、关于Audio功能的LuatOS核心库或扩展库,不再一一列举,请看文档;
https://docs.openluat.com/air780egh/luatos/app/common/audio/
ES8311搭配I2C可能遇到的问题
一,背景说明;
a. 合宙4G模组,包括Air780Exx系列、Air8000系列、Air700Exx系列,大部分型号都可以支持2路I2C,一路为I2C0,一路为I2C1;
b. I2C0和I2C1,分别会复用在不同的多处管脚,但只要一处复用为I2C0,其它地方便不可再复用为I2C0,I2C1也一样;
c. 部分型号,比如内置Audio Codec ES8311的Air780EHV,内置G-Sensor的Air8000A/D/AB/DB/U/N和Air780EGP/EGG,在模组内部都占用了一路I2C,这就意味着,该路I2C总线在模组内部已有上拉电阻;
d. Air780Exx系列模组I2C信号管脚及复用信息如下;

e. Air700Exx系列模组I2C信号管脚及复用信息如下;

f. Air8000系列模组I2C信号管脚及复用信息如下;

二,常见的坑;
a. 两路I2C,如果每路I2C只挂载一个外设,在实际应用中都没有发现什么问题,注意做好I2C_SCL和I2C_SDA两个信号的上拉即可;
b. 大家开发的很多产品中,由于IO有限,导致不得不在很多情况下都要一路I2C挂载多个外设;
当一路I2C挂载多个外设时,又分为四种情况,分别以Air780EHM、Air780EHV、Air780EGG和Air8000A为例进行说明;
第一种情况;
模组内部没有占用I2C,即没有挂载G-Sensor或Audio Codec ES8311,以Air780EHM为例;
假设使用PIN56/57复用为I2C0,只挂载一个LCD触摸屏外设,没有问题;
使用PIN66/67复用为I2C1,同时挂载G-Sensor、Audio Codec ES8311和摄像头三个外设,需要特别注意如下几点,否则会出现I2C1通信不正常的问题;
第1
如果三个外设分别由三个独立LDO供电,且每个外设的I2C1_SCL和I2C1_SDA都独立上拉到了各自的电源,这个时候:
当要打开其中一个外设时,另外两个外设的电源也必须要打开,否则会造成I2C通信不正常;
原因是,给每个外设供电的LDO,以LP5907MFX为例,其在关闭时,LDO电源输出管脚会有下拉电阻到地,进而造成I2C电平拉低,比如Air780EHM电平设置为3.3V时,会被拉低到2.2V甚至2V以下,造成I2C通信不正常;

第2
如果三个外设分别由三个独立LDO供电,但I2C1_SCL和I2C1_SDA都只拉到了其中一个外设的电源,这个时候:
当要打开其中一个外设时,必须要保证"I2C1上拉的电源是打开的"和"Audio Codec ES8311的电源是打开的",否则会造成I2C通信不正常;
"I2C1上拉的电源是打开的"非常好理解,不再赘述;
"Audio Codec ES8311的电源是打开的"的原因是,ES8311在没有供电时,其SCL和SDA管脚为芯片内部下拉,也会造成I2C电平被拉低到2.2V甚至2V以下,进而造成I2C通信不正常;
第3
如果三个外设分别由三个独立LDO供电,但I2C1_SCL和I2C1_SDA都只拉到了模组自带的VDD_EXT或Vref,这个时候:
当要打开其中一个外设时,不需要做其它动作,只需确保给外设的供电正常即可;
不同的是,在低功耗模式 pm.WORK_MODE,1 下,Audio Codec ES8311由于在未供电的情况下I2C管脚芯片内部下拉会造成功耗浪费,Vref一直消耗,VDD_EXT由于间歇性输出所以功耗浪费相对Vref较小;
说明!关于VDD_EXT和Vref的描述,详见硬件管脚详细说明文档中的相应章节;
结论
以上三种情况各有优劣势,大家根据自己产品的需要灵活选择即可;
相对而言,我们认为第2种情形更好一些,比如:
I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给ES8311供电的电源上,当打开摄像头或G-Sensor时,确保给"ES8311供电的电源是打开的"可以给I2C1提供上拉且"保证ES8311在供电"即可;
或者,I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给摄像头供电的电源上,当打开ES8311或G-Sensor时,这时不但要确保给"摄像头供电的电源是打开的"可以给I2C1提供上拉,也需要保证"打开ES8311供电",这种方式就不推荐了;
或者,如果I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给G-Sensor供电的电源上,当打开摄像头或ES8311时,这时不但要确保给"G-Sensor供电的电源是打开的"可以给I2C1提供上拉,也需要保证"打开ES8311供电",这种方式就不推荐了;
第二种情况:
模组内部占用了一路I2C0挂载Audio Codec ES8311,同时将I2C0上拉到了给ES8311供电的LDO上,以Air780EHV为例:
(说明!虽然该路I2C0被内部使用,但同时也引出到了模组管脚PIN56/57,可用作挂载外部外设;)
假设使用PIN66/67复用为I2C1,只挂载一个LCD触摸屏外设,没有问题;
使用PIN56/57复用为I2C0,在模组内部挂载ES8311的情况下,外部再同时挂载G-Sensor和摄像头两个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是Audio Codec ES8311挂载到了内部;
第三种情况:
模组内部占用了一路I2C1挂载G-Sensor,同时将I2C1上拉到了给G-Sensor供电的LDO上,以Air780EGG为例:
(说明!Air780EGG内部使用的是GPIO18/19复用的I2C1,且引到了模组管脚PIN66/67可供外部外设使用;)
假设使用PIN56/57复用为I2C0,只挂载一个LCD触摸屏外设,没有问题;
使用PIN66/67复用为I2C1,在模组内部挂载G-Sensor的情况下,外部再同时挂载ES8311和摄像头两个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是G-Sensor挂载到了内部;
第四种情况:
模组内部占用了一路I2C0挂载G-Sensor,同时将I2C0上拉到了给G-Sensor供电的LDO上,以Air8000A为例:
(说明!Air8000A内部使用的是GPIO18/19复用的I2C0,且引到了模组管脚PIN80/81可供外部外设使用;)
假设使用PIN80/81复用为I2C0,在模组内部挂载G-Sensor的情况下,外部再同时挂载ES8311、触摸屏和摄像头三个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是G-Sensor挂载到了内部;
c. 核心"槽点",记住两点:
-
LDO在关闭的情况下,其输出内部下拉到地,如果I2C在其它地方上拉供电的前提下也接到了这里,会影响I2C电平,进而影响I2C通信;
-
Audio Codec ES8311由于芯片设计原因,其在未供电的情况下I2C两个管脚内部下拉到地,如果I2C在其它地方上拉供电的前提下也接到了这里,会影响I2C电平,进而影响I2C通信;
-
不知道怎么做的情况下,当一路I2C挂载多路外设时,如果遇到I2C通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;
三,对开发板的影响;
a. 这里说的开发板,主要是指合宙4G模组开发板,包括Air780Exx、Air700Exx、Air8000系列;
b. 由于管脚有限,开发板在设计时都是一路I2C挂载了多个外设,且几乎每个外设都加了独立上拉,因此:
如果遇到I2C通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;