65.9K
CodeProject 正在变化。 阅读更多。
Home

从数字示波器解码串行总线

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (11投票s)

2017年6月20日

MIT

8分钟阅读

viewsIcon

16801

从数字示波器解码串行总线

引言

在过去,数字示波器是一种高端工具;尽管对于业余爱好者来说,专业设备仍然价格高昂,但近年来设备成本有所下降,使得更多人能够拥有这些仪器。

在当今的微控制器和物联网世界中,调试RS232、SPI和TWI (I2C) 等低速串行总线并不少见。业余爱好者和专业人士需要根据协议手动解码每个比特。这在调试初期,需要检查新设计的电气完整性时是很自然的,但如果你需要专注于协议,就会变得乏味。为这些示波器购买解码模块会增加成本,而且很多时候对于一次性项目来说不是一个选择。

这类仪器的优点是它们通常提供串行、以太网或USB连接。除了任何基于网络的控制之外,你通常可以选择通过SCPI接口对仪器进行编程。只要你安装了相关的VISA库/驱动程序,如National Instruments NIVISA或Tektronix TekVISA(请参阅下面的链接),你就可以使用任何你想要的语言来访问仪器。

对于不熟悉SCPI(可编程仪器标准命令)的人来说,它是一种用于访问仪器的标准协议,最初基于IEEE-488连接。后来,随着更多仪器使用串行或以太网连接,所需的GPIB卡变得过时,使事情变得更容易、更直接。可用的指令大多是通用的,但每种仪器都可以通过任何必要的扩展来补充这些指令,以支持其特有的功能。

SCPI命令示例

*IDN?
ACQUIRE:STATE STOP

过去我曾用C/C++以这种方式编程过许多仪器,但在转向Python之后,我忘记了主机上的任何其他语言。脚本语言提供了一个简单的过程,特别是对于字符串操作等。因此,我编写了一个Python脚本来从示波器捕获信号并对其进行解码。

