Forum: Mikrocontroller und Digitale Elektronik I²S Signal mit ATmega erzeugen


von Marco V. (marcov)


Angehängte Dateien:

Lesenswert?

Guten Abend,

um einen Audio DAC vom Typ WM8714 zu testen, und um einfach mal
auszuprobieren ob es möglich ist, versuche ich einen ATmega88 I²S Daten
ausgeben zu lassen.

Ich arbeite mit zwei Timern im CTC Modus. T0 (MCLK) läuft läuft 8x so
schnell wie T2 (BCLK), der bei jedem Flankenwechsel einen Interrupt
auslöst.
In dieser ISR wird bei jedem zweiten Aufruf ein neues Bit auf DIN gelegt
so dass es bei steigender Flanke von BCLK bereit liegt.
Außerdem wird alle 16 Takte LRCIN umgeschaltet und das 8 bit Wort dass
ich ausgeben möchte um 1 inkrementiert. Bit 9-16 sind dabei immer 0.

Mit dem Selbstbau-LA Scanlogic, meinem Multimeter und meinem Oszi habe
ich die Ausgangssignale auf Frequenz und Timing hin überprüft und kann
keinen Fehler feststellen.

Ich habe verschiedene Frequenzen getestet bis hinauf zu 16 kHz
Samplingrate aber es ist hinter einem LC Filter über hochohmig
angeschlossene Kopfhörer nichts zu hören.
Ein anderer DAC vom Typ DA1131 bleibt ebenfalls stumm, rauscht aber
etwas und fabriziert fürchterliche Geräusche wenn ich das Timing
absichtlich verstelle ;).

Die Screenshots vom LA habe ich mal angehängt. Zum einen sieht man das
Verhältnis MCLK zu BCLK, auf dem anderen BCLK, DIN und LRCIN.
Ich hoffe jemand erkennt einen Fahler, denn ich bin ratlos.

Grüße,
Marco

von Marco V. (marcov)


Angehängte Dateien:

Lesenswert?

Und der zweite. Nicht wunder dass die Zeitbasis eine andere ist. Das 
liegt daran dass der LA nicht mehr als 3 MSamples/s schafft und ich 
daher die Taktfrequenz verringert habe.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Ich versuche hier momentan einen MAX9850 zum laufen zu bringen 
(allerdings mit einen SAM7). Bisher höre ich auch nur das Rauschen des 
Verstärkers...

Dein Logic-Analyzer ist ja ein ganz nettes Teil, so einen kann man sich 
mal schnell zusammen basteln.

AFAIK ist I2S so definiert, dass auf der steigenden Flanke Daten in den 
DAC gelesen werden.
Wichtig ist auch, dass das MSB des aktiven Kanals erst beim zweiten BCLK 
Puls übertragen wird (mit dem vorherigen BCLK Puls wird das LSB des 
vorherigen Kanals übertragen). Die meisten DACs kann man aber so 
einstellen, dass sie sich anders verhalten. Das konnte ich zumindest 
meinem Errata entnehmen:
http://pdfserv.maxim-ic.com/en/errata/MAX9850_ERRATA.pdf

So ganz erkennen was da passiert kann ich nicht. Das zweite bild sieht 
aus als würden viel weniger Bits übertragen werden

Wichtig ist ja auch, dass die Einstellungen des DAC genau zu der 
ausgegebenen MCLK und BCLK des µC passen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das ist kein I2S-Signal. I2S ist mit 32 Bitclocks / Halbframe 
definiert, Du hast aber nur 16. Desweiteren gilt oben gesagtes, das MSB 
wird mit der 2. BitClock nach dem Flankenwechsel der WordClock 
übertragen.

von Marco V. (marcov)


Lesenswert?

Es hört sich so an als würde es jetzt laufen. Der DAC gibt immerhin 
schonmal ein Signalmuster aus.
16 bit pro Halbframe ist laut Datenblatt möglich und nennt sich "packed 
mode" also habe ich das auch verwendet.

Danke übrigens für den Hinweis mit dem MSB, das hatte ich überlesen.

Grüße

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Aha - packed mode... Der bringt aber nur bei einem sendenden Controller 
wirklich Vorteile. Ein empfangender Controller braucht die verbleibenden 
nichtgenutzten 8 Bits eines Halbframes zum Wegspeichern der empfangenen 
Daten. Aber hier in Deinem Fall ist das dann schon okay ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.