Blus Mini

A miniaturized four-channel Class-D amplifier with many digital inputs, designed around the powerful STM32H723, and providing up to 4 x 25 W of power output.

After developing my first DSP amplifier Blus, I found the Analog Devices DSP and its software too limiting (proprietary toolchain with little flexibility), so this version gives more control, has lower cost, and offers better integration options. Ideal for multi-channel audio applications, with open firmware and flexible inputs. Find it on https://github.com/blus-audio.

Hardware

I decided to attempt a one-chip solution with the STM32H723, which offers a lot of features that are interesting for this project.

  • Two serial audio interfaces (SAI) with two blocks each
  • An S/PDIF receiver peripheral that can clock the SAI (a very rare feature among STM32 parts)
  • USB 2.0 support (required for USB Audio 2.0)
  • Very high performance for digital signal processing (DSP)

While this appears to be an expensive controller, it is still more affordable than combining a specialized DSP with a USB audio bridge, while still being more flexible.

Next, a new, fully digital amplifier IC was chosen—the Texas Instruments TAS2780. This is a Mono Class-D amplifier with a digital I2S-compatible input, very high efficiency and enough power for most home audio applications. Four where required in order to drive stereo speakers with two drivers each.

In the end, this amplifier shall serve as a digital crossover, so that no analog components within the speakers are necessary. This enables flexible speaker tuning and in-room adjustment.

The hardware and firmware are designed to support multiple digital inputs and outputs and automatically switch between them.

  • USB Audio input at 32 bit depth and 48 kHz sample rate
  • S/PDIF input
  • S/PDIF output for daisy-chaining multiple amplifiers
  • I2S input from an attached RaspberryPi
  • I2S input/output via an external connector

Firmware

Most of the work in this project went into writing the firmware, which is written in Rust and is based on the excellent embassy-rs framework. However, the peripheral driver support for the STM32H723 within embassy was not yet sufficient for my application, so that I contributed a few new pieces.

  • Extend the USB driver for isochronous transfers, which are used in USB audio
  • Add a new USB audio class (UAC 1.0)
  • Add a new peripheral driver for the S/PDIF receiver
  • Modify and fix the DMA driver for correct operation with the S/PDIF and SAI peripherals

On top of this foundation, I could write my user code, which performs audio routing, automatic source switching, digital signal processing, and volume control.