当前位置: 首页 > 工具软件 > Sigrok > 使用案例 >

sigrok指南

东方和惬
2023-12-01

sigrok指南

这是基于sigrok的DSView相关的编译指南


1.关于sigrok

sigrok是一个可移植,跨平台,免费开源自由的信号分析软件套件。
其功能包括:
广泛的硬件支持: 支持来自不同供应商的许多不同设备(逻辑分析仪,示波器,万用表,数据记录器等)。
跨平台: 适用于Linux,Mac OS X,Windows,FreeBSD,OpenBSD,NetBSD,Android(以及x86,ARM,Sparc,PowerPC等)。
可编写脚本的协议解码: 可扩展使用Python 3编写的可堆叠协议解码器。
文件格式支持: 支持各种输入/输出文件格式(二进制,ASCII,十六进制,CSV,gnuplot,VCD,WAV,…)。
可重用的库: 由libsigrok和libsigrokdecode共享库组成,可供各种前端/ GUI使用。
各种前端: PulseView(LA GUI),sigrok-meter(DMM GUI),sigrok-cli(命令行)和其他前端都建立在上述库之上。

2. 关于sigrok和DSview及安装

DSview是基于sigrok开发的第三方的解码器应用,配合逻辑分析仪使用。
sigrok是集成解码器和解码协议的信号分析软件。官方其实也自带了一个解码UI界面pulseview。

安装过程参见sigrok和DSview安装指南


2.libsigrokdecode

1. 介绍

libsigrokdecode位于./sigrok(./DSview-0.99)下的是用C编写的共享库,它提供(流)协议解码的功能,其中包含解码器及解码协议(相关的协议解码器采用Python3编写)。

本次主要通过修改此文件内容来设计我们的解码协议。

该章节主要介绍所有的相关的函数等,若想快速上手,建议直接跳转到DSview的spi参考程序解析结合该章节观看(毕竟有许多常量可能用不上)

2.协议解码器重要的成员函数

协议解码器类函数class Decoder(srd.Decoder):主要有以下几个重要成员构成:

__init__(self):初始化各类参数,例如CLK,CS等等

start(self):在解码开始之前调用此函数。这是register()输出类型的位置,检查用户提供的PD选项的有效性,等等。

decode(self, ss, es, logic):这是一个由libsigrokdecode后端调用的函数,讲logic的数据进行处理。

关于解码:
逻辑分析仪通过logic会输出采样编号和各个引脚高低电平的信息,采样顺序根据channeloptional_channels的顺序排序,例如:
设置如下的Decoder的metadata

    channels = (
        {'id': 'clk', 'name': 'CLK', 'desc': 'Clock'},
    )
    optional_channels = (
        
        {'id': 'miso', 'name': 'MISO', 'desc': 'Master in, slave out'},
        {'id': 'mosi', 'name': 'MOSI', 'desc': 'Master out, slave in'},  
         {'id': 'cs', 'name': 'CS#', 'desc': 'Chip-select'},  
    )

则logic接收的元组信息为:

samplenum第一组数据第二组数据
bit01101010
channelclkmisomosicsclkmisomosics

所以我们接收的数据只有samplenum和bit两部分的数据,而bit为何值,对应的我们channeloptional_channels定义的顺序。但是clk和cs必须分别放前面和后面。具体原因后续会专门解释。

了解完这些后,其实只剩下解码逻辑,以下面的SPI协议解码器程序会对这部分逻辑进行一个详细解析。

3.协议解码器(PD)

以下是协议解码器的API
提供了一个名为sigrokdecode的Python模块。每个协议解码器都必须导入它。它包含以下项目:

OUTPUT_ANN

用于注册注释(annotations)输出的常量,用作register()函数的参数。sigrok-cli显示解码器堆栈最顶层解码器的注释输出(默认情况下),PulseView将注释输出显示为图形框或圆圈(如果注释的持续时间为零)。

OUTPUT_PYTHON

用于注册Python输出的常量,用作register()函数的参数。Python输出作为输入传递给堆叠到当前解码器上的解码器。给予put()函数的数据格式特定于某个PD,应该记录给更高级别解码器的作者,例如在解码器源文件的顶部有注释。

OUTPUT_BINARY

用于注册二进制输出的常量,用作register()函数的参数。未指定输出数据的格式,由解码器的作者选择一种(或多种)适当的格式。

OUTPUT_META

用于注册元数据(metadata)输出的常量,用作register()函数的参数。输出元数据的PD的示例是SPI解码器,其使用它来输出检测到的比特率。

×××××××××××××××××××××××施工中!!!!!!×××××××××××××××××××××××××


3 协议解码器程序(以spi为例)

详细代码介绍参见DSview的spi参考程序解析


注意事项

关于原版sigrok移植到DSView的问题

需提前注意的是:原版所定义的wait()功能并没有实现,所需要客户去写,pulseView中已经对该wait()方法进行实现,而DSView中未实现相关的功能。所以在DSView中才用循环读取logic值,提取每个采样点的电平值。
所以,在使用原版的sigrok移植到DSview上时,应该把相关类的方法和定义添加到对应的Decoder.c和libsigrokdecode.h等文件中

class Decoder(srd.Decoder):中,应将api_version = 3改写为api_version = 2。这样才可被DSview识别。

同时需要将文件属性改为可读可写可操作,即
chmod 777 __init__.py pd.py

 类似资料: