0x00 前言

笔者在本系列文章的第一篇中,提出了几个目标,现在还剩下「设计 PCB 并打样验证」未实现。本文是 RP2040 学习笔记的完结篇,在本文中,我们将参考树莓派官方指引,设计 pcb 板。

目前,我们要在 Pico 上进行开发,则需要从 debug probe 引出 SWD 线和 UART 线,如下图所示。SWD 线暂且好说,但 UART 线容易接错端口。如果使用的不是 Pico H 而是 Pico,则需要连 6 条杜邦线(SWDIO、SWCLK、GND、串口 TX、串口 RX、串口 GND)。另外,我们需要通过两条 USB 线给 debug probe 和 Pico 供电。总而言之,线路比较复杂。

▲ 使用 debug probe 连接到 Pico WH 开发板

因此,本文来设计一套线路更简洁的开发板。具体而言:

  • debug 板通过 type c 接口连接到电脑,引出 5V 供电、3.3V 供电、SWD、串口;
  • 上述接口通过软排线连接到开发板,因此在常规开发时,开发板无需另接串口、SWD、电源线;
  • 开发板上提供 type c 接口,以便在部署时供电,另外提供 usb 相关功能(例如 MicroPython 所用的 usb 虚拟串口);
  • 开发板上提供 reset 按钮。

在动手画板子之前,我们先阅读树莓派文档,然后看看开源社区是如何为 RP2040 设计 PCB 的。

0x01 阅读手册

树莓派提供了《Hardware design with RP2040》手册,以指引 RP2040 PCB 设计。手册给出了一个最小系统板设计,以及一个带有 VGA、SD 卡、音频接口的设计。本文主要参考最小系统板。

RP2040 的 PCB 设计可以分为四个组件:电源、flash、晶振、IO。我们来观察手册中给出的参考设计。

电源

根据 datasheet,RP2040 需要以下几种电源:

  • IOVDD(digital IO supply)用于 IO,需要 1.8~3.3V。每个 IOVDD 引脚应该连接 100nF 去耦电容。
  • DVDD(digital core supply)是核心电压,需要 1.1V。每个 DVDD 引脚应该连接 100nF 去耦电容。
    RP2040 内置了降压电路,将 VREG_VIN 降压到 1.1V 输出至 VREG_VOUT 引脚。因此,我们无需从外部供应 1.1V 电压,只需给 VREG_VIN 提供 3.3V 电压、并将 VREG_VOUT 连接到 DVDD。
  • VREG_VIN 作用如上所述,它应该连接 1uF 电容。
  • USB_VDD 用于给 USB PHY 供能,需要 3.3V。它应该连接 100nF 去耦电容。
  • ADC_AVDD 用于给 ADC 供能,需要 1.8~3.3V。它应该连接 100nF 去耦电容。

综上所述,对于最小系统,只需把 VREG_VOUT 和 DVDD 直连起来,然后给其他的电源输入引脚提供 3.3V 电压。这 3.3V 电压可以从 usb 线输出的 5V 电压通过 LDO 降压获得。

现在来看最小系统板的设计。

最小系统板从 usb 引出 5V 的 VBUS,用 10uF 电容滤波,输出到 LDO 芯片,产生 3.3V 电压,输出的 3V3 也要连接 10uF 滤波电容。而 RP2040 芯片的 VREG_VOUT 连接到 DVDD,其余电源输入连接 3V3。注意 VREG_IN 和 VREG_VOUT 必须各连接 1uF 的滤波电容。

💡
由于 pcb 空间限制,pin 48 和 pin 49 共用了一个去耦电容。

flash

最小系统板选用 W25Q128JVS 作为 flash 芯片,与合宙的板子一致,应该是没有获得主线 openocd 支持的。电路如下:

最左侧即为 bootsel,在 Pico 板上是按钮,在这个板上是排针,用跳线帽可以接地。启动阶段,若 QSPI_SS 接地,则进入 usb 下载流程;否则正常启动。

