项目总览

LogicAnalyzer 是由 gusmanb 开发的一个高性能开源逻辑分析仪项目,基于 Raspberry Pi Pico/Pico2 微控制器。该项目在 GitHub 上拥有 4,600+ Stars,是一个成熟且活跃的开源硬件项目。

核心参数:

  • 采样率:标准 100Msps,Pico2 可达 400Msps(Blast 模式)
  • 通道数:24 通道数字输入
  • 采样深度:最高 384KB(取决于通道配置)
  • 触发类型:边沿触发、复杂模式触发、快速模式触发
  • 协议支持:130+ Sigrok 兼容解码器
  • 平台支持:Windows、Linux、macOS、Raspberry Pi
  • 连接方式:USB CDC、WiFi(Pico W)、设备级联

1. 项目架构与技术栈

1.1 分层架构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
┌──────────────────────────────────────────────────────────────┐
│                     应用层 (Application)                      │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────────┐ │
│  │  LogicAnalyzer │  │ CLCapture      │  │ TerminalCapture   │ │
│  │  (GUI 应用)    │  │ (CLI 工具)     │  │ (终端捕获)        │ │
│  │  AvaloniaUI   │  │ .NET 6+       │  │ .NET 6+          │ │
│  └───────────────┘  └───────────────┘  └───────────────────┘ │
├──────────────────────────────────────────────────────────────┤
│                     协议层 (Protocol)                         │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ 130+ Sigrok 协议解码器 (Python)                          │ │
│  │ UART、I2C、SPI、USB、CAN、LIN、Modbus 等                 │ │
│  └─────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────┤
│                   通信层 (Communication)                      │
│       USB CDC Serial    │    TCP/IP (WiFi)   │   Daisy Chain │
├──────────────────────────────────────────────────────────────┤
│                     固件层 (Firmware)                         │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ RP2040/RP2350 固件 (C/C++)                              │ │
│  │ - PIO 状态机 (4x 采样控制)                              │ │
│  │ - DMA 环形缓冲区 (4x 通道)                              │ │
│  │ - 多核处理 (Core0:USB/TCP, Core1:WiFi)                 │ │
│  │ - 双缓冲数据传输                                       │ │
│  └─────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────┤
│                     硬件层 (Hardware)                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐   │
│  │ 主控板      │  │ 电平转换板   │  │ 扩展/级联接口        │   │
│  │ RP2040/2350│  │ TXU0104    │  │ 最多5台级联         │   │
│  └─────────────┘  └─────────────┘  └─────────────────────┘   │
└──────────────────────────────────────────────────────────────┘

1.2 技术栈矩阵

层级技术选型版本/说明
硬件设计KiCad7.0+
固件Pico SDK2.0+
固件语言C11/C++17ARM GCC
GUI 框架Avalonia UI11.x
GUI 语言C#.NET 6/7/8
解码器Python 33.8+
构建系统CMake3.13+
CI/CDGitHub Actions-

2. 硬件设计深度分析

2.1 核心设计决策

1. GPIO 全利用策略

1
2
3
4
5
6
7
// 24 通道 GPIO 映射
const uint8_t pinMap[] = {
    2,3,4,5,6,7,8,9,10,11,12,13,    // 12 通道
    14,15,16,17,18,19,20,21,22,     // 9 通道
    26,27,28                        // 3 通道 (模拟输入复用)
};
// GPIO0/1 保留用于触发信号
  • GPIO2-22: 22 个标准数字输入
  • GPIO26-28: 3 个模拟输入复用为数字输入
  • GPIO0: 复杂/快速触发输出
  • GPIO1: 复杂/快速触发输入

2. PIO (Programmable I/O) 程序设计

项目使用两个 PIO 状态机实现高速采样:

1
2
3
4
5
6
7
8
// PIO 程序汇编 (LogicAnalyzer.pio)
.program logic_analyzer

; 采样循环
loop:
    in pins, 24         ; 读取 24 个引脚状态
    push                ; 推送到 TX FIFO
    jmp loop            ; 无限循环

3. DMA 环形缓冲区架构

1
2
3
4
5
6
7
8
// 4 个 DMA 通道形成环形链
dma_channel_config c0, c1, c2, c3;

// 配置链式 DMA
channel_config_set_chain_to(&c0, dma_ch1);
channel_config_set_chain_to(&c1, dma_ch2);
channel_config_set_chain_to(&c2, dma_ch3);
channel_config_set_chain_to(&c3, dma_ch0);  // 闭环

2.2 电平转换设计

TXU0104 高速电平转换器:

  • 带宽:200MHz+
  • 传播延迟:< 5ns
  • 电压范围:1.65V - 5.5V
  • 方向控制:自动方向检测
