前言
在《基于“矿板”低成本学习FPGA》移植OpenC906第二篇-约束综合实现生成bit文件与IO扩展板设计一文中,我们成功移植了OpenC906 RISC-V核,接下来的工作就是对这个核心进行调试。
市面上虽然有各式各样的Link工具和基于FTDI芯片的JTAG仿真器都支持RISC-V核调试,但对于嵌入式开发者而言,我们往往渴望一把“瑞士军刀”级别的工具:它最好能同时支持仿真器功能(如JTAG或SWD接口),提供USB转串口功能,并且,如果能直接通过PC读写SPI接口的Flash或IIC接口的EEPROM就更好了。这意味着,除了仿真器和串口,我们还希望它集成SPI和IIC这两种极其常用的接口。
巧合的是,沁恒微电子恰好有一款名为CH347F的多功能接口芯片,完美契合了我们的需求。这里不得不说,沁恒的接口芯片产品线非常丰富,覆盖USB、以太网、PCIE等领域且迭代迅速,值得开发者们常去其官网逛逛。更重要的是,他们的设计往往深谙开发者痛点,这款CH347F就是如此,它简直是为嵌入式开发者量身定做的理想工具——一个设备搞定SPI、IIC、UART、JTAG,并且这些功能是同时工作,无需切换模式的!
因此,本文将分享如何基于CH347F芯片,设计并打造一款属于自己的、功能强大的嵌入式开发调试“瑞士军刀”。
CH347F介绍
相关的技术资料可以从官网获取:
详细规格请参考官方手册,这里我简要总结一下个人认为最突出的几个特点:
- 支持USB2.0高速模式。
- 集成两路独立UART,最高波特率可达9Mbps。
- 支持IIC(最高1MHz)和SPI(最高60MHz)主控制器。
- 支持JTAG/SWD接口,时钟频率最高30MHz。
- 外围电路极其简洁,仅需晶体和少量阻容元件。
- 芯片内置EEPROM,可配置VID、PID等USB参数。
- 单3.3V供电,其I/O电平可灵活支持3.3V、2.5V或1.8V。这一点非常实用,许多SoC的IO电压就是1.8V,无需额外电平转换电路。
其功能拓扑结构如下图所示:

我个人认为,这款芯片最核心的价值在于:上述的UART、IIC、SPI、JTAG/SWD功能是并发工作的,无需任何额外的模式切换操作,实现了真正的多功能合一。
硬件设计
在设计上,我们通过跳线将VIO引脚连接到1.8V或3.3V,以适应不同电平的目标板。板载接口包括:
- 2路独立UART(未复用Modem等不常用引脚,方便使用)
- 1路IIC接口
- 1路SPI接口(带两个片选信号CS)
- JTAG/SWD接口
- 3个独立的GPIO
原理图设计如下,展示了核心的电源、时钟、USB接口及各个功能引脚的连接:

PCB布局图和3D渲染图如下所示:


为了配合后续的FPGA调试(此部分与仿真器功能本身无关),我们还扩展引出了FPGA的IO引脚,相关原理图如下:

手工焊接完成后的实物照片如下:


OpenOCD适配
好消息是,新版本的OpenOCD主线代码已经原生支持CH347芯片了。驱动代码位于 src/jtag/drivers/ch347.c。
你可以参考文章《MCU上玩转Linux系列之二:基于OpenOCD的仿真环境搭建》来搭建环境,只需编译新版OpenOCD即可获得对CH347的支持。
针对CH347的配置文件(例如 ch347.cfg)可以这样设置,其中 speed 最大可设为30000(即30MHz),CPU相关的配置请根据你自己的目标平台调整。
adapter driver ch347
transport select jtag
adapter speed 30000
ch347 vid_pid 0x1A86 0x55DE
bindto 0.0.0.0
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5
gdb_port 3333
测试
UART测试
我们主要测试其最大标称波特率9Mbps。通过示波器测量波形,并进行TX/RX短接的回环测试,验证功能是否正常。
分别短接两路串口的TX和RX,在PC端设置波特率为9M(若设置值超过9M,芯片实际会限制在9M),然后进行数据收发。下图展示了用探针连接板卡进行测试的场景:

在串口调试助手中进行数据收发测试,一切正常:

通过示波器测量实际的波形周期,可以确认波特率设置准确无误:

JTAG测试
在使用CH347的JTAG功能前,需要使用 Zadig 工具为其安装 WinUSB 驱动。
请注意,在设备列表中选择 接口4 (Interface 4),并将其驱动改为 WinUSB。接口0和接口2对应的是两路UART。

对于Windows用户,还需要启用Telnet客户端功能:
打开“控制面板 -> 程序 -> 程序和功能 -> 启用或关闭Windows功能”,勾选“Telnet Client”。

在命令行中启动OpenOCD服务:
./openocd.exe -f ch347.cfg
启动成功后,会看到类似以下的输出,表明CH347已被识别并成功连接到了目标芯片(这里是RISC-V核):
$ ./openocd.exe -f ch347.cfg
Open On-Chip Debugger 0.12.0+dev-01373-gb9e401616-dirty (2026-01-28-04:56)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
DEPRECATED! use 'gdb port', not 'gdb_port'
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CH347 UART+SPI+I2C+JTAG from vendor wch.cn with serial number BC7111ABCD found. (Chip version=1. 1, Firmware=0x41)
Info : clock speed 30000 kHz
Info : JTAG tap: riscv.cpu tap/device found: 0x00000001 (mfg: 0x000 (<invalid>), part: 0x0000, ver: 0x0)
Info : [riscv.cpu0] datacount=1 progbufsize=16
Info : [riscv.cpu0] Examined RISC-V core
Info : [riscv.cpu0] XLEN=32, misa=0x40901124
Disabling watchdog...
Disabling watchdog, Done
Enable CPUs...
DEPRECATED! use 'read_memory' not 'mem2array'
Enable CPUS, Done
Info : [riscv.cpu0] Examination succeed
Info : [riscv.cpu0] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
测试Telnet连接
在另一个Windows终端中输入:
telnet localhost 4444
连接成功后,会显示 Open On-Chip Debugger > 提示符。我们可以输入以下命令来测试数据读取(dump)速度:
dump_image dump.bin 0x20000000 409600
执行后可以看到传输速率,大约在100KB/s左右。

测试GDB连接
启动GDB客户端(这里以RISC-V工具链为例):
riscv64-unknown-elf-gdb -f test.elf
在GDB界面中连接OpenOCD服务:
(gdb) target extended-remote 172.16.11.110:3333
然后加载程序,观察加载速度,大致在148KB/s左右。

最后,我们通过示波器来验证JTAG时钟(TCK)的频率。测量结果显示,TCK频率稳定在30MHz,与配置文件中 adapter speed 30000 的设置完全吻合。


总结
CH347F以其多功能并发工作、无需模式切换的特性,极大地提升了嵌入式开发的便利性。两路最高9Mbps的串口,彻底解决了USB转串口线不够用、速度慢的烦恼。同时内置的SPI和IIC主控制器,让开发者能在PC上直接读写Flash、EEPROM等外设,操作各种SPI、IIC器件变得异常轻松。
更重要的是,CH347F的应用电路非常简单,几乎没有外围器件。这为开发者DIY自己的终极调试工具提供了可能。自己动手画板、打样、焊接,成本可控且成就感十足。这样的“瑞士军刀”工具,完全可以多备上几个,从此再也不用担心找不到串口线或仿真器了。欢迎到云栈社区分享你的制作心得与更多创意应用。