💡
这里的 R2 电阻标注了 DNF(不焊接)。
RP2040 启动时会自动拉高 QSPI_SS 引脚,但有一小段时间中 QSPI_SS 的状态不好保证。R2 这个 10k 电阻是用来上拉 QSPI_SS 的,从而在这段不保证 QSPI_SS 的时间内也能正常工作。不过,实验发现,对于这个 flash,就算没有这个 R2 也没问题,所以可以不焊接。但针对其他 flash 芯片,焊接 R2 比较保险。

晶振

最小系统板的晶振电路设计如下:

有两种方式给 RP2040 提供时钟信号:要么给 XIN 引脚提供方波,要么在 XIN 和 XOUT 之间连接 12MHz 晶振。树莓派文档中推荐采用 ABM8-272-T3 晶振,使用 15pF 的匹配电容。我们自己的 PCB 设计可以沿用这套晶振电路。

IO

最后来讨论 IO 电路设计。首先,对于 usb 信号,最小系统板的设计如下:

这里给 D+、D- 信号串联了 27ohm 的电阻,以符合 usb 规范。另外,usb 信号线下方应当铺铜。

其他 GPIO 引出到排针:

至此,我们分析完了最小系统板的 PCB。

0x02 开源社区中的 RP2040 PCB 设计

下面看看其他开源 PCB 与官方最小系统板的区别。

树莓派 Pico

Pico 板的 PCB 是开源的,其供电设计与最小系统板很不一样,如下图:

它使用了 buck-boost 电路来输出 3V3,使得电源供应可以在 1.8V~5.5V 之间。我们的应用无需如此宽的电压范围,所以不必采用这种设计。

Pico 将 GPIO25 连接到了 LED,其间串联一个 470ohm 的限流电阻。ADC_AVDD 不是直连 3V3,其间串联了两个分压电阻。兼容 Pico 引脚设定的开发板大多沿用了这两个电阻。

其他组件与最小系统板无甚差别。

合宙 RP2040 开发板

笔者手头有几个购于 2023 年的合宙 RP2040 开发板,没想到现在价格翻了十倍(笑)。这个 PCB 也是开源的,我们来分析一下。

flash 芯片采用了 W25Q128JVS,用 R7 电阻上拉 QSPI_SS。另外,LDO 芯片选用 SGM2019。

💡
合宙开发板采用了 12pF 的晶振匹配电容,不过 BOM 单上没有写明晶振型号。肉眼观察,晶振上印着「LK12 7AL」,未查到相关数据。

微雪 RP2040-Zero 开发板

微雪电子的 Zero 开发板是开源的,面积非常小,边缘为邮票孔,但两面都有元件,不适宜作为模组焊接到其他 PCB 上。先来看供电:

微雪 Zero 开发板使用的 LDO 是 RT9013-33。另外,type c 接口这边,CC 线通过 5.1k 电阻接地,具体意义可以参考 USB 中文网的文章

flash 芯片选用与官方 Pico 板一致的 W25Q16JV,没有用电阻拉高 QSPI_SS 引脚。Zero 开发板提供了复位按钮,按下后 RUN 引脚接地,芯片复位。

💡
微雪 Zero 晶振型号也未知,肉眼观察到晶振上有「e.3E」字样,未查到资料。

微雪 RP2040-Tiny 开发板

Tiny 开发板比较接近笔者文章一开头提出的连接方式。Tiny 板上并没有 usb 插座,取而代之的是软排线端口。排线传递 usb 和 bootsel、run 信号,没有 swd 信号,有点遗憾。

除了 FPC 软排线之外,其他设计与 Zero 开发板基本一致。

微雪 RP2040-One 开发板

One 开发板的特色是可以直插电脑的 usb 端口,无需线缆。其 PCB 设计也是最简单的。

