Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PulseView 与 Sigrok 固件

ESP32-S3 固件,把你的板子变成兼容 sigrokPulseView 的 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_gpio CPU 轮询代替,更简单且轻松超过 10 MSa/s 目标。

C3 / C6 对比

ESP32-S3ESP32-C3ESP32-C6
USBSerial/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, SCLI2C24xx EEPROM、EDID、HDCP
TX, RXUARTModbus RTU
TDI, TDO, TCK, TMSJTAGARM ITM、EJTAG、STM32
D+, D−USB signallingUSB packet → USB request
CLK, MOSI, MISO, CSSPISPI 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

  1. 打开 PulseView。
  2. 选驱动: 设备下拉框(左上角)→ Openbench Logic Sniffer → 选你的串口。
  3. 设置采样率采样数量(工具栏)。
  4. 点运行(播放按钮)。

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 信号—— 用电平转换器或分压电路。

协议解码操作

采集完成后:

  1. 点通道列表旁边的 +
  2. 选一个解码器(UART、SPI、I2C……)。
  3. 把解码器通道映射到你的 GPIO 引脚。
  4. PulseView 解码并在波形上显示注释。

解码器可以堆叠:先加 I2C,然后在上面加 24xx EEPROM。EEPROM 解码器读取 I2C 解码器的输出,显示内存地址和数据值。

最适合

这个固件是协议分析工具,不是 Saleae/FX2/FPGA 的替代品。 最佳用途:

  • 检查 UART 波特率和帧格式
  • 验证 SPI 时钟极性和片选时序
  • 调试 I2C 地址冲突
  • 解码 1-Wire、WS2812、红外时序
  • 快速“这个总线活着吗?“检查

局限性

  • 采样率: dedic_gpio 8 通道 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 无此问题。

另见