1
2
3
4
输入侧 (DUT)          转换器              输出侧 (Pico)
   1.8V ────┐                      ┌──── 3.3V
   3.3V ────┼── TXU0104 ──────────┼──── 3.3V
   5.0V ────┘                      └──── 3.3V

3. 固件核心实现

3.1 采样引擎

三种采样模式:

模式通道数最大采样率采样深度特点
8 通道模式8100Msps131,071 样本最大深度
16 通道模式16100Msps65,535 样本平衡配置
24 通道模式24100Msps32,767 样本全通道
Blast 模式 (Pico2)8400Msps380K+ 样本超高速

PIO 采样实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
void start_capture(CAPTURE_REQUEST* req) {
    // 计算系统时钟分频
    float div = (float)clock_get_hz(clk_sys) / req->frequency;
    
    // 配置 PIO
    pio_sm_set_clkdiv(pio0, sm, div);
    pio_sm_init(pio0, sm, offset, &config);
    
    // 启动 DMA 链
    dma_channel_configure(dma_ch0, &c0, buffer0, &pio0->rxf[sm], count, true);
    
    // 启动 PIO 状态机
    pio_sm_set_enabled(pio0, sm, true);
}

3.2 触发机制

1. 简单触发 (Simple Trigger)

1
2
3
4
// 单边沿触发
if (pin_state != last_state && pin_state == trigger_level) {
    trigger_detected = true;
}

2. 复杂触发 (Complex Trigger)

1
2
3
4
5
6
7
// 最多 8 通道组合触发
uint8_t mask = req->triggerMask;      // 参与触发的通道
uint8_t pattern = req->triggerPattern; // 目标模式

if ((sample & mask) == pattern) {
    trigger_detected = true;
}

3. 快速触发 (Fast Trigger)

1
2
3
4
5
6
7
8
// PIO 实现的硬件级触发
.program fast_trigger
    in pins, 5          ; 读取 5 通道
    mov x, isr          ; 保存到 X
    and x, trigger_mask ; 应用掩码
    cmp x, trigger_pat  ; 比较模式
    jmp !equal, loop    ; 不匹配继续
    irq set 0           ; 触发中断

3.3 多核架构 (Pico W)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Core 0 (主核):
├── USB CDC 通信
├── TCP/IP 服务器
├── 协议解析
└── 数据采集控制

Core 1 (从核):
└── WiFi 处理 (CYW43)
    ├── WiFi 连接管理
    ├── 网络事件处理
    └── LED 控制

多核通信机制:

1
2
3
4
5
6
7
8
// 使用事件队列进行核间通信
EVENT_QUEUE frontendToWifi;
EVENT_QUEUE wifiToFrontend;

// Core0 发送事件到 Core1
EVENT_FROM_FRONTEND evt;
evt.event = SEND_DATA;
event_push(&frontendToWifi, &evt);

4. 软件架构分析

4.1 GUI 应用程序

技术栈:

  • 框架: Avalonia UI 11.x
  • 语言: C# 10/11
  • 运行时: .NET 6/7/8
  • 架构: MVVM (Model-View-ViewModel)

核心模块:

1
2
3
4
5
6
7
8
9
LogicAnalyzer/
├── MainWindow.axaml          # 主窗口
├── CaptureDialog.axaml       # 捕获配置对话框
├── SampleViewer.axaml        # 波形显示组件
├── ProtocolAnalyzer.axaml    # 协议分析器
└── Views/
    ├── ChannelSelector.axaml
    ├── TriggerSettings.axaml
    └── MeasurementTool.axaml

信号描述语言 (SDL):

1
2
3
4
// 示例 SDL 代码
clock CLK 10MHz
signal DATA 0x55 0xAA
signal RST 1 0 0 1

4.2 协议解码器架构

Sigrok 兼容解码器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# decoders/uart/pd.py
class Decoder(srd.Decoder):
    api_version = 3
    id = 'uart'
    name = 'UART'
    
    inputs = ['logic']
    outputs = ['uart']
    
    options = (
        {'id': 'baudrate', 'desc': 'Baud rate', 'default': 115200},
        {'id': 'data_bits', 'desc': 'Data bits', 'default': 8},
    )
    
    def decode(self, startsample, endsample, data):
        # 解码实现
        pass

支持协议:

  • 串口通信: UART、SPI、I2C、CAN、LIN
  • 存储: I2C EEPROM、SPI Flash、SD Card
  • 显示: HDMI (DDC)、VGA、LCD
  • 工业: Modbus、Profibus
  • 无线: IR、RF、Bluetooth
  • 总计: 130+ 种协议

4.3 CLI 工具

CLCapture - 命令行捕获工具:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 基本用法
CLCapture /dev/ttyACM0 100000000 1,2,3,4 512 1024 \
    TriggerType:Edge,Channel:5,Value:1 output.csv

