Hi-Fi 级蓝牙音频接收器

使用 CSR8675 和 AK4493 制作的Hi-Fi 级蓝牙音频接收器。

本文记录我使用 CSR8675 和 AK4493EQ 制作蓝牙音频接收器的过程和经验。

AK4493 官方宣传图片

随着蓝牙传输速率的提升以及更加先进的音频编解码器的出现,使用蓝牙传送近乎无损的音频不再是非常困难的事。目前行业内,CSR(已被 Qualcomm 收购)的 aptX 及 aptX HD 编码器、Sony 的 LDAC 编码器,都能够实现高质量的蓝牙音频传输。CSR 出品的 CSR8675 就是一枚支持 aptX HD 编码的多功能蓝牙芯片,它是制作 Hi-Fi 级蓝牙音频接收器的理想选择。

目前,在淘宝上由很多使用 CSR8675 的蓝牙接收 / 解码器,但都多多少少存在一些问题。价格在 100 – 200 元左右的设备,多采用了 PCM5102 / ES9023 等低端解码芯片,解码质量不尽人意。而 300 元以上的中高端设备,虽然采用了较好的解码芯片(如 AK4490),但由于 CSR8675 的 I2S 输出没有 MCLK 支持,这些解码芯片又要求 MCLK 输入,因此只能采取输出 S/PDIF,再由 AK4113 等接收芯片转换为 I2S 信号的做法,使实际效果大打折扣。

实际购买两款产品后发现,这两款产品的 PCB 设计都不太规范,数模信号没有分离,也没有一点接地,噪声较大。下图即为其中一款。

淘宝图片
淘宝图片

现有的产品令我深感失望,所以我决定自己设计并制作一款接收器。我计划自己设计电路和 PCB,但利用上图机器的外壳和电源变压器,因此 PCB 尺寸、螺丝孔位置和输入输出连接器的布局必须和原板相同。

实际制作出的产品具有如下几个优势:

  1. 设计简洁。本产品直接将蓝牙芯片的 I2S 信号输入 DAC 芯片,省略了中间 S/PDIF 信号的转换过程,保证了信号的质量。
  2. 使用方便。市面上的蓝牙 / 光纤双输入的产品,必须通过选择开关手动切换输入信号源,而本产品利用了 CSR8675 内置的输入源自动切换,无需手动切换。
  3. 音质更好。本产品使用了 AsahiKASEI 公司顶级解码芯片 AK4493EQ,具有良好的外围电路设计,配以 I2C 控制的软控音量调节,能够取得较低的失真,从而达到较好的音质。
  4. 是同类产品的先驱者。本产品采用的 ICS501 PLL 升频芯片及 I2C 软控方案,都是同类产品中从未出现过的,具有开创性的意义。

核心芯片的选择

在蓝牙芯片的选择上,支持 aptX HD 的唯一一款芯片是 CSR8675,所以自然是别无它选。CSR8675 采用了 BGA 封装,脚位较多且不便于焊接,因此使用 BTM875-B 转接板是最好的选择。它包含了运行 CSR8675 所需要的最小组件,只需接上 3.3V 电源就能工作。

“BTM875-B”的图片搜索结果
BTM875-B 核心板,图片来源于网络

机器的 DAC 芯片,我选择了 AKM 公司于 2017 年底发布的 AK4493EQ,是热销的上一代芯片 AK4490EQ 的升级版。它能够以简单的外围元件(仅需一个外置的低通滤波器)达到不错的性能,并且相比起其他芯片来说,价格并不昂贵(仅 30 人民币 / 片)。

Product Portfolio -Premium DACs -
AKM Premium 系列解码器芯片,圆圈大小代表“音质好坏”

这块芯片与 CSR8675 搭配的最大问题,在上文提到过,是其必须要求 MCLK 输入,而 CSR8675 恰好不提供 MCLK 输出。我以一个不知道是否标准、但能够工作的办法解决了这个问题。

缺少的 MCLK

I2S 协议至少需要 3 个传输线:位时钟 BCK(SCK)、声道选择 LRCK(WS)、数据 SDATA。

