I tend to just use my
Teensy 4.0 with a custom interface using USB Serial (well over 200 Mbit/s sustained data rate) and voltage level translators (TXU0202 or TXU0204 for UART, TXU0304 for SPI) or digital isolators (
ISO1640 for I2C,
ISO6721 for UART,
ISO7741 for SPI). They're cheap, easily available at Mouser, and lets me not worry about ground loops or power supply issues.
The standard Teensyduino USB configurations include dual and triple USB Serial, so I can trivially use three completely separate buses on a single Teensy. If I need more, I use a simple multiplexing and escaping scheme. As Teensy 4.x are high-speed USB devices, the bandwidth is sufficient even for display modules. Only the actual data transfer code needs to be written, as the USB details are handled by the Teensyduino add-on based on menu selection. It is useful to implement any time-sensitive stuff and initialization directly on the microcontroller, however. One particularly useful detail is that when using USB Serial endpoints, one can detect on Teensy whether an application has opened the serial device or not, simply by checking if the device object (
Serial for main USB serial) evaluates to True or False. I find cobbling together quick tools dedicated for the task at hand more suitable to my mindset than reaching for a professional tool I use at most once a month.
I do have a very cheap Cypress FX2LAFW logic analyzer I occasionally use (with Sigrok PulseView). For example, if I want to just peek at I²C traffic, it's easier than using an I²C peripheral on a MCU. For UART traffic, it makes it easy to discover the exact format and baud rate.