USB-zu-SPDIF

Ein Konverter von USB auf S/PDIF (TOSLINK). Dafür gibt es aktuell eine Lösung für Teensy 3.2. Das ist ein 32-Bit-Mikrocontroller. Teensys sind zurzeit ziemlich teuer. Eine fertige Lösung erscheint unsportlich, und 32-Bit-Power fürs reine Datenschaufeln erscheint übertrieben. Und Arduino-Software ist und bleibt (nicht nur mir) suspekt.

Hierbei geht es nur um einen TOSLINK-Ausgang zur potenzialgetrennten, brummschleifenfreien Ansteuerung eines Stereo-Heimverstärkers.

Mit Pro Micro

Eine Lösung mit 8-Bit-Mikrocontroller erfordert wegen der hohen Taktrate eine gesonderte Schaltung mit FIFO als Bindeglied. Um nicht TQFP löten zu müssen bietet sich ein preiswerter Pro Micro an. Dazu genügt eine Schaltung mit 4 Schaltkreisen: Endlich mal wieder eine Digitalschaltung!

Schaltplan

Die Schaltung verwendet etwas ungewohnte Schaltkreise, die es leider mittlerweile nicht mehr alle bei Reichelt gibt:

So muss der Mikrocontroller die Nibbles mit etwa 750 kHz liefern. Durch die Tiefe der FIFO darf der Controller bequeme 20 µs mit dem Nachfüllen aussetzen.

Auf der USB-Seite implementiert der Controller ein USB-Audio-Gerät mit dem entsprechenden isochronen Endpoint für die Audiodaten. Das schafft der ATmega32U4 auf dem Pro Micro locker. Bei USB-Standby (Schlafmodus mit 0,5 mA Gesamt-Stromaufnahme) muss der Controller auch den Toslink abschalten. Am einfachsten durch Abschalten der Stromversorgung dieser externen Schaltung.

Mit Pro Micro (2)

Oh, oh, so geht das nicht! Es gibt Ausnahmen bei der Generierung des Bitstroms! Die erledigt man besser in Software, sodass man eher ein 8-Bit-Design anstrebt: Mit 74HC164 als Schieberegister und 74HC590 als Zähler/Teiler. Außerdem sind 12,288-MHz-Quarze nicht zur Hand, stattdessen solche mit 24,576 MHz = 29×48 kHz. Kann man eine Ausgaberate von 768 kByte/s lückenlos halten (Interruptroutine in Assembler und freigehaltenes Zeigerregister erforderlich, typischerweise Y, also R29:R28 = YH:YL) kann man sich die externe FIFO sparen.

Die Regelung dieser internen FIFO erfolgt auf halben Füllstand durch entsprechende USB-Synchronisierung. Um den Rest muss sich die Tonquelle (Windows oder Linux) kümmern.

Eine FIFO-Länge von 256 Bytes wären gerade mal 16 Samples. Vom USB kommen pro Block (1 ms) ca. 48 Samples = 192 Bytes Durch Aufblasen auf 24 Bit (Stereo) und Einfügen von Subchannel-Info werden daraus 384 Bytes. Durch das Verdoppeln der Bits für die Leitungskodierung kommt man auf 768 Bytes. Pro Millisekunde. Das ist 3/4 der RAM-Kapazität.