PulseView 与 Sigrok 固件
ESP32-S3 固件,把你的板子变成兼容 sigrok 和 PulseView 的 USB 逻辑分析仪。 不需要专用硬件——用你手边已有的 ESP32-S3 就行。
工作原理
ESP32-S3(SUMP 固件)
↓ USB 线(CDC 串口)
你的电脑
↓ PulseView(ols 驱动)
波形显示、131+ 协议解码器、导出
固件通过 USB CDC 实现 SUMP 协议。PulseView 用内置的 Openbench Logic Sniffer (ols) 驱动连接——和 Arduino SUMP 分析仪、原版 OLS FPGA 板用的是同一个驱动。不需要自定义 sigrok 驱动。
为什么选 ESP32-S3
ESP32-S3 是 ESP32 系列里最适合做这件事的。两个原因:
1. USB。 S3 既有 USB Serial/JTAG(固定功能串口)也有 USB-OTG
(TinyUSB 设备栈)。MVP 用 USB Serial/JTAG,在 Linux 上显示为
/dev/ttyACM*,Windows 上显示为 COM*。后续可以切到 USB-OTG
获得更高吞吐。
USB-OTG 和 USB Serial/JTAG 在 ESP32-S3 上共享一个 PHY。不能 同时用。切到 OTG 模式后,内置的 USB 刷写/调试通道就不能用了。
2. 采样硬件。 S3 有 dedic_gpio 外设——一个专用 GPIO 外设,
通过 Xtensa ee.get_gpio_in 指令在单个 CPU 周期内读取 8 个 GPIO。
配合固定在 core 1 上的紧密轮询循环,8 通道可达 10-80 MSa/s。
S3 还有带 GDMA 的 RMT 用于单通道高速路径。C3 和 C6 缺少这些——
它们只有单个 I2S 和固定功能 USB Serial/JTAG,不适合做通用
逻辑分析仪。
注意: ESP32-S3 的
LCD_CAM外设在 ESP-IDF API 层面(v5.3+) 只支持输出,没有文档化的摄像头/DVP 输入 API。固件用dedic_gpioCPU 轮询代替,更简单且轻松超过 10 MSa/s 目标。
C3 / C6 对比
| ESP32-S3 | ESP32-C3 | ESP32-C6 | |
|---|---|---|---|
| USB | Serial/JTAG + OTG | 仅 Serial/JTAG | 仅 Serial/JTAG |
| 并行采样 | dedic_gpio (8ch) + RMT/GDMA | 无 | 无 |
| I2S | 多个 | 1 个 | 1 个 |
| 结论 | 最适合做 LA | 有限——通道少、速度低 | 和 C3 一样 |
C3/C6 可以做简单的 SUMP 设备(1-2 通道低速),但别指望多通道 通用分析。
sigrok 是什么
sigrok 是一套开源信号分析栈,四层:
| 层 | 组件 | 做什么 |
|---|---|---|
| 硬件 | 你的设备 | 采集数字/模拟信号 |
| 驱动 + 固件 | libsigrok | 和硬件通信、上传固件、读取样本 |
| 协议解码 | libsigrokdecode | 把比特流解码成协议 |
| 前端 | PulseView 或 sigrok-cli | 显示波形、注释、导出 |
sigrok 支持 258+ 设备(逻辑分析仪、示波器、万用表、电源)。
固件侧从开源的 fx2lafw(给 Cypress FX2 设备用)到需要提取的
厂商固件都有。
SUMP 是什么
SUMP 是设备和主机之间的采集协议。是有限深度采集模型: 设备 arm、等触发、采集 pre/post-trigger 样本到本地缓冲区、然后 全部上传给主机。
这和 MCU 的工作方式一致——RAM 有限,所以采集固定数量的样本再发送。 不是连续流式协议。
PulseView 和 sigrok-cli 这样连接:
sigrok-cli --driver=ols:conn=/dev/ttyACM0
或在 PulseView 里:设备下拉框 → Openbench Logic Sniffer → 选串口。
协议解码器
sigrok 自带 131+ 协议解码器(Python 写的,跑在
libsigrokdecode 里)。可以堆叠——底层解码器的输出喂给上层。
常见解码链:
| 线 → | 基础解码器 → | 上层解码器 |
|---|---|---|
| SDA, SCL | I2C | 24xx EEPROM、EDID、HDCP |
| TX, RX | UART | Modbus RTU |
| TDI, TDO, TCK, TMS | JTAG | ARM ITM、EJTAG、STM32 |
| D+, D− | USB signalling | USB packet → USB request |
| CLK, MOSI, MISO, CS | SPI | SPI flash、SD 卡 |
还支持:CAN、I2S、1-Wire、WS2812、红外、FlexRay、USB PD、
S/PDIF 等。每个解码器是 libsigrokdecode/decoders/ 下的 Python
模块。你可以自己写。
固件架构
SUMP 固件分四层:
┌─────────────────────────────┐
│ transport │
│ 收发 SUMP 命令。 │
│ USB Serial/JTAG 或 CDC。 │
├─────────────────────────────┤
│ capture │
│ arm 采样器、等触发、 │
│ 采集到环形缓冲区。 │
│ 用 dedic_gpio (core 1)。 │
├─────────────────────────────┤
│ buffer │
│ SRAM 里的环形缓冲, │
│ 存 pre-trigger + │
│ post-trigger 样本。 │
├─────────────────────────────┤
│ upload │
│ 按 SUMP 规范打包样本 │
│ 通过 transport 发送。 │
└─────────────────────────────┘
capture 层是 ESP32-S3 硬件发挥作用的地方。dedic_gpio 外设
一个周期读 8 个 GPIO,配合 core 1 上的展开循环可达 10-80 MSa/s。
构建固件
sigrok 固件是一个 ESP-IDF 项目。通过 espctl 构建:
1. 让你的 AI 助手:"帮我构建 sigrok 固件,目标 esp32s3"
2. 或者用 MCP 控制台 esphome.cloud/mcp/esp-idf
3. 或者跑:espctl build <project> --target esp32s3
构建产物是项目 build/ 目录下的 flash_bundle.tar.gz。这个
烧录包里含 manifest.json 和 bootloader、分区表、应用三段二进制——
espctl flash 所需的一切都在一个文件里。没有单独的 fetch 步骤,
烧录包会和构建在同一会话里原子返回。
烧录
通过 USB 烧录固件:
- 从浏览器: 用 MCP 控制台或 浏览器向导的 Flash 标签。
- 从命令行:
espctl flash build/flash_bundle.tar.gz --port /dev/cu.usbmodem*
espctl flash 底层直接用纯 Rust 的
espflash 库——不依赖 Python
esptool.py。如果出问题,不要用 pip install esptool 绕过去,
而是按 docs/espctl-flash-bugs-YYYY-MM-DD.md 的格式提 bug,让真正
的故障得到修复。
烧录后,ESP32-S3 重新枚举为 USB CDC 设备。系统会看到一个新串口
(Linux 上 /dev/ttyACM0,Windows 上 COM3)。
双 USB 线布局。 在 ESP32-S3-DevKitC-1 上,“UART” 口(经板载 USB-UART 桥片)是烧录和串口监视走的通道。“USB” 口(原生 USB-OTG, 直接到 S3 的 USB 引脚)是 sigrok-cli / PulseView 用来读 SUMP 数据 的通道。要跑完整流程——烧录固件、看启动日志、用
sigrok-cli --scan识别设备——请两根线都插好。
连接 PulseView
- 打开 PulseView。
- 选驱动: 设备下拉框(左上角)→ Openbench Logic Sniffer → 选你的串口。
- 设置采样率和采样数量(工具栏)。
- 点运行(播放按钮)。
ESP32-S3 arm、采样、上传。PulseView 显示波形。
或者用命令行:
sigrok-cli --driver=ols:conn=/dev/ttyACM0 \
--config samplerate=1M \
--samples 1000 \
--output-file capture.sr
接线
把你要抓的信号接到 ESP32-S3 的 GPIO 引脚。ESP32-S3 和目标电路 之间接地线。
目标电路 ESP32-S3
──────── ────────
信号引脚 ─────────────→ GPIO 引脚(输入)
GND ─────────────→ GND
电压警告: ESP32-S3 GPIO 只耐受 3.3V。不要直接接 5V 信号—— 用电平转换器或分压电路。
协议解码操作
采集完成后:
- 点通道列表旁边的 +。
- 选一个解码器(UART、SPI、I2C……)。
- 把解码器通道映射到你的 GPIO 引脚。
- PulseView 解码并在波形上显示注释。
解码器可以堆叠:先加 I2C,然后在上面加 24xx EEPROM。EEPROM 解码器读取 I2C 解码器的输出,显示内存地址和数据值。
最适合
这个固件是协议分析工具,不是 Saleae/FX2/FPGA 的替代品。 最佳用途:
- 检查 UART 波特率和帧格式
- 验证 SPI 时钟极性和片选时序
- 调试 I2C 地址冲突
- 解码 1-Wire、WS2812、红外时序
- 快速“这个总线活着吗?“检查
局限性
- 采样率:
dedic_gpio8 通道 10-80 MSa/s,取决于循环展开 和速率限制设置。不是 FPGA 分析仪那种 100+ MHz。 - 缓冲深度: 受限于 ESP32-S3 SRAM(默认约 32 KB,最大 200 KB)。SUMP 是有限深度,不是流式。
- 只能输入。 抓信号——不发信号。
- 只支持 3.3V 逻辑,除非外加电平转换。
- USB PHY 共享。 用 USB-OTG 模式就失去内置的 USB Serial/JTAG 刷写/调试通道。
- macOS 连续采集问题。 macOS 内核 TTY 驱动在端口关闭/重新
打开时缓存 USB CDC 数据。这导致第二次
sigrok-cli采集失败 (“Invalid ID reply”)。临时方案:两次采集间重新上电。Linux 无此问题。