Forum: Mikrocontroller und Digitale Elektronik Wer kennt den Esp32 s3 und macht Audio damit?


von Klaus (Gast)


Lesenswert?

Hi.

Ich versuche gerade auf einem ESP32S3 Audiodaten (Sinus) auszugeben.
Ich habe 16Bit Werte und wollte die als 32Bit ausgeben.

Im Code habe ich I2S-Standart angegeben, aber die Daten kommen nicht 
rechs sondern linksbündig raus.
Was kann das sein?
Was muss man noch einschalten damit das richtig raus kommt?

Dann habe ich mal auf 24Bit Ausgabe umgestellt und die Wordclock ist 
total daneben (ca. 51KHz anstatt 48). Ein bischen daneben hätte ich ja 
noch verstanden aber so daneben ist nicht mal ansatzweise lustig.

von Klaus (Gast)


Lesenswert?

Mist habe die Richtung falsch geschrieben.
Die Daten kommmen naturlich rechtsbündig raus, was ja falsch ist.

von Dirk (Gast)


Lesenswert?

Ich verwende auch den ESP32S3 allerdings mache ich nur 16bit Ausgaben.
Weil es mich interessierte habe das einfach mal geändert.
Nun ich habe bei mir auch diesen Fehler.
Entweder ich habe auf die schnelle was vergessen oder da ist ein Fehler 
drin, das ist aber so blöd geschrieben das ich da nicht durchsteige.

Ich habe es folgendermassen eingestellt:
1
uint16_t Buffer[2048];
2
3
i2s_config_t i2s_config = {
4
    .mode = I2S_MODE_MASTER | I2S_MODE_TX,
5
    .sample_rate = 48000,
6
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
7
    .bits_per_chan = I2S_BITS_PER_CHAN_32BIT,
8
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
9
//    .communication_format =  I2S_COMM_FORMAT_STAND_MSB,           
10
    .communication_format =  I2S_COMM_FORMAT_STAND_I2S, 
11
    .dma_buf_count = 16,
12
    .dma_buf_len = 64,
13
    .use_apll = false,
14
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL2                                
15
};
16
i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
17
i2s_set_clk(I2S_NUM, 48000, (I2S_BITS_PER_CHAN_16BIT << 32) | I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_STEREO);
18
19
// jetzt Werte eintragen die man auf dem Logikanalyzer gut sieht! 
20
memset ((uint8_t*) &Buffer[0], 0x8421, sizeof (Buffer));
21
while 1
22
{
23
   i2s_write(I2S_NUM,  (uint8_t*) &Buffer[0], sizeof (Buffer), &i2s_bytes_write, portMAX_DELAY);
24
}

von Dirk (Gast)


Lesenswert?

So ist es richtig damit das Beispiel arbeitet!
1
i2s_set_clk(I2S_NUM, 48000, (I2S_BITS_PER_CHAN_32BIT << 32) | I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_STEREO);

Mit I2S_BITS_PER_CHAN_24BIT kann ich auch das Timing Problem sehen.
Da stimmt mal nichts mehr, vielleicht kann man das anpassen.
Anstatt 48000 halt 46123 oder so.

von Dirk (Gast)


Lesenswert?

Mach mal in die i2s_config

.left_align = true,

rein dann ist das auch links drin.

Warum das allerdings bei 24bit so daneben liegt habe ich auf die 
schnelle nicht gesehen.

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.