找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2581

积分

0

好友

330

主题
发表于 昨天 06:14 | 查看: 2| 回复: 0

前言

《基于“矿板”低成本学习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介绍

相关的技术资料可以从官网获取:

详细规格请参考官方手册,这里我简要总结一下个人认为最突出的几个特点:

  1. 支持USB2.0高速模式。
  2. 集成两路独立UART,最高波特率可达9Mbps。
  3. 支持IIC(最高1MHz)和SPI(最高60MHz)主控制器。
  4. 支持JTAG/SWD接口,时钟频率最高30MHz。
  5. 外围电路极其简洁,仅需晶体和少量阻容元件。
  6. 芯片内置EEPROM,可配置VID、PID等USB参数。
  7. 单3.3V供电,其I/O电平可灵活支持3.3V、2.5V或1.8V。这一点非常实用,许多SoC的IO电压就是1.8V,无需额外电平转换电路。

其功能拓扑结构如下图所示:

CH347F多功能接口芯片系统架构图

我个人认为,这款芯片最核心的价值在于:上述的UART、IIC、SPI、JTAG/SWD功能是并发工作的,无需任何额外的模式切换操作,实现了真正的多功能合一。

硬件设计

在设计上,我们通过跳线将VIO引脚连接到1.8V或3.3V,以适应不同电平的目标板。板载接口包括:

  • 2路独立UART(未复用Modem等不常用引脚,方便使用)
  • 1路IIC接口
  • 1路SPI接口(带两个片选信号CS)
  • JTAG/SWD接口
  • 3个独立的GPIO

原理图设计如下,展示了核心的电源、时钟、USB接口及各个功能引脚的连接:

CH347F硬件设计原理图

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

CH347F调试工具PCB布局图

CH347F调试工具3D渲染图

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

FPGA IO扩展接口原理图

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

CH347F调试工具焊接完成实物图(正面)

手持CH347F调试工具实物图

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),然后进行数据收发。下图展示了用探针连接板卡进行测试的场景:

使用示波器探针测试CH347F UART引脚

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

串口调试助手9Mbps回环测试成功

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

示波器测量9Mbps UART信号波形

JTAG测试

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

使用Zadig为CH347的JTAG接口安装WinUSB驱动

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

在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左右。

OpenOCD通过Telnet执行dump_image命令测试速度

测试GDB连接
启动GDB客户端(这里以RISC-V工具链为例):

riscv64-unknown-elf-gdb -f test.elf

在GDB界面中连接OpenOCD服务:

(gdb) target extended-remote 172.16.11.110:3333

然后加载程序,观察加载速度,大致在148KB/s左右。

GDB连接OpenOCD并加载程序

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

示波器测量CH347F输出的JTAG TCK时钟信号(30MHz)

示波器光标测量TCK时钟周期

总结

CH347F以其多功能并发工作、无需模式切换的特性,极大地提升了嵌入式开发的便利性。两路最高9Mbps的串口,彻底解决了USB转串口线不够用、速度慢的烦恼。同时内置的SPI和IIC主控制器,让开发者能在PC上直接读写Flash、EEPROM等外设,操作各种SPI、IIC器件变得异常轻松。

更重要的是,CH347F的应用电路非常简单,几乎没有外围器件。这为开发者DIY自己的终极调试工具提供了可能。自己动手画板、打样、焊接,成本可控且成就感十足。这样的“瑞士军刀”工具,完全可以多备上几个,从此再也不用担心找不到串口线或仿真器了。欢迎到云栈社区分享你的制作心得与更多创意应用。




上一篇:Windows TCP粘包与断帧解析:Python二级缓冲区实现高速数据采集
下一篇:Triton编译器核心:从高级方言到GPU代码生成的完整流程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-5 03:12 , Processed in 0.282196 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

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