Wer kennt den Esp32 s3 und macht Audio damit?

Gast #7356080
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.

Gast #7356601
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
}
Gast #7356611
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren