Protocol Decoding

Protocol Decoding

The Active-Pro software decodes protocols in three layers:

  • Hardware-decoded protocols are framed by the FPGA inside the hardware pod, at full sample rate, before data is even sent to the PC.
  • Software-decoded protocols are decoded by the host application from the captured logic or analog samples during capture.
  • Post-Capture Python Decode - also called Custom Decoders - is a script you supply that runs over the captured buffer after capture stops. The application ships with example decoders for UART, I²C, SPI, CAN, LIN, Modbus, PWM, Manchester, DMX-512, MIDI, HD44780, RS-232/485, 1-Wire, PS/2, HART, I²S, I³C, SWD, JTAG, SMBus, PMBus, QSPI, RGMII, WS2812, Quadrature, DHT, 4-20 mA Loop, and a decoder_template.py to start your own.

On top of any layer, the PacketPresenter engine provides an application-level packet parsing pass with named fields, lookup tables, and graphing. See PacketPresenter for the full reference.

Assigning a Decoder to a Device Port

Open the Inputs tab on the right-side panel. Each Active Debug Port device has its own decoder mode selector.

Active Debugger: one BUS DECODERS drop-down (port A). Active-Pro and Active-Pro Ultra: a BUS DECODERS drop-down for each of the four ports.

(The drop-downs themselves are all labeled BUS DECODERS in the software; the A/B/C/D port letters are printed on the pod above each port's digital channels.)

Each Bus Decoder dropdown groups its entries into three sections:

  • Real-Time Hardware Decode - runs on the FPGA inside the pod during capture.
  • Real-Time Software Decode - runs on the host during capture.
  • Post-Capture Python Decode - opens the Custom Decoder picker. Runs after capture stops.

Not all modes are available on every port:

  • Port A: full set, all Hardware Decode entries (Active Debug Port 2-Wire / 1-Wire / SWV, I2C, UART, UART Inverted, all 4 SPI variants, EE101 Debugger 2-Wire / 1-Wire), all Software Decode entries (CHSI, 1-WIRE, LIN, DS101, RS232, MDIO, UART 9, UART 9 Inverted), plus Custom Decoder.
  • Port C: same as Port A except LIN, DS101, and RS232 are not offered (those route to analog channels and the FPGA wires them only to port A).
  • Ports B and D: omit the 4 SPI variants and the LIN / DS101 / RS232 entries. They still offer Active Debug Port, I2C, UART, UART Inverted, EE101, CHSI, 1-WIRE, MDIO, UART 9, UART 9 Inverted, and Custom Decoder.

CAN is not selectable as a built-in decoder in the current build; use a Custom Decoder if you need CAN. Custom Decoders are available on all four ports.

Select a mode from the drop-down. The waveform area updates immediately to show the appropriate channel rows for that port. To stop decoding on a port, set its mode to OFF.

When you pick a Custom Decoder, the dropdown's collapsed text shows the picked decoder's filename so you can tell at a glance which decoder each port is running, and two small icons appear next to the dropdown:

  • A gear icon, opens the decoder's parameter dialog (only enabled if the script declares PARAM: lines).
  • A pencil icon, opens the in-application script editor.

Helpful Hint: To maximize capture performance, make sure that any channels not necessary for a trace are turned off.

Hardware-Decoded Protocols

These protocols are decoded by the FPGA at full sample rate. No host CPU is involved in framing, the FPGA sends complete decoded bytes to the PC.

ACTIVE Debug Port (2-Wire)

The recommended mode for the Active Debug Port. Uses a dedicated clock line and a data line. Data rate up to 80 Mbps. Compatible with the SPI peripheral on most microcontrollers.

Menu text: ACTIVE Debug Port (2-Wire)

With this mode selected, the device port shows named text channels and graphable value channels populated by your firmware's ACTIVE library calls. Channel names come from your firmware's ACTIVELabel() calls.

ACTIVE Debug Port (1-Wire UART)

Single-wire variant of the Active Debug Port. Uses your MCU's existing UART TX pin, no dedicated clock pin needed. Works at any baud rate that is an exact divisor of 30 MHz.

Menu text: ACTIVE Debug Port (1-Wire UART)

ACTIVE Debug Port (1-Wire SWV)

Active Debug Port data carried over the ARM Serial Wire Viewer (SWV/ITM) output, the dedicated debug output pin on ARM Cortex-M processors.

Menu text: ACTIVE Debug Port (1-Wire SWV)

I2C / SMBus

Decodes standard I2C and SMBus transactions. Displays the 7-bit address (R/W), data bytes, and ACK/NAK state for every transaction. SMBus devices operate correctly under the I2C decoder, no separate mode is needed.

Decoder mode: I2C

UART

The following UART decoder modes are available:

Decoder mode     Description
UART 8,N,1     Standard 8-bit, no-parity, 1-stop-bit UART
UART 8,N,1 Inverted     Inverted polarity, for RS-232 on single-ended logic pins
UART 9,N,1     9-bit UART used in multi-drop/address-mode networks
UART 9,N,1 Inverted     Inverted 9-bit UART

Baud rate: Enter the baud rate in the settings field next to the mode selector. Set to 0 to enable automatic baud-rate detection. The Auto-Detect button measures the baud rate from the currently captured signal, click it after capturing with mode set to 0 and it fills in the detected rate. The Auto-Baud feature captures inputs for 1 second and computes the baud rate from the signal.

SPI

Decodes SPI bus transactions. Four variants cover the common SPI mode combinations:

Decoder Mode     Chip Select Polarity     Clock Active Edge
SPI (SS active low, SCK rising edge)     Active low     Rising
SPI (SS active low, SCK falling edge)     Active low     Falling
SPI (SS active high, SCK rising edge)     Active high     Rising
SPI (SS active high, SCK falling edge)     Active high     Falling

EE101 Debug Protocol

Decodes EE101 legacy debug protocol frames.

Menu text: EE101 Debugger (2-Wire) and EE101 Debugger (1-Wire)

Software-Decoded Protocols

These protocols are decoded in the host application from the logic or analog sample data captured during the capture session. They require the corresponding logic or analog channels to be enabled and capturing.

Available on: Active-Pro · Active-Pro Ultra (require logic or analog inputs)

1-Wire (Dallas/Maxim)

Decodes Dallas/Maxim 1-Wire bus transactions including ROM commands, function commands, and read/write data.

Menu text: 1-WIRE

LIN Bus

Decodes LIN bus frames. Requires an analog input, connect the LIN bus signal to Analog CH1.

Menu text: LIN (connect to Analog CH1). Port A only (not in B/C/D dropdowns).

RS-232

Decodes RS-232 serial signals through the analog input channels. RS-232 uses inverted, bipolar signaling (typically ±12 V). Connect the RS-232 signal to Analog CH1 and CH2 (differential pair, if used).

Menu text: RS232 (connect to Analog CH1 and CH2). Port A only.

MDIO

Decodes MDIO (Management Data Input/Output) transactions used for Ethernet PHY register access.

Decoder mode: MDIO

CHSI

Decodes the CHSI clock-plus-data protocol.

Decoder mode: CHSI

DS101

Decodes the DS101 protocol using analog inputs in differential configuration.

Menu text: DS101 (connect to Analog CH1 and CH2). Port A only.

Post-Capture Python Decoders (Custom Decoders)

Custom Decoders are small Python scripts you attach to a device port. Each script walks the captured logic and analog buffers end-to-end after capture stops and emits annotation rows of its own design, text, numeric values, or both, into the waveform display, the decode list, the PacketPresenter, the trigger system, and the AI Snapshot export. The application ships with example decoders for many common protocols, plus decoder_template.py as a starting point.

Attaching a Custom Decoder

  1. In the Inputs tab, open a port's Bus Decoder dropdown.
  2. Scroll to the Post-Capture Python Decode section.
  3. Click CHOOSE CUSTOM DECODER… - the Decoder Picker opens.
  4. Select a decoder from the list and click Select (or double-click the row).

The dropdown's collapsed text becomes the picked decoder's filename so you can see at a glance which decoder each port is running. Two icons appear next to the dropdown:

  • Gear - opens the decoder's parameter dialog (only enabled if the script declares one or more PARAM: lines).
  • Pencil - opens the in-application script editor.

The Decoder Picker lists both the built-in decoders (shipped with the application, read-only) and your My Decoder Library (every .py with a valid DECODER_MYNAME line in your My Decoder Library folder). A Type column marks each as Built-in or My Library; a built-in and one of your decoders may share a name and both are shown so you can pick either. The header banner shows your My Decoder Library folder, a Filter search box narrows the list, and five columns (Name, Type, Description, Date Modified, Size) describe each decoder. A New... button creates a fresh decoder from the template. To customize a built-in, Select it, then click the pencil, edit, and click Save to My Decoder Library — that writes an editable copy and the port switches to it.

See Custom Decoders for the full reference, folder layout, picker behavior, parameter system, in-app editor, runtime API (wait_for, wait_time, append, condition factories), interpreter selection, persistence in .active files, and authoring tips.

When Custom Decoders Run

Custom Decoders run after capture stops, not during capture. They run in three situations:

  • At the end of every live capture - when STOP is pressed, the buffer fills, or the post-trigger condition is met.
  • When opening a saved .active file - any embedded decoder scripts re-run against the loaded buffer.
  • When you click APPLY CHANGES in the status bar, re-runs the pipeline against the current capture after you edit a script, change a parameter, swap decoders, or tweak a trigger.

The full pipeline order is: Custom Decoders (A → B → C → D) → Packet Presenters → Trigger Search.

Decoder Settings Reference

Protocol     Setting field     Notes
UART (all variants)     Baud rate (0 = auto-detect)     Click Auto-Detect to measure from captured signal
I2C     None needed     Also handles SMBus devices
SPI     None (mode is in the decoder selection)     Choose the appropriate SPI variant
1-Wire, LIN, RS232, MDIO, CHSI, DS101     None    
Custom Decoder (Python)     Per-decoder PARAM dialog     Opened via the gear icon, fields built dynamically from PARAM: lines in the script header

List Tab Display Format

Decoded bytes in the List tab can be shown in several formats. Right-click a column header in the List tab to change the display format for that port's column:

Format     Example
Hex     0x41
Decimal     65
ASCII     A
Binary     01000001
ASCII + Hex     A (0x41)

This format setting is per-column and is saved in the capture file.


Waveform and List Synchronization

Clicking a decoded item in the waveform area scrolls the List tab to the corresponding row. Clicking a row in the List tab scrolls the waveform to that event's timestamp.

This bidirectional synchronization is always active, you never need to do anything to enable it. It is especially useful when you have a long bus trace and need to correlate specific events between the visual waveform display and the numeric/text data in the list.

Previous
Previous

AI Snapshot

Next
Next

Custom Decoders