本文主要描述如何参考SDK的代码,通过KL27驱动ALC5658实现48kHz/24bits (48kHz采样率,24bits音频数据宽度)的设计要求。
拟实现的功能包括:
1.通过USB连接该设备及PC,PC成功安装相应驱动后,该设备即可作为USB声卡使用;
2.通过‘LINE IN’接口连接该设备及其它播放器,作为录音设备。
USB音频设备的实现
1、系统流程
图1. 音频数据传输过程
录音过程 →
第1步,CODEC通过‘Line-In’采集模拟音频信号,
第2步,CODEC(I2S Master)通过I2S接口将音频采样数据发送至MCU(I2S Slave),
第3步,MCU将程序处理后的音频数据通过USB接口传输至PC。
接下来将简要叙述音频数据的格式及软件程序:
CODEC作为I2S主机设备,将 ‘LINE IN’输入的模拟音频进行处理并通过I2S接口传输至MCU。考虑到在CODEC配置中,设置有效音频数据的长度为24bits;在SAI配置中,设置音频数据采样的长度为32bits;因此使用者实际将获得32bits的音频采样数据,其中包含3字节有效音频数据及CODEC自动添加的1字节0x00,如下图所示:
图2. CODEC输出的音频采样数据
DMA通道会传输32bits音频数据至SAI Receive Data Register (I2Sx_RDRn)。
【编程注意: DMA并不支持搬运24位数据,因此,针对本文所提出的48khz/24bits的需求,应将24位数据补8位的0值以构成32位才行。】
开发者需要删除上述音频采样数据中的首字节0x00,然后将剩余3字节有效音频数据通过USB接口传输至PC。
【备注: 可参考SDK提供的API: USB_AudioRecorderGetBuffer】
图3. 原始4字节音频数据包含1字节0x00
图4. 删减1字节0x00后的音频数据
播放过程
步骤1,PC通过USB接口向MCU发送音频数据,
步骤2 MCU(I2S Slave)将音频数据进行处理,并通过I2S接口将处理后的音频数据发送至CODEC(I2S Master)。
步骤3,Line-Out将音频数据输出,用户可连接耳机体验音频输出。
接下来将简要阐述音频数据的格式及软件程序的主要修改:
PC通过USB接口向MCU发送3字节音频数据;
在SAI配置中,设置音频数据采样的长度为4字节,可采取在现有的3字节音频数据起始位置补1字节0x00的方法构成4字节数据。
【备注: 参考SDK提供的API: USB_AudioSpeakerPutBuffer】
图5.原始3字节音频数据
图6. 开头补1字节后的4字节音频数据
SDK的API USB_AudioSpeakerPutBuffer对于音频数据的处理过程如下表所示
上表中带下划线的0x00即表示软件添加的1字节数据。
通过DMA搬运修改后的音频采样数据至SAI Transmit Data Register (I2Sx_TDRn)
图7. CODEC输出添加1字节0x00后的音频采样数据
2、SAI及CODEC配置
CODEC:音频数据的有效长度为24位。
SAI:一个音频数据的采样包含32位数据。
下面将对主要的时钟信息进行描述,
1) 主时钟(MCLK)可以由PLL倍频或外部晶体提供,频率为24.567Mhz。
2) 串行时钟(BCLK/SCLK)可以通过MCLK得到,例如
如果时钟分频系数为16,则BLCK = MCLK / 16 = 24.567Mhz / 16 = 1.5035Mhz
这个值对应于48KHz的采样率,每个采样包括2个通道(立体声)和2个字节(16位)。
如果时钟分频系数为8,则BLCK = MCLK / 8= 24.567Mhz / 8=3.0709 Mhz
这个值对应于48KHz的采样率,每个采样包括2个通道(立体声)和4个字节(32位)。
音频数据传输相关的时序图及时钟信息,如下图所示,
图8. 音频数据采样时钟
Channel 2: BCLK / SCLK
I2S/SAI发送和接收机制支持异步位时钟(BCLKs),它可以由主时钟分频得到或通过外部提供。
Channel 3: LRCK/WS
帧时钟WS(word select)/LRCK(left-right clock),也被称为采样频率,用于切换左右通道的数据。
当LRCK为“1”时,表示所传输的数据为右通道的数据;
当LRCK为“0”时,表示所传输的数据为左通道的数据。
例如,本文所述的帧时钟 (LRCK/WS)为48kHz,经运算得到3.07MHz的串行时钟(BCLK / SCLK)(2 * 32bits/word * 48000Hz)。
3、硬件设计概述
引脚选择
USB音频设备所使用的引脚均需根据需要设置mux状态,包括I2C接口、I2S接口、UART接口、USB接口和音频时钟输出。引脚配置信息如下表所示:
外设功能
USB音频应用程序使用的每个外设或接口的功能如下表所示:
USB音频设备验证
若按照本文所述软件设计思路生成代码,且下载成功后,可通过USB接口连接至PC,此时USB同时将设备枚举为音频类设备,包括播放和录音设备,如下图所示:
图9. 播放设备
图10. 录音设备
下面是音频数据传输相关的时序图及时钟信息:
图11. 音频数据传输相关的时序图
总结
本文对所参考的SDK主要进行了以下一些修改:
1)播放功能是依据这个例程项目修改而来:SDK_2.4.1_TWR-KL43Z48M\ ...\usb_device_audio_speaker_lite
涉及到如下文件:
usb_device_descriptor.h,需要对音频数据格式、音频数据包大小等信息进行重新配置,例如AUDIO_FORMAT_BITS、 AUDIO_FORMAT_SIZE、FS_ISO_OUT_ENDP_PACKET_SIZE等。
audio_speaker.c,这部分代码中的DMA搬运音频数据量,及I2S中关于音频数据长度等信息均需要重新配置。
CODEC: SDK代码的CODEC选型为WM8904,因此使用者需要根据所选CODEC的型号,对其进行重新配置。
2)录音功能是依据这个例程项目修改而来:SDK_2.6.0_FRDM-KL43Z\ ...\usb_device_audio_generator_lite
需要使用者重新配置的内容与前面的播放功能相同原理。
总体来讲,本文主要阐述了一种USB音频数据的48khz/24bits解决方案,并对相关修改部分进行了简要说明,用户可以下载SDK代码并进行相应修改及验证。
作者:张启鹏 文章出处:恩智浦MCU加油站
|