BCK 信号用于确定传输的每一位,即每发送一位数字音频数据,BCK 上都有一个脉冲。在一般的应用中, \(f_{BCK} = 2 \times 32 \times f_s(采样率)\) 。即使音频位深度只有 16 位或 24 位,依然会占用 32 个 BCK,多出来的位全部为 0。

LRCK 用于确定传输的声道,为高电平时传输左声道数据,为低电平时传输右声道数据。\(f_{LRCK} = f_s\)。

SDATA 即为真正的音频数据。

I2S 有时还需要另外一个主时钟 MCLK,供芯片内部逻辑使用。像 PCM5102 这样的解码芯片不需要这个时钟,它会产生自己的内部时钟;但 AK4493 需要这个时钟来驱动其内部的过采样逻辑和数字滤波器。MCLK 的频率要求因厂家而异;AK4493 可以使用的 MCLK 频率如下图:

AK4493 可用的 MCLK 频率。fs = 采样率

我们可以观察到,\(f_s\) 在 96 kHz 以下时,AK4493 都能以
\(256 \times f_s\) 的 MCLK 频率工作。而 BCK 始终是 \(64 \times f_s\),于是我们可以把 BCK 倍频 4 倍,作为 MCLK 信号。

经过一番寻找,我找到了能够满足要求的芯片:ICS501。ICS501 是一个 PLL 倍频芯片,可以将输入信号的频率提升到一定倍数后输出。它支持的升频倍数有 9 种,在这里我们选择 4 倍放大。

ICS501 支持的升频倍数

电路设计

解码器部分的电路结构相对较复杂,由电源退耦部分、MCLK 生成部分、低通滤波部分组成。 由于目前个人水平较低,没有自信进行较复杂的电路分析,所以这部分的设计均按照“贴近官方数据手册”的原则来进行。

DAC 供电部分

退耦部分
3.3V 稳压部分

AK4493 的供电分为 3 部分:数字 3.3V 供电,模拟 3.3V 供电,模拟 5V 供电。其中,数字 3.3V 和模拟 3.3V 各由一路 SPX1117-3.3 提供,5V 供电则直接由 7805 提供。数字供电和模拟供电分离,降低了干扰带来的噪声。

3.3V 的稳压芯片选择了成本稍高的 SPX1117 而不是常用的 AMS1117。前者的数据手册上明确允许使用 MLCC 电容作为输出电容,这种电容具有较小的体积和 ESR(等效串联电阻),可以达到较好的效果并节省 PCB 空间。

各路电源均按照官方数据手册的要求设置了退耦电容。由于使用的是低 ESR 的 MLCC 电容,所以容量比官方数据手册的容量稍小。

AK4493 除了正常工作所需的供电外,左右声道各有一路参考供电(VREFHL / VREFLL / VREFHR / VREFLR)。这路供电的作用是给输出信号提供参考电压,因此需要极小的噪声。在官方数据手册中,使用了 220 μF 的电容进行滤波;考虑到如此大的电容值(尤其是因为使用了 MLCC)可能会对稳压芯片的工作带来干扰,所以在供电时了一个 5 欧姆电阻,并使用两个 100μF 1206 封装的 MLCC 电容并联。实际组装时,因为没找到 1206 封装的电阻,所以使用了磁珠来代替,也取得了很好的效果。

MCLK 倍频部分

该部分电路非常简单,给 ICS501 提供了频率为 \(64 \times f_s\) 的 BCK 输入,连接其 S0、S1 控制脚使其进行 4 倍频。输出串联了一个 33Ω 的消振电阻,然后连接到 AK4493 的 MCLK 输入。 消振电阻的作用是防止振铃和过冲现象产生。

ICS501 芯片的供电串接了一个磁珠,并按照官方数据手册的推荐值并联了一个 10nF 电容。这样可以尽量减少噪声的产生。

低通滤波器部分

