4. AUDIO LINK
本章节按照以下 7 个部分介绍ALINK:
4.1. 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模式)
4.2. AUDIO LINK 基本配置
<<app_config.h>>中的配置
app_config
4.3. AUDIO LINK 相关变量说明
u8 alink_chnl [ALINK_MAX_CHANNEL]; //标记4个通道哪个正在使用u16 alink_sync_timer_id; //记录20ms定时同步的timer_idALINK_SYNC_CFG alink_sync_mge; //记录alink 同步相关信息
4.4. AUDIO LINK 相关结构体说明
ALINK模块配置结构体:
ALINK_PARM:ALINK_PARM
ALINK_DATA通道配置结构体:
ALINK_CH_CFG:ALINK_CH_CFG
ALINK_DATA通道同步结构体:
ALINK_SYNC_CFG:ALINK_SYNC_CFG
4.5. AUDIO LINK 函数说明
4.5.1. 函数 u32 audio_link_init_api(void)
该函数实现audio_link管理的结构体初始化,开机初始化调用一次即可。该函数主要调用:alink_init()函数:初始alink的中断,相关时钟等配置;sys_timer_add()函数:开启20ms一次的同步定时任务。返回值:成功:0;失败:-1;
4.5.2. 函数 u32 audio_link_uninit_api(void)
该函数实现关闭整个alink模块,同时取消20ms的同步定时任务。
4.5.3. 函数 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;
4.5.4. 函数 u32 audio_link_uninit_channel_api(ALINK_CH_CFG *alink_data_parm)
该函数为注销 ALINK 对应的 data 通道。
4.5.5. 函数 u16 audio_link_set_sr_api(u32 rate)
该函数为设置alink采样率。该函数主要调用:alink_sr():底层配置alink采样率;
返回值:成功:对应的采样率;失败:0;
4.5.6. 函数 u16 read_audio_link_sr()
该函数为获取当前alink的采样率。返回值:alink采样率
备注
48000:实际为4807744100:实际为4411732000:实际为3205124000:实际为2403822050:实际为2205916000:实际为1602612000:实际为1201911025:实际为110298000 :实际为8013
4.6. 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 还是 ALINKaudio_adc/dac_select
4.6.1. 简单使用ALINK
使用ALINK需要两套环境,一套为主机,一套为从机;主机主要提供时钟,数据端可以 发送 / 接收。下面介绍主从机如何配置master_slave
4.6.2. 主/从机配置
<<app_config.h>>配置 主/从机 和 相关IO口
master_app_config
选择ALINK 的 DATA方向 是 发送端 还是 接收端
- 作为发送端:
1: 在audio_dac.h里选择ALINK模式2: 可工作在任意模式,需注意工作在扩音模式下时,需要把所有音效关闭,只运行SRCaudio_dac.h
- 作为接收端:
1: 在audio_adc.h里选择ALINK模式2: 运行在扩音模式下,audio_adc_init_api选择AUDIO_LINK模式,并把所有音效关闭,只运行SRCaudio_adc.h
audio_adc_init_api
选择作为 发送端 后,audio_dac以ALINK作为工作
如:在音乐模式下,解码后的数据不是送往 RDAC 或者 APA 进行发声播放,而是通过app_config.h里配置的DATA IO口送往从机。
选择作为 接收端 后,audio_adc以ALINK作为工作
如:在扩音模式下,audio_dac拿到的数据不是从MIC采集回来的数据,而是ALINK DATA通道接收到的数据。
ADC_ALINK_APA
主从机环境配置好后,硬件连线正常即可。
4.7. AUDIO LINK 注意事项
4.7.1. 默认配置的IO口 会与 UI配置 冲突
用户需要根据自己的应用来配置合适的IO口。
4.7.2. ALNK 在IIS模式下 每条通道只支持双声道立体声
ALINK在IIS模式下 DATA通道 只支持 双声道立体声。AW30的 ADC / APA / RDAC 均为 单声道。所以在SDK里通道传输的时候就会作对应的 声道复制 / 声道融合。如:ALINK工作在发送端时,会做声道复制,见下图:ALINK_ch_handle
4.7.3. ALINK 同步操作
ALINK工作的频率是由PLL 320M 或 192M 时钟分频出来,得到的采样率不是标准值。
即:48000:实际为4807744100:实际为4411732000:实际为3205124000:实际为2403822050:实际为2205916000:实际为1602612000:实际为1201911025:实际为110298000 :实际为8013而adc , apa , rdac 工作则为标准的采样率,因此在alink搭配与他们使用工作一段时间后,会出现数据逐渐溢出或者缺失,需要搭配src同步来不断调整他们之间的采样率。
举例ALINK作为发送端时同步如何运行:1. 每次发送时记录src前后级缓存的数据长度,得到他们前后级加起来的一个数据百分比2. 在初始化ALINK的时候,会注册1个约20ms的定时任务,该任务会 取这20ms里的缓存数据百分比平均值 去做 同步算法(调整SRC)。alink_tx_sync
4.7.4. ALINK目前在应用上发送端使用了 DATA0 通道, 接收端使用了 DATA1 通道
用户需要使用其余通道,可以通过注册剩余DATA通道,在中断里处理自己的音频数据。详情可以看audio_link_tx_demo.c 或者 audio_link_rx_demo.c里的demo。
4.7.5. ALINK 使用时出现卡音,声音乱掉等问题处理
- ALINK在搭配 RDAC / APA 使用时,发现声音出现乱掉 或者 疯狂打印“x”
- 可能原因导致:
1:主机进入了 powerdown / soft off / 关机 / 关闭ALINK模块, 导致主机无法提供时钟给从机,从机接收不到数据, 但是后续RDAC / APA 仍旧不断从缓存里拿数据,缓存数据不断减少,SRC同步错误调整导致。 2:检查DAC 与 ALINK工作的采样率是否匹配。
- 解决方法:
重新上电即可。
避免主机进入 powerdown / soft off / 关机 / 关闭ALINK模块状态,保证从机在ALINK工作期间 时钟正常运行。
检查 RDAC / APA 与 ALINK工作的采样率是否匹配。
alink_dac_error
- ALINK在搭配 ADC 使用时,不断出现打印”3”
- 可能原因导致:
1:ALINK 搭配 ADC 工作时没有串SRC,SRC同步没有正常进行。 2:ADC与ALINK工作的采样率不匹配。
- 解决方法:
检查是否串SRC(可以参考扩音模式下的音频流程)
检查alink 同步操作是否正常运行。
检查 ADC 与 ALINK 采样率配置是否一致
ALINK目前无法搭配其他音效使用。
ALINK目前不支持调整音量,只能在DAC端调整。
4.7.6. alink中断启动频率
alink中断启动频率由 ALNK_BUF_POINTS_NUM 宏控制,
中断每次启动间隔时间为 : ALNK_BUF_POINTS_NUM / ALNK_SR;
- 即:
默认ALNK_BUF_POINTS_NUM 为 64;默认ALNK_SR 为 32000;则启动间隔时间为 64 / 32000 = 0.002s
4.7.7. demo说明
用户可以在 audio_link_tx_demo.c 或者 audio_link_rx_demo.c 里看 audio_link 如何完成初始化到工作流程。