Guten Abend liebe Community
Ich sitze hier nun schon seit mehreren Stunden vor dem Debugger und
versuche meinen STM32F105RB (CL) mit einem MAX9850 (DAC) mittels I2S zum
laufen zu kriegen.
Die Daten sollen von einer SD-Karte kommen.
Nun zum groben Aufbau:
SD-Karte mittels HW-SPI@18MHz und ELM-Chans PetitFS
Gemessener Durchsatz, 4096Bytes in 22ms
MAX9850 I2C an HardwareI2C des chips
MAX9850 I2S an SPI2 des Controllers (HW-I2S)
Konfiguriert habe ich den MAX9850 im IntegerMode.
MCLK generiert der STM32 bzw. das HW-SPI selbst
Und zwar genau 256xLRCLK
Auf der Karte befindet sich ein Lied mit 50MB 48kHz @ 16bit PCM
Die von der Karte gelesenen Daten werden mit dem DMA zum SPI übertragen.
Nun mein vorgehen:
1 | pf_read(buff1, 72, &br); //Wave Header laden und verwerfen
| 2 |
| 3 | pf_read(buff1, sizeof(buff1), &br); //erste 1024bytes laden
| 4 |
| 5 | DMA_Cmd(DMA1_Channel5, ENABLE); //DMA Transfer aktivieren im circular mode
| 6 |
| 7 | for(;;)
| 8 | {
| 9 |
| 10 | while(!DMA_GetFlagStatus(DMA1_FLAG_HT5)); //Warte bis HALBER Transfer abgeschlossen
| 11 | pf_read(buff1, (sizeof(buff1)/2), &br); //untere 512bytes auffüllen (von der Karte lesen)
| 12 | DMA_ClearFlag(DMA1_FLAG_HT5); //Flag löschen
| 13 |
| 14 | while(!DMA_GetFlagStatus(DMA1_FLAG_TC5)); //Warte bis GESAMTER Transfer abgeschlossen
| 15 | pf_read(&buff1[512], (sizeof(buff1)/2), &br); //obere 512bytes auffüllen (von der Karte lesen)
| 16 | DMA_ClearFlag(DMA1_FLAG_TC5); // Flag löschen
| 17 |
| 18 | }
|
Was meint Ihr, ist mein vorgehen prinzipiel richtig so?
Die Qualität ist für mich ausreichend :)
Der DMA wird immer dann aktiv, wenn das I2S Interface einen leeren TX
Buffer hat.
Hat jemand einen Tipp für mich wie ich das ganze noch schneller bzw.
effizienter machen könnte?
Aktuell gebe ich dem Buff1 32KByte Ram
Doch so ca. alle 3Sekunden verschluckt sich der DMA kurz.
also ein kurzer ruckler...
Dies ist auch bei 50KBytes der fall dann jedoch so alle 5Sekunden
Ich denke dass da die SD-Karte nicht nachkommt mit Daten...
Hier noch die Konfig des MAX9850
1 | void MAX9850_init_chip(void)
| 2 | {
| 3 | MAX9850_send_i2c(0x20,REG_CHG_PUMP,0x80); // Charge Pump = Internal clock, volume slew 63ms
| 4 | MAX9850_send_i2c(0x20,REG_ENABLE,0x30); // Charge Pump aktivieren alles andere deaktiviert lassen
| 5 | // nach ca. 10ms ist die CHGPUMP stabil
| 6 | MAX9850_send_i2c(0x20,REG_CLOCK,0x00); // ICLK Div. B2:B3 | 00 = MCLK:1 , 01 = MCLK:2 , 10 = MCLK:3 , 11 = MCLK:4
| 7 | MAX9850_send_i2c(0x20,REG_GP,0x00); // General Purpose Register
| 8 | MAX9850_send_i2c(0x20,REG_VOLUME,0x1F); // Volume = -9dB
| 9 | MAX9850_send_i2c(0x20,REG_LRCLK_MSB,0x80); // Mastermode (kein Divider)
| 10 | MAX9850_send_i2c(0x20,REG_LRCLK_LSB,0x10); //16
| 11 | MAX9850_send_i2c(0x20,REG_D_AUDIO,0x08); // Mastermode, I2S Standard Interface, 16bit Audio
| 12 | MAX9850_send_i2c(0x20,REG_ENABLE,0xFD); // MAX aktivieren, MCLK Aktiv, CHG PMP aktiv, HPEN, LNOEN, DACEN
| 13 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|