AK4493 采用的过采样 Σ-Δ 解码架构会将信号进行过采样,然后使用数字滤波器将音频段内的噪声滤除,留下音频带外的噪声。这部分带外噪声是数字滤波器无法去除的,它需要使用外部低通滤波器进行处理。常见的 DAC 架构中,Σ-Δ 架构是外围电路比较简单的架构,其他架构的 DAC 芯片通常需要更复杂的外围电路。

低通滤波器的电路结构和元件取值均照搬了官方数据手册的示例。此处选用了 0dB 增益的低通滤波电路,因为我的后级功放的增益较大,此处即使没有增益,在聆听时也能够达到足够的音量。

低通滤波电路

为低通滤波电路选购电容时,如果希望使用 MLCC 电容,则需要注意选用 NP0 / C0G 规格。这种电容的容量变化率较小,也几乎没有逆压电效应,适合作为信号通路的耦合电容使用。常用的 X5R / X7R 电容具有压电效应,会对信号耦合带来干扰,甚至导致信号失真,不适合用于信号通路,只适合用于滤波、退耦用途。

为了达到最佳效果,我没有使用 MLCC 电容,而使用了松下 ECHU(堆叠金属化 PPS 薄膜电容)系列。这种电容具有误差低(仅 2%)、频率稳定性极佳的特点,能够尽量减少低通滤波电路带来的失真。

运算放大器选用了 NJR 公司出品的 Hi-End 级音频运放 MUSES8920,好货无需多言。

蓝牙部分

由于 CSR8675 所需的核心组件都集成在 BTM875-B 核心板上,所以蓝牙部分的外围电路相对比较简单,仅有两个 LED 的限流电阻和 I2C 通讯总线的上拉电阻。

蓝牙模块电路

I2C 总线与 AK4493 相连,用于对 AK4493 进行配置和调整音量。使用 I2C 实现的无损硬件音量调节也是本产品的亮点之一。

蓝牙供电电路

蓝牙供电部分与 DAC 供电部分完全相同。

输入 / 输出部分

输入 / 输出部分

输入部分由 Toslink 光纤接收器(用于接收机顶盒的数字输出)和 SMA 接口(用于连接蓝牙天线)组成。Toslink 接收器的供电和输出也完全按照官方数据手册的电路设计,力求达到最佳效果。

I2S_EN 输出连接到了 P_EN 插针,可以引出作为后方功放的电源控制,无需每次都手动开关功放。

电源部分

系统供电电路

为了追求更好的信噪比,本产品使用了全模拟供电。12V 变压器输出连接到一个全桥整流器进行整流,然后经过了两个 25V 2200μF 电容进行整流。考虑到部分家庭供电电压可能会达到 240V,导致输出变压器电压较高,主滤波电容的耐压值选用了 25V 而非 16V。滤波后,一对 78/7912 稳压芯片,加上一对 100μF 的输出电容, 产生的
±12V 供电作为低通滤波器运放的供电。其中 +12V 又经过了一个 7805 将电压降至 5V,作为整个系统所需的 5V 供电。

接地部分

许多 DIYer 因为担心地线环路带来的噪声,选择了不连接市电地线。这种行为不符合相关的国家标准,并且为产品带来了严重的漏电隐患,是万万不可取的。我在制作中使用了许多厂机采用的阻容并联接地方式,既使系统接地与市电接地相通,又避免了环地问题。

接地电路

地线上可能会通过由感应噪声产生的电流,因此我使用了 4 个 0805 贴片电阻并联,来防止这个电流使电阻过热。而电容应选择耐压 250V 以上的器件,防止瞬间的感应电将其损坏。

PCB 设计

除了良好的电路设计以外,科学合理的元件布局和布线也是优秀的产品不可或缺的一个元素。在布线时,需要将数字电路和模拟电路分开布局,从而减少噪声。

为了使布线更加清晰可见,下面的 3D 图片均为 Altium Designer 的 3D Layout 视图。

数字部分

数字部分的布局布线遵循“缩短引线长度”、“降低地线阻抗”的原则。由于数字电路对环地问题不敏感,因此采用了大面积铺地,来降低地线阻抗。

数字部分 – 背面

模拟部分

模拟部分的布线要求相对较低,只需注意单点接地即可。

