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 | };
|