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