模拟、LPF 部分 – 正面
模拟、LPF 部分 – 背面

总体布局

3D 视图 – 正面
3D 视图 – 背面

这个设计中,螺丝孔、电源连接插座、光纤输入接口与原机完全相同,可以直接替代原机主板。

以上图纸均为第二版图纸,而下文实物是修改前的第一版图纸,有细微的区别。

实物制作

元器件选择

为了达到最佳性能,7812 / 7912 / 7805 均选用了 ON 公司的 MC78/9 系列产品。该系列产品相比常见的 LM78/9,具有较高的噪音指标。低压差稳压(LDO)也选用了性能较好的 SPX1117 系列。

电容的选择也非常关键。退耦 / 滤波部分的贴片电容,全部选用了三星 X7R 电容,而信号通道的贴片电容全部选用 Panasonic 的 ECHU 电容。这些电容都具有极低的 ESR,能够满足产品的需求,降低噪声、减少输出失真。

主滤波电容选用了 Panasonic FM 系列超低阻电容。实际安装时发现此电容过高,因此计划更换为 ELNA RA2 电容。

制作

在淘宝花 35 元进行了 PCB 打样,拿到了 PCB 板。购买相应元件,使用烙铁焊接后,洗去松香,然后涂上助焊剂,使用风枪融化元件引脚,使其位置更加整齐。焊接完成后:

PCB – 正面
PCB – 背面
芯片特写 – CSR8675
芯片特写 – AK4493
整体外观
整体外观

问题

第一版的设计和制作主要存在 4 个问题。

第一版左下角
  1. 安装孔距离布线太近(如上图),安装铜柱时,铜柱和螺帽可能会划破绝缘漆导致短路。
  2. 左下角的 7912 芯片画反。
  3. 购买的 Panasonic FM 主滤波电容的尺寸为 \(13 \times 35 mm\),高度太高导致无法合上顶盖。
  4. 忘记打泪滴。

在第二版中对这些问题进行了相应的修复:

  1. 在安装孔周围增加空间,避免离走线过近。并且将螺丝孔直接和市电地连接,避免了需要手动连接的麻烦。
  2. 纠正了芯片方向。
  3. 预计将主电容更换为 ELNA RA2 电容,相同容量尺寸为 \(12.5 \times 25 mm\),没有过高的问题。
  4. 增加泪滴。
第二版左下角

CSR8675 固件的编译与修改

AK4493 芯片分为硬控模式和软控模式。硬控模式非常简单,通过不同的引脚控制设备功能。但它的缺点是可控的功能较少,并且无法进行音量控制。软控模式则是通过 3-wire bus 或者 I2C 来写入芯片寄存器,从而控制芯片。与硬控模式相反,软控模式可以操控芯片的所有功能,特别是本项目的重点——DAC 层面的音量调节。

在一些论坛中可以找到 CSR8675 的 I2S 输出固件,但这些固件都无法满足我们的要求,因为它们无法通过 I2C 来配置 AK4493。我们需要定制 CSR8675 的固件选项,方可达到最佳的效果。

如果你不想自己进行这方面的配置,也可以直接在文末下载我已经配置好的固件。

安装 ADK

首先我们下载并安装 CSR8675 所使用的 ADK(开发工具包),这里我们使用最新的 CSR ADK 4.3.1.5。首先安装基础文件 ADK_CSR867x.WIN4.3.1.5.exe,然后安装 aptX 编码器插件 ADK_CSR867x.WIN4.3.1.5 aptX Codec Add-on.exe。安装好后,可以在开始菜单中找到相应程序。

打开工程并调整选项

安装完成后,打开用于开发固件的 xIDE,并选择 Project -> Open Workspace…,选择 C:\ADK_CSR867x.WIN4.3.1.5\apps\sink\soundbar.xiw。打开后,可以看到我们的主要工程 vm – ‘soundbar’ 以及一些用于解码的 Kalimba 工程。

我们先要修改 vm – ‘soundbar’ 工程的配置。右击 soundbar 工程,选择 Properties,在 Build System 菜单项内即可找到工程的配置。我们需要将 Wired Audio 、Extra Codecs、Hi Res Audio 选项打开,将 Hardware Variant 选为 H13179v2_H13478v2,Software Variant 选为 Soundbar-Subwoofer(其实我不知道 Soundbar-Mozart 是什么),然后项目应该就可以编译了。

给出我的配置选项供参考:

我的配置选项

启用 aptX 编码器

不过为了启用 aptX 和 aptX HD,我们还需要在 soundbar.mak 中取消注释 aptX 解码器和 aptX HD 解码器的项目文件。

如图,去除相关代码前面的注释符号 # 即可。

aptX 解码器
aptX HD 解码器

有关启用 aptX 解码器的详细信息,请参见 <ADK 安装目录>\doc\support\adkdocs\support\cs-314161-an.pdf。

修改 I2S 插件

CSR8675 的固件支持使用一个 GPIO 来控制后方 DAC 芯片的电源,并在打开电源后使用 I2C 配置设备。但它的控制方式有一个问题:在拉高电源脚后,会立即发送 I2C 指令,此时 DAC 芯片还来不及初始化,导致写入命令失败。为了解决这个问题,我们需要对 CSR8675 的 I2S 插件进行少许修改,为 I2C 配置命令加入一定的重试次数。

为此,我们自定义一个函数 I2cWriteWithRetry,来取代官方的函数 I2cTransfer。这个函数可以允许最多 40 次写入尝试,只有当成功时才会返回。

static void I2cWriteWithRetry(uint16 address, const uint8 *tx, uint8 tx_len)
{
    uint8 retries = 40;
    do
    {
        I2cReset();
        retries--;
        PanicZero(retries);
    } while (I2cTransfer(address, tx, (uint16)(tx_len - 1), NULL, 0) != tx_len);
}

修改后的代码文件如下:

修改 I2S 插件代码后,需要重新编译插件。只需运行开始菜单中的 VM libraries 即可。

VM libraries

连接设备

CSR8675 使用 SPI 进行通讯。PCB 上已经预留 SPI 接口,且其针脚顺序与我购买的下载器相同(方形为接地),使用杜邦线将其连接即可。

我使用的 USB 转 SPI

连接设备后,打开 BlueFlash 工具,若能看到 Process Running 的提示,即代表连接成功。

使用 PSTool 读取蓝牙频偏

使用 BlueFlash 抹除闪存

编译并下载固件

在编译固件之前,必须先连接设备,编译器方可获取设备类型、闪存大小等信息。连接设备后,点击 xIDE Build -> Build Active Project 即可编译。编译完成后,点击 Debug -> Run 即可下载并运行固件。

下载固件后,由于此时没有进行设备配置,所以应用程序无法正常运行,会提示 Out of memory initialising globals。这是正常的现象,在下一步中使用 PSTool 导入设备配置就可以解决这个问题。

使用 PSTool 合入设备配置

<开坑待填>

总结

在本项目中,我初步熟悉了数模混合电路 PCB 的设计技巧,并掌握了贴片元件的焊接以及热风枪的使用方法,收获颇丰。

实际产品的听感也十分良好。使用我三年前自制的功放,搭配
Seas H1215 中低音单元 + Scanspeaker 9300 高音单元的音箱,其声场开阔、乐器定位准确、细节丰富,低频有力、中频细腻、高频延伸到位,相比我之前购买淘宝套件制作的任何一款 DAC 、买到的两款蓝牙接收器,都要好很多。

总体来说,本次制作除了第一版设计稍有瑕疵外,总体效果无论是从功能还是从听感来看,都是令人满意的。

设计资料

如果想获得 CSR ADK 相关资料,可以给我发送邮件。

CC BY-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.

《Hi-Fi 级蓝牙音频接收器》有5个想法

    1. 用万用表 AC 档测出来是 2mV 左右。实际连接功放后,音量开到最大,耳朵贴近喇叭,底噪也几乎不可闻。

    1. 这个 DAC 主要是给我的音箱做的。要做耳放其实不困难,但我不会做外壳。

评论已关闭。

WordPress Appliance - Powered by TurnKey Linux