总而言之,要访问连接仪器的SCPI端口,你需要以下内容:

  1. Python解释器(代码是用2.7版本编写的)(https://pythonlang.cn/downloads/)
  2. TekVISA/NIVISA(或任何其他相应的VISA库)软件包 (https://www.ni.com/visa/, http://uk.tek.com/oscilloscope/tds7054-software)
  3. PyVISA模块 (https://pyvisa.readthedocs.io/en/stable/)
  4. 捕获/解码Python脚本

现在在Windows下,你可以使用可执行文件,它是一个编译后的Python脚本(使用GUI2Exe)。在这种情况下,你只需要VISA安装和工具本身(无需python+pyvisa,因为它们已包含在编译程序中)。

工作原理

该工具将示波器的信号捕获到CSV文件中。由于我使用的是泰克旧款TDS3012B DPO,我只有2个可用通道进行捕获。这对于捕获RS232或TWI信号来说已经足够,但对于SPI,你可能需要多次运行来捕获2条数据线和CS以及时钟,最终你需要在每次运行时更换探头,但这总比没有好。

具有更多通道的示波器当然可以捕获更多信号并避免此问题。该脚本是在此特定示波器上制作和测试的,但它应该适用于大多数其他仪器,可能需要稍作修改。如果你需要捕获更多通道,那么你仍然需要修改脚本以将额外通道保存到CSV中,并且还要将额外的轨迹添加到SPI解码模块中进行解码。但这正是我们拥有开源的原因,不是吗?

请记住,脚本从CSV文件解码(而不是直接从仪器解码)。因此,如果你有旧的(或测试)捕获,你可以指示它使用这些文件而不是访问仪器。这有助于离线解码或测试脚本。

信号捕获后,脚本根据设置的逻辑标准(如TTL、CMOS、LVCMOS等)执行阈值处理。

然后,它根据请求的协议解码信号,并在屏幕上显示解码后的输出。

为了保持脚本的简单性,我们手动设置示波器以完整捕获信号(包括所需的时间范围、采样等),然后让它运行。触发应设置为正常模式(而不是自动)。当我们需要捕获波形时,我们可以运行脚本来停止采集,或者我们可以手动停止并仍然使用脚本来采集和解码信号。

让我们看一些例子。

RS-232解码

运行命令

DSOCapture.py -b RS232 -l TTL -a 115200 -i CaptureRS422_LVCMOS.csv -n 0

我们解码一个已将数据捕获到文件的文件。

我们需要定义波特率、电压电平和极性(正或反)。

RS232命令行捕获示例

解码器显示结果字符以及启动-停止和奇偶校验位。此外,还导出一个VCD文件,我们可以使用GTKWave进行查看。

RS232波形捕获示例

TWI解码

在TWI模式下,参数更简单,因为TWI是时钟同步的,所以我们不需要为每个字符定义采样周期。

DSOCapture.py -v -b I2C -i CaptureI2C.csv

TWI命令行捕获示例

同样,结果显示在命令行中,显示启动-ACK-停止条件。
此外,VCD文件提供了图形视图。

TWI波形捕获示例

TWI波形捕获示例细节

SPI解码

在此示例中,我们从仪器获取信号(这是更常见的方式)。每次采集都会存储包含数据的*.csv文件,如果你需要的话。但是,你需要复制它,因为下一次采集会覆盖它。

DSOCapture.py -v -b SPI -t 3 -visa -i TCPIP::192.168.2.226::INSTR -f capture.csv

SPI命令行捕获示例

SPI波形捕获示例

开发方法论

有趣的是,我使用了TDD(测试驱动开发)方法来创建这个脚本。为了帮助我完成这个过程,我使用了pytddmon.py脚本。因此,在开发时,你只需要在脚本所在的目录中打开一个命令提示符或shell,然后运行pytddmon.py(它应该在同一目录中)。请参见下面的图片。

PyTDDmon视图

Python测试代码

你可以从这里下载pytddmon。或者你可以使用

pip install pytddmon

接下来是我为每个模块创建了测试用例。最初,我使用了在示波器上捕获的真实数据,或使用了类似的值来测试各种情况。例如,对输入流进行阈值处理比简单地比较并输出逻辑值更具挑战性。当你经过0-1或1-0的过渡阶段时,某些值可能会在每个边缘触发多次过渡。在这种情况下,你需要执行滞后(链接)以避免这种情况(就像电子设备一样)。

信号被解释为逻辑电平(或边缘,因为TWI使用边缘)后,阈值输出将传递给相应的串行总线分析仪。

限制

脚本运行良好,但主要由于硬件(数字示波器)的限制值得一提。

RS232

RS-232的问题在于它是一种异步传输。更确切地说,没有时钟传输或从数据中导出。假设接收器在一定范围内具有相似的时钟来捕获和解码传输。

如果你需要捕获长时间的字节流,而示波器没有足够大的内存,你会发现捕获的内容受到限制。由于示波器的内存不足以容纳更长时间段的详细信息,解码的数据可能会被扰乱(通常在几个字节之后)。为了克服这个问题,你可能需要减小数据的时间范围,或使用具有足够内存容量的仪器来精确保持信号转换。

TWI

这种总线使用边缘信号来确定某些协议状态(如启动/停止条件)。如果示波器的采样不足,你可能会得到错误的信号解码。虽然不像RS-232协议那么严重,但这只会发生在你对仪器施加压力的情况下。

SPI

SPI总线是时钟同步传输,因此采样不像其他协议那样是个大问题。但是,由于你通常需要三条线(SCK、MISO、MOSI),你需要额外努力才能用双通道示波器读取所有线。由于此脚本是围绕TDS3012B构建的,它只捕获两个通道。如果你有更多可用通道的仪器,我建议修改脚本并捕获额外通道。

摘要

脚本可以进行改进,但由于我忙于其他事情,目前不打算添加任何内容。无论如何,欢迎提出任何想法,并在某个时候可能会将它们整合进来。

我是在一段时间前创建这个脚本的,最初用于TWI,然后我添加了RS232,最后是最简单的SPI部分。我大约用了两周时间完成了整个脚本(具有完整功能),而且非常容易。如果我没有使用TDD,我将需要在我的示波器上捕获所有可能的变体,并在当时调试一个更大的代码库。

你可以在这里找到一个编译后的Python可执行文件。

你可以在BitBucket上找到源代码树。

© . All rights reserved.