Oscilloscope Setup for SPI

These instructions provide a quick setup for your oscilloscope for SPI monitoring.

They will help you get a usable transaction on screen. From that starting point you can explore clock polarity and phase, chip select timing, inter-byte gaps, signal integrity, and bus contention.

There are varied forms of SPI. Dual/Quad SPI add data lines. Double data rate places a data transition at each clock edge. There are also SPI like devices that use a serial shifter, data strobe and chip select, but are not true SPI interfaces. This set up will help you start with those interfaces too.

When setting up your oscilloscope, you need to know two parameters about your bus:

  • bus speed
  • operating voltage

You will need four channels to see the SPI bus:

  • SCK — serial clock
  • PICO — Peripheral In, Controller Out
  • POCI — Peripheral Out, Controller In
  • CS# — Chip Select, active low

Other signals may be useful, but without CS# you cannot reliably see transaction boundaries.

You will need the scope to be free-running to find your signals on the screen. Adjust the voltage to bring the waveforms on-screen. Once you have the signals visible, you can refine capture and timing.

Naming note:
This guide uses PICO/POCI as these terms are widely adopted in datasheets (ST, Microchip, Raspberry Pi).
Some vendors use COTI/CITO (NXP), and older documents may use MOSI/MISO.
Arduino uses COPI/CIPO, but those terms are avoided here.


Channels

The essential SPI signals:

SignalTypical stateComments
SCKIdle high or lowDepends on CPOL.
PICODriven by controllerData from controller to peripheral.
POCIDriven by peripheralData from peripheral to controller.
CS#Active lowMarks start and end of a transaction.

Optional signals for debugging: RESET#, INT, PWR.
Always connect ground as well as the signals.
Turn on each channel individually with the channel enable.

Some devices use a CS (acitive high chip select), so you should invert your trigger.


Start the scope running

  • Trigger – auto/continuous
  • RUN – enable

Voltage

Use the voltage scale and position controls to bring signals on-screen.

Voltage Scale

Initially 2 V/div.

SPI buses normally run at 3.3 V or 1.8 V logic levels.
Optional signals may differ in voltage. Refer to the schematic or datasheets.

A starting scale of 2 V/div will fit 4 channels comfortably on screen.
After offsets are adjusted, you may reduce the scale for individual signals.

Voltage Offset

Initially 0 V.
Use vertical position to spread signals evenly across the screen.

Zero all offsets, then separate traces so they don’t overlap.
Typical layout: CS# top, SCK below, PICO/POCI at bottom.


Set Trigger

  • Source = CS#
  • Type = Falling Edge
  • Level = 0.5 V (or ~30% of bus voltage)
  • Offset = 0.0 s

Source and edge

Triggering on CS# ensures capture starts at the beginning of a transaction.
If no CS# is available, use SCK and select an edge consistent with CPOL/CPHA.

Trigger level

Set trigger level to ~30% of bus voltage (falling) or 70% (rising).

bus voltageeither (50%)falling (30%)rising (70%)
5.0 V2.5 V1.5 V3.5 V
3.3 V1.65 V1.0 V2.0 V
1.8 V900 mV600 mV1.2 V
1.0 V500 mV300 mV700 mV

Timing scale

Start with one or two bytes visible on screen.

SPI has one clock edge per bit. With 8 bits per byte, the byte time is:

byte time = 8 × bit time
bit time = 1 / clock frequency

speedbit timebyte timeshow one byteshow 4 bytes
100 kHz10 µs80 µs10 µs/div20 µs/div
1 MHz1 µs8 µs1 µs/div2 µs/div
10 MHz100 ns800 ns100 ns/div200 ns/div
25 MHz40 ns320 ns50 ns/div100 ns/div
50 MHz20 ns160 ns20 ns/div50 ns/div

Adjust timebase until you have clean edges visible and at least one full byte.


Sample rate

Your scope must sample at least twice the maximum clock frequency, but in practice 5–10× is recommended.

SPI speedmin sample raterecommended
100 kHz200 kSa/s1 MSa/s
1 MHz2 MSa/s10 MSa/s
10 MHz20 MSa/s100 MSa/s
25 MHz50 MSa/s250 MSa/s
50 MHz100 MSa/s500 MSa/s

Checklist

  • Power on scope.
  • Connect probes (SCK, PICO, POCI, CS#).
  • Enable channels.
  • Set voltage scale and offset.
  • Trigger on CS# (falling edge).
  • Adjust timebase for one byte or transaction.
  • Verify sample rate ≥ 5× SCK frequency.

This gives you a solid starting point for SPI capture. From here you can refine based on CPOL/CPHA mode, inter-byte gaps, and peripheral timing.