💡
仔细想想,这个设计似乎有点奇怪。在部署时,如果将它插到电源适配器上,则(物理上的)稳定性存疑;若用 usb 公对母线缆连接,则似乎并未得到什么好处。除此以外,由于锡手指氧化之后会阻断信号,这个 PCB 几乎只能采用沉金工艺制造,对于小批量 DIY 来说成本过高,不宜参考。

YuzukiCore Pico RP2040 核心板

我们最后看一份来自 DIY 玩家的方案:YuzukiCore 核心板。它被设计为 M.2 2230 的形状,以便作为模块插到其他 PCB 板上。先看 flash 和晶振电路:

YuzukiCore 采用的 flash 是 W25Q64JV,大小为 8MB。晶振是陶瓷晶振,据评论区所言,精度较低,建议换成石英晶振。其他设计与最小系统板相似。

0x03 设计开发板

我们已经看过了许多开发板,现在总结一下自己开发板的需求:

  • 提供 type c 母座
  • 提供 reset 按键
  • GP25 接到 led,同时提供 ws2812b(用 pico 未引出的引脚实现)
  • 采用 W25Q16JV 以提供最好的兼容性
  • 预留 swd 口以备不时之需
  • 为方便手焊,阻容采用 0603 封装,flash 采用 SOIC8 封装

现在便开始设计。首先考虑电源电路,我们通过 type c 接入 5V 电压,由 LDO 分压到 3.3V。LDO 选用与微雪一致的 RT9013,按照手册,VIN 和 VOUT 各接 1uF 电容即可。由此设计出电源输入:

💡
如果 CC1 和 CC2 不接地,则 type c 电源适配器用 c-c 线连接开发板时,可能不给电。

现在将 3.3V 电源连接到 RP2040 上。按照手册,VREG_IN 和 VREG_VOUT 连接 1uF 滤波电容,其余电源引脚连接 100nF 去耦电容。设计如下:

接下来考虑 flash 电路。W25Q16JV 系列 flash 有多种型号,封装不同,我们选择 SOIC8 封装的 W25Q16JVSSIQ。保险起见,我们用 10k 电阻上拉 QSPI_SS。

接下来是晶振电路。我们沿用最小系统板的 ABM8-272-T3 晶振,匹配电容 15pF。

最后是 IO 电路。我们要引出 GPIO、引出 SWD、提供 LED 和 WS2812B。

Pico 引出了 GP0~22、GP26~28,而 GP25 连接 LED。Pico W 的 GPIO 引出情况与之一致,不过 GP23~25 和 GP29 被用于连接无线 SoC。我们选择把 GP25 连接到 LED,GP24 连接到 WS2812B,按照 Pico 的方式引出 GPIO。

合影:

layout(画得比较难看,日后慢慢学习):

0x04 制造

笔者在嘉立创下单了 10 张 PCB,其中 5 张贴片(只贴 RP2040 和阻容),另外 5 张用于练习手焊。等待 PCB 制造的过程中,笔者也没闲着,在家苦练焊接技术:

虽然不甚完美,但至少 0402 的阻容能完全用刀头烙铁手焊了。上文设计的 PCB,其焊接难点在于 QFN 封装的 RP2040、12 个引脚的 type c 母座、晶振,焊接时可能需要使用热风枪。

下单之后几天收到 PCB,见下图:

▲ 左边为 SMT 订单,右边为 PCB 不贴片订单

笔者打算先用五张未贴片的 PCB 练习手焊技术,然后把贴了片的 PCB 补焊上晶振、type c 接口等组件。

💡
焊接过程中,笔者获得了 t123yh 的鼎力支持,在此致谢。

第一次尝试。t123yh 指导:给 RP2040 焊盘镀锡,中间的 EP 焊盘少上点,四周的 pin 焊盘多上点。笔者首先焊接连接器:用锡丝给 fpc 和 type c 焊盘镀锡,然后用热风枪 300 度加热,最后把塑料烧烂了。接着焊接 RP2040,不慎给 EP 焊盘上多了锡,最终未能归位,另外,风枪烧黑了 PCB 板。WS2812、flash 和晶振焊接正常。结果如下:

