Forum: Mikrocontroller und Digitale Elektronik I2S mit dem MAX98357: ab 48 kHz wird der Ton "kratzig"


von MiTo (Gast)


Lesenswert?

Hallo,

ich habe ein eigenartiges Problem, für das ich keine richtige Lösung 
weiß:

Ich habe einen ESP32 (WROOM-32), der eine Audiodatei von SD liest und 
diese mit einem MAX98357 ausgibt. Funktioniert wunderbar, bis zu 
Sampleraten von 44.1 kHz. Ab 48 kHz fängt es an, dass der Ton kleine 
"Knackser" in der Wiedergabe bekommt. Als würde der Chip kurz skippen 
oder so. Bei 96 kHz, die der MAX98357 ja eigentlich können soll, ist es 
absolut katatrophal.
Ich hatte die Sache bei 48 kHz halbwegs in den Griff bekommen, indem ich 
die APLL des ESP32 benutze. Jetzt ist die Frequenz stabil, die 
Logiklevel sind korrekt und es passt auch alles zu 16 bit Daten, aber 96 
kHz gehen immer noch nicht, obwohl das alles noch weit entfernt davon 
ist, was der ESP32 können soll:

CLK= 2 Kanäle  16 bit  96 kHz = 3.072 MHz.

Zuerst dachte ich an Buffer underruns oder dass die SD nicht hinterher 
kommt. Das scheint es aber nicht zu sein. Ich sehe in den Signalen 
keinerlei Auffälligkeiten...

Hat jemand eine Idee, was das Problem ist? Hier der relevante Code:
1
static const i2s_config_t i2s_config = 
2
      {
3
          .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
4
          .sample_rate = 96000,                                 
5
          .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
6
          .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
7
          .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
8
          .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,             
9
          .dma_buf_count = 8,                                   
10
          .dma_buf_len = 64,                                    
11
          .use_apll=1,
12
          .tx_desc_auto_clear= false, 
13
          .fixed_mclk=40000000    
14
      };

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MiTo schrieb:
> die Logiklevel sind korrekt
Du hast die Pegel und die Flanken und das Timing aber schon so nah wie 
möglich am MAX gemessen? Passen die gemessenen Werte zu den 
Anforderungen im Datenblatt?

> Ab 48 kHz fängt es an, dass der Ton kleine "Knackser" in der Wiedergabe
> bekommt. Als würde der Chip kurz skippen oder so.
Der DA-Wandler kann nicht "skippen", der hat ja nicht mal einen Buffer.

> Zuerst dachte ich an Buffer underruns oder dass die SD nicht hinterher
> kommt. Das scheint es aber nicht zu sein.
Wie kommst du auf diesen Schein? Wie hast du die SD auf 
unterbrechungsfreie Übertragung getestet? Greift zwischendurch noch 
irgendwer auf die SD zu?

Mein Tipp: "Divide et impera!" --> teile das Problem in kleine 
Teilaufgaben.
Berechne doch einfach mal einen Sinus oder einen Sägezahn ins RAM des µC 
und gib den als Dauerton aus. Dann misst du mit dem Oszi, ob da was 
zuckt oder ruckt.

: Bearbeitet durch Moderator
von Georg A. (georga)


Lesenswert?

Wenn das Geknackse anders (nicht unbedingt besser) wird, wenn du einen 
47p-C gegen GND versuchsweise an die Signale hängst, hast du ein Timing- 
und/oder Signalintegritätsproblem. Da wäre evtl. eine 
47R-Serienterminierung in alle Signale zum DAC hilfreich.

von Andreas M. (amesser)


Lesenswert?

dma_buf_len = 64 bedeutet alle 64 samples ein DMA interrupt bei 96kHz 
heist das alle 666µs ein Interrupt für den DMA und ein neuer Puffer 
fällig. Kann man machen, ist aber suboptimal.

Ich denke mal Du hast ein Problem mit dem Befüllen der DMA Puffer. Wenn 
die leer laufen kommt nur noch Mist raus. SDs sind undeterministisch die 
machen Wear-Leveling, auch beim Lesen. Das kann dreistellige 
Millisekunden  blockieren.

Ich würde lieber weniger Puffer, dafür größere nehmen. Einzelner Puffer 
sollte wenigstens 4k (=1024 Stereo-Samples) groß sein, das entspricht 
dann  der internen Sektorgröße von modernen SD Karten. 1024 Samples sind 
10ms bei 96kHz. Bei SD würde ich mal für mindestens 100ms Puffer 
vorsehen. 8x1024 Samples, besser 4x2048 Samples oder gar 8x2048, das 
senkt die Interruptlast. Evtl klapts auch shcon mit 4x1024 ganz gut.

: Bearbeitet durch User
von MiTo (Gast)


Lesenswert?

Danke für die Tipps! Das erste Problem was ich jetzt gefunden habe, war, 
dass die Clock der SD-Karte viel zu niedrig war. Im Prinzip trat das 
Problem dann auf, wenn die Clock des I2S der Clock der SD-Karte nahekam 
- logisch. Man kann die Daten schließlich nicht schneller lesen als man 
sie schreiben kann.
Jetzt schau ich mal weiter, wie hoch ich die Samplerate bei ordentlicher 
Tonqualität bekomme...

von Audiomann (Gast)


Lesenswert?

Stimmt denn das überhaupt "I2S_CHANNEL_FMT_RIGHT_LEFT"?

von MiTo (Gast)


Lesenswert?

Nein. Das ist ein weiteres Problem, was ebenfalls ein Problem ist. Ich 
bin gerade dabei herauszufinden, was die korrekte Konfiguration ist... 
Aktuell spielt er damit nur jedes zweite Sample, so dass alles doppelten 
Pitch hat (4 kHz Ton --> 8 kHz)

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.