这是一个创建非常便宜的逻辑分析仪的项目,但其功能可与昂贵的商业分析仪相媲美。该分析仪可以以每秒 1 亿个样本的最高速度对多达 24 个通道进行采样,并且可以通过单个通道中的极性变化或多达 16 个通道形成的模式来触发。
该项目不仅包含硬件,还包含软件,它有一个多平台应用程序,可以可视化和分析信号。由于该设备非常独特,其协议与 Sigrok 等其他软件不兼容,但客户端还允许以兼容格式导出捕获的数据,其他程序可以读取该格式(甚至有一个 cmd 应用程序可以直接捕获到此如果您不想使用 GUI 应用程序,请格式化)。
该项目基于 Raspberry Pico,它支持其两个变体,即常规 Pico 和 Pico W,因此您甚至可以在没有物理连接到计算机的情况下使用该设备。
设计资料下载链接:逻辑分析仪24通道-100Msps硬件和软件设计资料
目录
所需硬件
准系统配置
分析板
变速板
逻辑分析仪固件
固件
构建设置文件
CMakeLists 文件
添加对不同板的支持。
主窗口
文件菜单
协议分析器菜单
网络设置菜单
连接到设备
网络设备
多设备设备
捕获
基本参数
频道
触发器
运行捕获
关于 Multidevice 设备的说明
分析协议
I2C分析仪
SPI分析仪
串口分析仪
编辑捕获
基本编辑
转移
测量
地区
创建样本
所需硬件
由于项目目标是创造尽可能便宜但有用的设备,我将最低要求保持在最低限度,最低限度到最简单的设备形式是......一个 Pico,没有别的,你可以对固件进行编程,将一些电线连接到它,就是这样,您就可以使用逻辑分析仪了。
这带来了一些限制,因为 Pico 只支持 3.3v IO,所以我设计了几个板,一个用于分析仪本身(主要是为了更容易连接/断开杜邦线并将其连接到辅助板)和一个电平转换器木板。
电平转换器板允许使用范围从 1.6v 到 5v 的电压,它默认参考 5v,但您可以重新配置它以接受外部参考电压。
此外,最新版本的分析仪板允许以菊花链方式连接分析仪,因此您最多可以链接其中的五个,并同时对多达 120 个通道进行采样,这是逻辑分析仪的大量通道。
准系统配置
要将 Pico(或其他基于 RP2040 的电路板,如 RP2040 Zero)用作逻辑分析仪,您需要短接触发引脚,这两个引脚保留用于快速和复杂的触发(有关固件和软件部分的更多信息)。
完成这些短路后,将 UF2 文件上传到板上,设备就可以使用了。
Pico 引出线是这样的:
和零引出线:
分析板
分析仪板包含非常少的组件:一个包含通道、接地、+3v3、+5v 和两个外部触发引脚的水平排针、两个用于菊花链分析仪的三针连接器(公头和母头)、一个电阻器、二极管和 Pico 本身。
外部触发引脚允许使用向设备请求的相同触发模式触发其他设备,如示波器,这仅适用于快速和复杂的触发,因为这些是使用 GPIO0/1 桥触发 PIO 机器的设备。
标头的引出线是这样的:
变速板
移位器板也很容易组装,它包含六个 TXU0104 电平转换器、一些去耦电容器、连接到逻辑分析仪和通道线的引脚/接头以及一个用于配置电压的跳线。
移位器分布在 PCB 的两侧以减小尺寸和走线长度(我尽量保持走线尽可能短以避免高频干扰,但这些也是长度匹配的以避免边缘情况下的不一致)但它们非常容易组装,我总是使用拖动方法手工焊接这些,但使用红外线烤箱焊接它们也应该没问题。
移位器的引脚排列与逻辑分析仪完全相同,除非您移除 5v 参考跳线,在这种情况下,5v 引脚成为外部参考电压源。
逻辑分析仪固件
固件
固件是使用标准 Pico SDK 和 Visual Studio Code 构建的。如果您想自己构建项目并且没有安装 SDK,我建议使用适用于 Windows 的 pico 安装程序,它使安装变得轻而易举,并为构建项目做好一切准备。对于其他操作系统,有不同的方法来设置 SDK,请参阅 Pico “入门”文档。
可以为不同的板构建固件,现在您可以使用 Pico、Pico W(带和不带 WiFi)和 RP2040 Zero。
要更改构建哪个文件,您需要修改两个文件:
构建设置文件
该文件包含选择哪个板将成为固件目标所需的定义:
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--color-fg-default)"><span style="background-color:var(--color-canvas-subtle)"><code>#define FIRMWARE_VERSION "4_5"
//Select the board type to build the firmware for
#define BUILD_PICO
//#define BUILD_PICO_W
//#define BUILD_PICO_W_WIFI
//#define BUILD_ZERO
</code></span></span></span></span>
根据需要取消注释目标板的定义。
如果你想知道为什么有人想在没有 WiFi 支持的情况下使用 W,很简单,为了减少设备的功耗,你可能想在没有连接到电源的笔记本电脑上使用它,在这种情况下,启用 WiFi 支持将浪费电能,这会减少电池的使用时间。
CMakeLists 文件
此文件包含项目构建过程的定义并指示包含哪些库。由于 W 功能基于外部模块,因此其使用需要包含一个库。
取决于你是否想在有或没有 WiFi 的情况下使用它,库是不同的(即使你不想启用 WiFi,你也需要包含一个库,因为 Pico 的 LED 通过此模块连接)并且它已配置在这个文件中。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--color-fg-default)"><span style="background-color:var(--color-canvas-subtle)"><code># Configure the correct cyw library based on what this is built for
# Regular pico: empty
# Pico W without WiFi support: pico_cyw43_arch_none
# Pico W with WiFi support: pico_cyw43_arch_lwip_poll
# set (CYW_LIB pico_cyw43_arch_lwip_poll)
# set (CYW_LIB pico_cyw43_arch_none)
</code></span></span></span></span>
如果您使用的是 W,请取消注释您需要的那个,否则请留下这些注释。
目前,唯一带有 CYW 模块的开发板是 Pico-W,但如果将来另一块开发板添加此模块,您将需要按照说明启用它。
添加对不同板的支持。
RP2040 已成为一种非常流行的微控制器,因此其他制造商已开始创建自己的电路板,每一种都具有不同的特性。
为了支持任何主板,固件已使用定义系统进行了修改,该系统简化了为其中任何一个配置它的任务。
定义新板的第一步是创建定义集。为此,您需要编辑电路板定义文件。
在那里添加一个新的#elif
名称#define
,您的板将使用,并在其中添加板的所有定义:
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--color-fg-default)"><span style="background-color:var(--color-canvas-subtle)"><code>This defines the name sent to the software
#define BOARD_NAME "PICO"
If defined the device supports complex, fast and external triggers. To support these kind of triggers two channels need to be
reserved and the first 16 channels need to be sequential.
#define SUPPORTS_COMPLEX_TRIGGER
Stablishes the channel base GPIO, this is the first GPIO that will be used as a channel.
This is not the GPIO mapped to channel 1 but the first GPIO used as an input channel.
#define INPUT_PIN_BASE 2
Complex/fast/ext trigger output pin (if enabled)
#define COMPLEX_TRIGGER_OUT_PIN 0
Complex/fast/ext trigger input pin (if enabled)
#define COMPLEX_TRIGGER_IN_PIN 1
If defined, the onboard led is a led connected to a GPIO
#define GPIO_LED
If defined, the onboard led is a led connected to a CYGW module (for the Pico W)
#define CYGW_LED
If defined, the onboard led is a RGB led connected to a GPIO
#define WS2812_LED
Defines the used GPIO used for the GPIO and WS2812 led types
#define LED_IO 25
If defined enables the Pico W WiFi module
#define USE_CYGW_WIFI
</code></span></span></span></span>
请记住,至少需要定义一种 LED 类型。
创建电路板定义后,您将需要添加通道映射。搜索这个:
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--color-fg-default)"><span style="background-color:var(--color-canvas-subtle)"><code>//Pin mapping, used to map the channels to the PIO program
#if defined (BUILD_PICO)
const uint8_t pinMap[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,27,28,COMPLEX_TRIGGER_IN_PIN};
#elif defined (BUILD_PICO_W)
const uint8_t pinMap[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,27,28,COMPLEX_TRIGGER_IN_PIN};
#elif defined (BUILD_PICO_W_WIFI)
const uint8_t pinMap[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,27,28,COMPLEX_TRIGGER_IN_PIN};
#elif defined (BUILD_ZERO)
const uint8_t pinMap[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,29,22,23,24,25,COMPLEX_TRIGGER_IN_PIN};
#endif
</code></span></span></span></span>
要添加映射,请#elif
使用您在板定义中使用的定义名称创建一个新条目。您必须映射所有通道,如果您的电路板没有暴露足够的引脚,只需重复您已经使用的通道之一,这可以防止软件出现问题,通道的数据将被重复而不会产生任何其他后果。
一旦您的电路板被定义,您就可以像任何其他电路板一样编译启用它的固件。
主窗口
让我们看一下软件的主窗口及其部分。
- 1:文件菜单,可以管理抓包文件。
- 2:协议分析器菜单,允许调用已安装的协议分析器。
- 3:网络设置,允许配置一个WiFi设备的网络设置。
- 4:刷新按钮,刷新可用COM端口列表。
- 5:端口选择器,选择要连接的设备。
- 6:打开/关闭设备按钮,连接或断开设备。
- 7:设备标识,显示连接到软件的设备类型。
- 8:重复捕捉按钮,重复上次相同参数的捕捉。
- 9:捕捉按钮,打开捕捉对话框。
- 10:中止按钮,取消正在运行的捕获。
- 11:频道查看器,显示捕获的频道信息。
- 12:样本查看器,显示捕获的样本。
- 13:样本查看器位置,滑动样本查看器。
- 14:Sample marker,显示显示哪些样本,用于对样本进行操作。
- 15:协议分析数据,这是协议分析器数据的显示方式。
- 16:样本查看器选择器,选择在屏幕上显示多少个样本。
- 17:Capture info,显示当前捕获是如何实现的信息。
一切都很简单,最基本的用法是连接到设备,点击“捕获”,配置捕获对话框并接受它,设备将开始捕获,一旦捕获完成,样本将显示在示例查看器。但当然,这是最基本的用法,该软件允许做更多的事情,所以我们将逐节探讨。
现在我们将查看应用程序的所有菜单,了解我们可以访问哪些功能,然后我们将了解如何使用设备的所有功能。
文件菜单
文件菜单允许管理捕获文件。LogicAnalyzer 允许您存储捕获以及有关捕获的所有信息,这对于共享或比较捕获非常有用,并且为了管理这些文件,我们使用“文件”菜单。
文件菜单有以下选项:
- 1:新建...,创建一个新的捕获文件。它是使用“信号描述语言”(从现在开始使用 SDL)创建的。
- 2:打开...,打开一个现有的捕获文件。
- 3:保存...,保存当前捕获,存储所有关于它的信息和创建的区域(更多信息在区域部分)。
- 4:导出...,将当前捕获的数据导出到与 PulseView 等其他程序兼容的 CSV 文件。
- 5:退出,关闭应用程序。
协议分析器菜单
协议分析器菜单允许调用协议分析器或清除示例查看器中的覆盖信息。请记住,此菜单是动态的,它将显示安装在“analyzers”文件夹中的分析器,您可以创建自己的分析器(有关创建自定义分析器部分的更多信息),它们将显示在此处。此外,此菜单可能会更改其顺序,因为它是根据找到文件的顺序填充的。现在让我们看看默认预装的那些。
- 1:I2C,允许分析I2C协议。
- 2:SPI,允许分析SPI协议。
- 3:串口:允许分析RS-232协议
- 4:清除分析数据:清除协议分析仪覆盖在样本查看器上的所有数据。
网络设置菜单
此菜单只有一个选项,“更新网络设置”,并且只有在软件通过 USB 连接到 Pico-W 分析仪时才会启用。顾名思义,它会更新设备的网络设置。
连接到设备
通过 USB 连接到单个设备非常简单,只需从下拉列表中选择设备并按“打开”即可。
但是还有另外两种设备类型,“网络”设备和“多设备”设备。
网络设备
这用于通过 WiFi 连接到 Pico-W。一旦我们选择它并按“打开”,这将向我们展示网络设置对话框。
这个对话框非常简单,我们介绍设备的 IP 地址(我们必须在使用网络设置菜单之前配置它)、端口,然后我们按“接受”,如果设备可用,它将连接。
多设备设备
这用于连接最多五个以菊花链连接的设备,第一个设备将充当主设备,负责检测触发条件(只允许复杂和快速的触发) , 其他四个将充当从机,并在主机检测到触发后进行捕获。
首先,我们必须选择主设备,然后启用我们在菊花链中连接的尽可能多的设备并配置它们的设置。如果我们选择网络设备,我们将看到网络设置对话框,引入的设置将显示在设备下拉菜单的旁边。
设置好所有设备后,我们可以按“接受”,如果一切正常,我们将看到设备显示为“MULTI_ANALYZER_(version)”。请注意,所有设备必须共享相同的设备版本,如果您在设备中编程了不同的版本,驱动程序将拒绝将它们连接为多设备链。
捕获
现在我们已经熟悉了连接过程,让我们开始真正的交易,捕获。
一旦我们按下“捕获”按钮,我们将看到“捕获”对话框。
基本参数
在对话框的第一行,我们将看到捕获的基本参数:频率(每秒样本数)、触发前样本和触发后样本。
频率选择器允许我们选择每秒捕获的样本数量,范围从 3100 (3.1Khz) 到 100000000 (100Mhz)。
接下来,我们将在触发发生之前存储大量样本,这对于在满足触发条件之前验证通道状态非常有用。
最后,我们有大量的样本将在触发发生后存储,这将是我们捕获的主要数据。
我们可以捕获的样本数量将取决于我们捕获的数量和通道。这些限制是:
- 最多通道 8(模式 0)
- 最少 2 个预触发样本
- 最多 98303 个预触发样本
- 最少 512 个后触发样本
- 最多 131069 个后触发样本
- 最多通道 16(模式 1)
- 最少 2 个预触发样本
- 最多 49151 个预触发样本
- 最少 512 个后触发样本
- 最多 65533 个后触发样本
- 最多通道 24(模式 2)
- 最少 2 个预触发样本
- 最多 24576 个预触发样本
- 最少 512 个后触发样本
- 最多 32765 个后触发样本
此规则同样适用于多设备,但考虑到使用最高通道的设备,例如,如果我们有两个设备,我们有 48 个可用通道,通道 1 到 24 是第一个设备通道,通道 25 到 48 是第二个设备通道,范围从 1 到 24。例如,如果我们选择通道 1 和通道 48,我们将使用第一个设备的通道 1 和第二个设备的通道 24,因此选择的捕获模式将是模式 2。
频道
接下来我们有频道选择器,这允许我们选择我们想要捕获的频道。您可以随机选择要使用的通道,但请记住模式选择所应用的规则。除了为捕获启用通道外,我们还可以命名通道,这将在通道编号后显示在通道查看器中,并且还将存储在保存的任何捕获文件中(这对于记住哪个信号是哪个信号非常有用,如果我们存储捕获以供以后分析)。
触发器
最后我们有触发器选择器。它分为两个不同的部分,边缘触发部分和模式触发部分。
边沿触发是最简单但最快的,它会在通道取高值或低值时触发。如果我们选择“边缘”单选按钮,我们将能够选择 24 个通道之一作为触发通道,我们也可以选择边缘是正的还是负的(高或低)。请注意,如果我们使用多设备,则此触发模式将不可用,这仅适用于模式触发器。
模式触发要复杂得多,我们最多可以使用 16 个通道而不是单个通道,当所有指定的通道形成一个具体的模式时它就会满足,但这也比边沿触发慢并且有一些限制。首先,我们必须指定基本通道,这是用于模式的第一个通道。它的范围可以从通道 1 到通道 16,并且模式不能超过通道 16,因此如果我们使用通道 8 作为基本通道,我们有 9 个通道可用于模式,如果我们选择通道 2,我们有 15 个通道可用于模式, ETC。
我们还可以指定“快速”模式,这种模式限制更多但也更精确,模式最多只允许五个通道,但触发器将以 100Mhz 运行。如果我们不选择快速模式,触发器将以大约 66Mhz 的频率运行,因此请记住这一点。这应该不是问题,除非触发条件持续的时间少于一个周期,因为我们可以选择在触发之前和之后捕获多少样本,我们可以以一种我们可以确保不会安全的方式设置它不错过任何重要数据。这也是驱动本身补偿的,所以通常无论我们选择哪一个都会有大约+-1 sample的误差。
模式触发器具有这些限制,因为它使用 pico 的辅助 PIO 单元来检查触发模式,而边沿触发器使用相同的程序来捕获和检测触发器。这就是为什么我们还必须将 GPIO0 和 GPIO1 捆绑在一起,触发程序通知捕获程序上升 GPIO0 的触发条件,捕获程序使用 GPIO1 读取它。
运行捕获
一旦我们设置了所有参数,我们就可以开始捕获了。按“接受”,捕获对话框将关闭,设备将开始闪烁,等待触发条件得到满足。如果出于某种原因我们想要取消捕获,“中止”按钮将被启用并停止捕获。
捕获完成后,样本将显示在屏幕上,样本查看器将跳转到触发发生的位置,并将调整屏幕上显示的样本数量。
关于 Multidevice 设备的说明
由于链中的每个设备都运行自己的时钟,因此它们之间可能存在一点偏差,该偏差可能为 +-1 个样本,因此请将其考虑在内。捕获完成后,您始终可以修复此偏差,使用Shift功能正确对齐它们。
分析协议
正如我们所见,该程序默认包括三个协议分析器:I2C、SPI 和串行。一旦我们加载了一个捕获,我们就可以根据需要运行其中的多个,我们可以运行相同的分析器或多个不同的分析器来捕获一个捕获并且信息将被合并,这允许每个示例一次捕获三个 SPI 设备并分析它们在同一个捕获中,或者分析一个 SPI 设备和一个串行设备,等等。
I2C分析仪
如果我们选择 I2C 分析器,我们将看到配置对话框。
要使用分析仪,您需要指定哪个通道是 SDC 通道和 SDA 通道(时钟和数据)。该对话框看起来有点奇怪,但这是有原因的,所有协议分析器都是使用通用接口实现的,如果您想知道它们是如何实现的。
一旦我们选择了两个通道,分析器就会运行并向我们显示有关捕获的信息。
分析器将显示开始和停止条件、操作请求、地址,并将在每个字节中包含它是否被确认以及是否发生帧错误。条件将显示在“<”和“>”之间,“A”表示“已确认”,“N”表示“未确认”,“F”表示“帧错误”。
SPI分析仪
选择 SPI 分析器将打开 SPI 分析器对话框。
请注意此对话框现在如何适应得更好,并注意右侧出现了一个滚动条,这是因为所有设置都不适合对话框。
要配置分析仪,我们必须提供:CS、CK、MISO 和 MOSI 通道、移位方向(LSB 到 MSB 或 MSB 到 LSB)CPOL(极性)和 CPHA(采样边沿)。CS、MISO 和 MOSI 通道是可选的,如果未指定 CS 通道,则分析仪假定始终选择该设备,对于 MISO 和 MOSI 也是如此,如果未提供其中之一,则不会处理(至少其中之一必须选择 IO 通道)。CK 通道是必需的。
一旦我们选择了参数,分析器就会向我们显示有关捕获的数据。
SPI 协议实际上是已实现协议中最简单(但最安全)的,它是完全同步的,主从数据有不同的线路,因此它仅提供有关已读取数据的信息。
串口分析仪
选择串行分析器将打开串行分析器对话框。
要配置分析仪,我们必须提供:RX 和 TX 通道、极性(真正的 RS-232 物理层使用负极性,但现在更常见的是使用正极性的 TTL 物理层)、数据位、奇偶校验、停止位和波特。RX 和 TX 是可选的,但至少必须提供一个,其余所有参数都是必需的。
在继续之前,我必须指出,除非捕获没有正确完成,否则您将遇到帧错误。RS-232 是异步的,所以没有时钟信号,因为分析仪会尝试根据采样频率和指定的波特率计算时钟,但如果您不捕获传输波特率的倍数,则很有可能帧错误将被检测到,因为它会读取一些超出帧位置的位。
输入所有参数后,将显示分析数据。
分析器将显示分析的数据,如果发现任何帧错误,它也会在数据包中显示为“F”。
编辑捕获
有时编辑捕获、删除无用样本、插入缺失数据、重复样本等会很有用。为此,我们将使用样本标记中的上下文对话框。
基本编辑
首先我们有插入选项,这将允许在我们点击的地方插入一些样本。这将打开创建示例对话框,这允许使用 SDL 语言创建示例(更多内容在创建示例部分)。
接下来我们有常规的编辑选项:剪切、复制、粘贴和删除。要使用剪切、复制和删除功能,首先我们必须在样本标记中选择一个范围,您可以在样本标记上单击鼠标左键并拖动,或者您可以放置临时标记(左键单击样本标记),转到您所在的位置想要结束选择并使用 Ctrl+左键单击来创建一个范围(您也可以在单击机智 Ctrl+左键后拖动)。要粘贴一组样本,您必须先剪切或复制一系列样本。
转移
下一个编辑操作是 Shift,这将移动一些通道的大量样本。
移动将发生在我们单击以调出上下文菜单的示例中,我们可以根据需要移动任意数量的频道。要从列表中选择/取消选择一个通道,您可以单击它,或者您可以按住 Ctrl 并单击并拖动以同时反转多个通道的选择状态。
我们还可以选择向左或向右移动,以及将在移动后的样本中插入的内容:低值、高值或旋转样本。
测量
这不是编辑功能,但它包含在同一菜单中,因为它需要选择一系列样本。如果我们选择“Measure”选项,Measure 对话框将弹出有用的信息,例如所选样本的数量、样本的持续时间、频率等。
地区
最后我们有区域功能。有时突出显示样本区域很有用,也许您想与某人共享捕获并显示哪个区域很重要,或者您可能想保存文件以备后用并指出一些重要区域捕获。
为此,我们可以创建一个区域,为此我们首先需要选择一系列样本,打开上下文菜单,然后选择“创建区域”。这将带来区域对话框。
要创建一个区域,我们可以给它起一个名字并选择一种颜色。一旦我们选择了参数,该区域将显示在示例查看器中。
如果我们想删除一个区域,右键单击该区域上方的样本标记,将启用“删除区域”菜单,单击它,它将被删除。
如果我们编辑样本,区域将被调整,如果我们删除属于一个区域的样本,该区域将被缩短,如果我们插入该区域将被扩展,如果该区域的所有样本都被删除,该区域也将被删除。
创建样本
LogicAnalyzer 结合了一种创建样本的强大方法,即 SDL 语言。这允许以一种简单的方式从头开始修补和创建捕获文件。该程序甚至包含一个用于 SDL 语言的语法着色编辑器,这使得创建这些文件变得非常容易。
但为什么?为什么创建这些样本如此重要?好吧,这确实与将来添加的新功能有关,即重播捕获文件的可能性。
看看它的实际效果。
这里我们有三个不同的部分:
- Ammount 选择器,指定我们要创建多少个样本,仅在“插入”模式下可用。
- 频道信息,这里我们可以看到频道号和名称
- 信号查看器,这是已生成信号的表示
要生成信号,我们单击通道的信号查看器,这将带来信号合成器,如果我们已经为通道加载或创建 SDL,它将自动加载。