查看: 5347|回复: 1

如何利用KL27+ALC5658实现48kHz/24bits的USB音频设备

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3875

    主题

    7479

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39287
    最后登录
    2025-7-22
    发表于 2019-7-5 09:47:19 | 显示全部楼层 |阅读模式
    本文主要描述如何参考SDK的代码,通过KL27驱动ALC5658实现48kHz/24bits (48kHz采样率,24bits音频数据宽度)的设计要求。


    拟实现的功能包括:


          1.通过USB连接该设备及PC,PC成功安装相应驱动后,该设备即可作为USB声卡使用;


          2.通过‘LINE IN’接口连接该设备及其它播放器,作为录音设备。

    USB音频设备的实现


    1、系统流程
    1.png

    图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.png

    图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.png

    图3. 原始4字节音频数据包含1字节0x00

    4.png

    图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.png

    图5.原始3字节音频数据

    6.png

    图6. 开头补1字节后的4字节音频数据


    SDK的API USB_AudioSpeakerPutBuffer对于音频数据的处理过程如下表所示

    6.2.png

    上表中带下划线的0x00即表示软件添加的1字节数据。

    通过DMA搬运修改后的音频采样数据至SAI Transmit Data Register (I2Sx_TDRn)

    7.png

    图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接口和音频时钟输出。引脚配置信息如下表所示:

    9.png

    外设功能

    USB音频应用程序使用的每个外设或接口的功能如下表所示:

    10.png

    USB音频设备验证

    若按照本文所述软件设计思路生成代码,且下载成功后,可通过USB接口连接至PC,此时USB同时将设备枚举为音频类设备,包括播放和录音设备,如下图所示:

    11.png

    图9. 播放设备

    12.png

    图10. 录音设备


    下面是音频数据传输相关的时序图及时钟信息:

    13.png

    图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加油站



    qiandao qiandao
    回复

    使用道具 举报

    该用户从未签到

    18

    主题

    63

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    290
    最后登录
    2024-12-3
    发表于 2023-6-11 14:41:06 | 显示全部楼层
    本帖最后由 eefocus_3733915 于 2023-6-11 15:12 编辑

    你好,大佬,我参考这个思路,用在 rt1176 上, 把 sai 24bit 的配置成 32bit, 8960 也配置为32bit, 目前基本播放有声音出来了,但是有破音 ,  读取 24bit 后转换为 32bit 数据进行播放的,

    请教下大神, 有破音是哪里没有处理好造成的啊 ?

    另外播放速度及播放完成时间是正确的
    读取 24bit 转 32bit 的函数:
    24-32.png

    这个转换有没有什么问题呀 ??

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 20:54 , Processed in 0.087361 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表