# 参数说明
# $1: 串口设备
# $2: 采样率 (Hz)
# $3: 通道列表
# $4: 预触发样本数
# $5: 后触发样本数
# $6: 触发配置
# $7: 输出文件

5. AI Agent 集成可能性评估

5.1 现有接口能力

可用的自动化接口:

接口类型自动化友好度说明
CLCaptureCLI⭐⭐⭐⭐⭐完整的命令行控制
TerminalCaptureCLI⭐⭐⭐⭐⭐基于配置文件的捕获
CSV Export文件⭐⭐⭐⭐⭐标准数据格式
Sigrok/PulseView文件⭐⭐⭐⭐☆兼容专业工具
TCP/IP网络⭐⭐⭐⭐⭐支持远程控制

5.2 推荐的 AI Agent 集成方案

方案 1: Python API 封装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 建议的 AI Agent API 设计
class LogicAnalyzerAgent:
    def __init__(self, port='/dev/ttyACM0'):
        self.device = LogicAnalyzerDevice(port)
    
    def capture(self, channels, sample_rate, duration):
        """执行信号捕获"""
        pass
    
    def analyze_protocol(self, protocol_type):
        """自动协议分析"""
        pass
    
    def detect_anomalies(self, reference_pattern):
        """异常检测"""
        pass

方案 2: RESTful API 封装 (Pico W)

1
2
3
4
5
6
# WiFi 模式下的 HTTP API
@app.route('/api/capture', methods=['POST'])
def capture():
    config = request.json
    data = device.capture(config)
    return jsonify({'data': data})

5.3 自动化测试场景

1. 硬件自动化测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# AI Agent 测试脚本示例
async def test_i2c_communication():
    # 配置逻辑分析仪
    la = LogicAnalyzerAgent()
    await la.configure(channels=[0,1], rate=400000)
    
    # 触发捕获
    await la.trigger_on_pattern('START_CONDITION')
    
    # 分析结果
    result = await la.decode_protocol('i2c')
    
    # 验证预期
    assert result.address == 0x50
    assert result.data == [0x01, 0x02, 0x03]

2. 持续集成集成

1
2
3
4
5
6
7
# GitHub Actions 示例
- name: Signal Integrity Test
  run: |
    python -m logic_analyzer_agent \
      --board /dev/ttyACM0 \
      --test-case tests/signals/i2c_eeprom.yaml \
      --assert-protocol i2c

6. 代码质量与可维护性评估

6.1 代码组织

优点:

  • ✅ 清晰的模块化设计(固件/软件/硬件分离)
  • ✅ 一致的命名规范
  • ✅ 详细的注释和文档
  • ✅ 完善的错误处理

改进建议:

  • ⚠️ 部分代码文件较长(>2000行),建议进一步拆分
  • ⚠️ 固件和软件版本耦合度较高,可考虑松耦合设计
  • ⚠️ 协议解码器缺乏统一的测试框架

6.2 测试覆盖

组件测试类型覆盖度状态
固件单元测试❌ 缺失
固件集成测试⚠️ 手动
软件单元测试✅ 部分
硬件功能测试✅ 完整
协议解码器回归测试❌ 缺失

6.3 文档完整性

文档类型完整度质量
README⭐⭐⭐⭐⭐非常详细
Wiki⭐⭐⭐⭐⭐完整教程
代码注释⭐⭐⭐⭐☆良好
API 文档⭐⭐⭐☆☆需要改进
硬件文档⭐⭐⭐⭐⭐包含 Gerber/BOM

7. 总结与建议

7.1 项目亮点

  1. 硬件设计精良:充分利用 RP2040 的 PIO 和 DMA 能力
  2. 软件生态丰富:130+ 协议解码器,多平台支持
  3. 开源友好:完整的 KiCad 设计文件,易于 DIY
  4. 活跃维护:定期更新,社区活跃
  5. 价格合理:相比商用逻辑分析仪成本极低

7.2 AI Agent 集成建议

短期(1-3个月):

  • 开发 Python SDK 封装现有 CLI 工具
  • 添加自动化测试脚本示例
  • 完善 API 文档

中期(3-6个月):

  • 为 Pico W 开发 RESTful API
  • 实现协议自动识别功能
  • 添加机器学习辅助信号分析

长期(6个月+):

  • 开发 AI 驱动的异常检测系统
  • 实现自然语言控制的捕获配置
  • 构建云端信号数据库和分享平台

7.3 技术债务

  1. 固件测试:缺乏自动化测试框架
  2. 版本兼容性:固件和软件版本强耦合
  3. 错误处理:部分边界条件处理不够完善
  4. 性能优化:大数据量时 GUI 渲染可进一步优化

附录:资源链接


报告生成时间: 2025-02-05 分析师: Gemini (via OpenClaw)