t123yh 指出,应当首先焊接 IC;塑料不宜被热风枪吹,而应当最后用烙铁焊接(fpc 座子可以用风枪从 PCB 背面吹)。因此,笔者在第二次尝试中做了如下改进:

  • 先焊接 RP2040;
  • 只给 EP 焊盘上微量锡;
  • 维修佬 CMOV-559TC-HF 助焊剂似乎挥发太快了,且被风枪烧成了黑色固体。本次改用维修佬 UV11 助焊剂。

第二次尝试。应用以上改进后,结果较好。首先是没有产生大量助焊剂烟雾;其次,肉眼未观察到 RP2040 的明显问题。如下图:

然而,虽然肉眼未见异常,使用万能表可以测出有一些电阻虚焊。修复之后,连接电脑,RP2040 未正常工作。

第三次尝试。考虑到现在已经有把握成功焊接 type c、晶振等元件,笔者决定本次在 SMT 板(已焊好 RP2040 和阻容)上焊接缺失的部件,以验证 PCB 设计的正确性。结果如下图。

▲ 左:SMT 板;右:焊接其余元件

上机测试一下。虽然虚拟 u 盘仍然不工作,但是我们能通过 swd 连接到 RP2040:

然而,还是出了一些问题。烧录程序之后,发现 bootloader 卡在 PLL 相关逻辑:

这大概是晶振未焊好引起的。因此,我们下次焊接的改进点是注意晶振。另外,发现了几个 PCB 设计的问题:

  • usb 的 DP、DM 信号忘记串联 27ohm 电阻了。这可能是 usb 不识别的原因。  
  • 大面积铺铜导致 GND 引脚升温慢,这个问题在用烙铁焊接时尤为明显。

第四次尝试。本次焊接仍然在 SMT 板的基础上进行,与第三次尝试的不同之处在于:晶振、flash 和 LDO 采用热风枪焊接。结果成功点亮。这是本文点亮的第一块开发板。

WS2812 也可用:

0:00
/

现在笔者确信自己可以成功焊接除 RP2040 和阻容以外的元件。其中晶振、flash 和 LDO 采用热风枪,其他元件用烙铁。接下来,尝试在裸 PCB 板上焊接全部元件。

第五次尝试。是次焊接中,笔者按 t123yh 的建议,用风枪焊接 0603 阻容,以避免虚焊。因此,焊接流程变为:

  1. 用风枪焊接 RP2040、晶振、LDO、阻容、flash。焊电阻之后立即测试。
  2. 手焊 type c、fpc 座、按钮、LED。

最终圆满成功:

五张 PCB 的合影留念:

0x05 PCB 设计改进

下次再设计 RP2040 电路时,需要考虑几个问题:

  • usb 信号需要串联匹配电阻
  • 改善 RP2040 附近的走线方式

事实上,第五次尝试中,RP2040 有两个相邻引脚短路,不过由于它们都是 3V3,故未产生后果。实物如下:

日后设计 PCB 时,元件引脚应该走直线引出。上图这样的连接方式会严重影响焊接。

0x06 再次设计 PCB

现在来解决 usb 不识别的问题,给 DP、DM 各串联 27ohm 电阻。另外,在开发板上搭载 ESP32-C3-WROOM-02 模块。

注意到该 ESP32 模块的峰值电流大约有 350mA,而 RP2040 本身需要 100mA,共计 450mA,接近 RT9013 能提供的 500mA 电流上限,故 LDO 改用意法半导体的 LD1117。LD1117 能提供 800mA 电流,且相较于 AMS1117,无需钽电容,只需在输入端并联 100nF、输出端并联 10uF 陶瓷电容。

用 kicad 设计,原理图如下:

layout:

swd、usb、ESP32 均正常运行: