Forum: Mikrocontroller und Digitale Elektronik STM32 mit MAX9850 DAC (ist mein prinzip korrekt?)


von C. H. (hedie)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.