.. _AUDIO LINK: AUDIO LINK ========================================= 本章节按照以下 7 个部分介绍ALINK: 1. ":ref:`AUDIO LINK 基本信息`" 2. ":ref:`AUDIO LINK 基本配置`" 3. ":ref:`AUDIO LINK 相关变量说明`" 4. ":ref:`AUDIO LINK 相关结构体说明`" 5. ":ref:`AUDIO LINK 函数说明`" 6. ":ref:`AUDIO LINK 应用`" 7. ":ref:`AUDIO LINK 注意事项`" .. _AUDIO LINK 基本信息: AUDIO LINK 基本信息 #################################################### AW30N 拥有Audio_link接口(简称ALNK),该功能在v1.2.0版本后支持; ALNK是一个通用的双声道的音频接口,用于连接片外的DAC或ADC; 连接信号有MCLK , SCLK , LRCK , DATA,支持16 /24 bit数据位宽,具有4条独立data通道。 有IIS / 左对齐 / 右对齐 / DSP0 / DSP1 共5种模式,目前1.2.0版本仅支持IIS模式。 其中IIS / 左对齐 / 右对齐定义为基本模式,DSP0 / DSP1 定义为扩展模式,4条data通道只能同时工作与基本模式或者扩展模式。 基本模式下 每条通道只支持双声道立体声,扩展模式下 每条通道均可支持单声道或者立体声。(目前v1.2.0版本仅支持IIS模式) .. _AUDIO LINK 基本配置: AUDIO LINK 基本配置 #################################################### 1. <>中的配置 .. image:: ALINK_app_config.h.png :alt: app_config :align: center .. centered:: app_config .. _AUDIO LINK 相关变量说明: AUDIO LINK 相关变量说明 ##################################################### | u8 **alink_chnl** [ALINK_MAX_CHANNEL]; //标记4个通道哪个正在使用 | u16 **alink_sync_timer_id**; //记录20ms定时同步的timer_id | ALINK_SYNC_CFG **alink_sync_mge**; //记录alink 同步相关信息 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _AUDIO LINK 相关结构体说明: AUDIO LINK 相关结构体说明 #################################################### 1. ALINK模块配置结构体: :: ALINK_PARM: .. image:: ALINK_PARM.png :alt: ALINK_PARM :align: center .. centered:: ALINK_PARM 2. ALINK_DATA通道配置结构体: :: ALINK_CH_CFG: .. image:: ALINK_CH_CFG.png :alt: "ALINK_CH_CFG" :align: center .. centered:: ALINK_CH_CFG 3. ALINK_DATA通道同步结构体: :: ALINK_SYNC_CFG: .. image:: ALINK_SYNC_CFG.png :alt: "ALINK_SYNC_CFG" :align: center .. centered:: ALINK_SYNC_CFG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _AUDIO LINK 函数说明: AUDIO LINK 函数说明 #################################################### 函数 u32 audio_link_init_api(void) **************************************************************************************************** | 该函数实现audio_link管理的结构体初始化,开机初始化调用一次即可。 | 该函数主要调用: | alink_init()函数:初始alink的中断,相关时钟等配置; | sys_timer_add()函数:开启20ms一次的同步定时任务。 | 返回值: | 成功:0; | 失败:-1; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 函数 u32 audio_link_uninit_api(void) **************************************************************************************************** 该函数实现关闭整个alink模块,同时取消20ms的同步定时任务。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 函数 u32 audio_link_init_channel_api(ALINK_CH_CFG \*alink_data_parm) **************************************************************************************************** | 该函数为注册data通道的相关配置。 | 该函数主要调用: | alink_channel_init()函数:注册data通道的相关配置; | audio_link_sync_init()函数:初始化alink_data通道的同步配置。 | 返回值: | 成功:对应的通道号(0 ~ 3); | 失败:-1; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 函数 u32 audio_link_uninit_channel_api(ALINK_CH_CFG \*alink_data_parm) **************************************************************************************************** 该函数为注销 ALINK 对应的 data 通道。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 函数 u16 audio_link_set_sr_api(u32 rate) **************************************************************************************************** | 该函数为设置alink采样率。 | 该函数主要调用: alink_sr():底层配置alink采样率; | 返回值: | 成功:对应的采样率; | 失败:0; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 函数 u16 read_audio_link_sr() **************************************************************************************************** | 该函数为获取当前alink的采样率。 | 返回值:alink采样率 .. note:: | 1. alink在寄存器里没有专门配置采样率的寄存器,只能通过配置的时钟来推导出目前alink工作的采样率。 | 2. alink采样率不是标准值,是由时钟分配分出来,所以会有偏差。 | 即: | 48000:实际为48077 | 44100:实际为44117 | 32000:实际为32051 | 24000:实际为24038 | 22050:实际为22059 | 16000:实际为16026 | 12000:实际为12019 | 11025:实际为11029 | 8000 :实际为8013 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _AUDIO LINK 应用: AUDIO LINK 应用 #################################################### | 由于AUDIO_LINK的DATA通道可以作发送端或者接收端; | 在应用上 公版SDK 把ALINK融入到ADC / DAC的结构当中。 | 即: | 在 **audio_adc.h** 里,可以选择 AUDIO_ADC_TYPE 是 **ADC** 还是 **ALNK** | 在 **Vaudio_dac.h** 里,可以选择 AUOUT_USE_DAC 是 **APA** 还是 **RDAC** 还是 **ALINK** .. image:: audio_adc-dac_select.png :alt: "audio_adc/dac_select" :align: center .. centered:: audio_adc/dac_select ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 简单使用ALINK **************************************************************************************************** | 使用ALINK需要两套环境,一套为主机,一套为从机; | 主机主要提供时钟,数据端可以 发送 / 接收。 | 下面介绍主从机如何配置 .. image:: master_slave.png :alt: "master_slave" :align: center .. centered:: master_slave ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 主/从机配置 **************************************************************************************************** 1. <>配置 主/从机 和 相关IO口 .. image:: master_app_config.png :alt: "master_app_config" :align: center .. centered:: master_app_config 2. 选择ALINK 的 **DATA方向** 是 **发送端** 还是 **接收端** 作为发送端: | 1: 在audio_dac.h里选择ALINK模式 | 2: 可工作在任意模式,需注意工作在扩音模式下时,需要把所有音效关闭,只运行SRC .. image:: master_audio_dac.png :alt: "master_audio_dac" :align: center .. centered:: audio_dac.h 作为接收端: | 1: 在audio_adc.h里选择ALINK模式 | 2: 运行在扩音模式下,audio_adc_init_api选择AUDIO_LINK模式,并把所有音效关闭,只运行SRC .. image:: master_audio_adc.png :alt: "master_audio_adc" :align: center .. centered:: audio_adc.h .. image:: audio_adc_init_api.png :alt: "audio_adc_init_api" :align: center .. centered:: audio_adc_init_api 3. 选择作为 **发送端** 后,audio_dac以ALINK作为工作 如:在音乐模式下,解码后的数据不是送往 RDAC 或者 APA 进行发声播放,而是通过app_config.h里配置的DATA IO口送往从机。 选择作为 **接收端** 后,audio_adc以ALINK作为工作 如:在扩音模式下,audio_dac拿到的数据不是从MIC采集回来的数据,而是ALINK DATA通道接收到的数据。 .. image:: ADC-ALINK-APA.png :alt: "ADC_ALINK_APA" :align: center .. centered:: ADC_ALINK_APA 4. 主从机环境配置好后,硬件连线正常即可。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _AUDIO LINK 注意事项: AUDIO LINK 注意事项 #################################################### 默认配置的IO口 会与 UI配置 冲突 **************************************************************************************************** 用户需要根据自己的应用来配置合适的IO口。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ALNK 在IIS模式下 每条通道只支持双声道立体声 **************************************************************************************************** | ALINK在IIS模式下 **DATA通道** 只支持 **双声道立体声**。 | AW30的 **ADC / APA / RDAC** 均为 **单声道**。 | 所以在SDK里通道传输的时候就会作对应的 声道复制 / 声道融合。 | 如:ALINK工作在发送端时,会做声道复制,见下图: .. image:: ALINK_ch_handle.png :alt: "ALINK_ch_handle" :align: center .. centered:: ALINK_ch_handle ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ALINK 同步操作 **************************************************************************************************** ALINK工作的频率是由PLL 320M 或 192M 时钟分频出来,得到的采样率不是标准值。 | 即: | 48000:实际为48077 | 44100:实际为44117 | 32000:实际为32051 | 24000:实际为24038 | 22050:实际为22059 | 16000:实际为16026 | 12000:实际为12019 | 11025:实际为11029 | 8000 :实际为8013 而adc , apa , rdac 工作则为标准的采样率,因此在alink搭配与他们使用工作一段时间后,会出现数据逐渐溢出或者缺失,需要搭配src同步来不断调整他们之间的采样率。 | 举例ALINK作为发送端时同步如何运行: | 1. 每次发送时记录src前后级缓存的数据长度,得到他们前后级加起来的一个数据百分比 | 2. 在初始化ALINK的时候,会注册1个约20ms的定时任务,该任务会 取这20ms里的缓存数据百分比平均值 去做 同步算法(调整SRC)。 .. image:: alink_tx_sync.png :alt: "alink_tx_sync" :align: center .. centered:: alink_tx_sync ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ALINK目前在应用上发送端使用了 DATA0 通道, 接收端使用了 DATA1 通道 **************************************************************************************************** | 用户需要使用其余通道,可以通过注册剩余DATA通道,在中断里处理自己的音频数据。 | 详情可以看audio_link_tx_demo.c 或者 audio_link_rx_demo.c里的demo。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ALINK 使用时出现卡音,声音乱掉等问题处理 **************************************************************************************************** 1. ALINK在搭配 RDAC / APA 使用时,发现声音出现乱掉 或者 疯狂打印“x" 可能原因导致: 1:主机进入了 powerdown / soft off / 关机 / 关闭ALINK模块, 导致主机无法提供时钟给从机,从机接收不到数据, 但是后续RDAC / APA 仍旧不断从缓存里拿数据,缓存数据不断减少,SRC同步错误调整导致。 2:检查DAC 与 ALINK工作的采样率是否匹配。 解决方法: 1. 重新上电即可。 2. 避免主机进入 powerdown / soft off / 关机 / 关闭ALINK模块状态,保证从机在ALINK工作期间 时钟正常运行。 3. 检查 RDAC / APA 与 ALINK工作的采样率是否匹配。 .. image:: alink_dac_error.png :alt: "alink_dac_error" :align: center .. centered:: alink_dac_error 2. ALINK在搭配 ADC 使用时,不断出现打印"3" 可能原因导致: 1:ALINK 搭配 ADC 工作时没有串SRC,SRC同步没有正常进行。 2:ADC与ALINK工作的采样率不匹配。 解决方法: 1. 检查是否串SRC(可以参考扩音模式下的音频流程) 2. 检查alink 同步操作是否正常运行。 3. 检查 ADC 与 ALINK 采样率配置是否一致 3. ALINK目前无法搭配其他音效使用。 4. ALINK目前不支持调整音量,只能在DAC端调整。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ alink中断启动频率 **************************************************************************************************** alink中断启动频率由 ALNK_BUF_POINTS_NUM 宏控制, 中断每次启动间隔时间为 : ALNK_BUF_POINTS_NUM / ALNK_SR; 即: | 默认ALNK_BUF_POINTS_NUM 为 64; | 默认ALNK_SR 为 32000; | 则启动间隔时间为 64 / 32000 = 0.002s ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ demo说明 **************************************************************************************************** 用户可以在 **audio_link_tx_demo.c** 或者 **audio_link_rx_demo.c** 里看 **audio_link** 如何完成初始化到工作流程。