Guten Morgen,
ich hab da ein sehr seltsames Problem ...
Ich war mit ST's HAL unzufrieden und erstellte ein neues Projekt, das
ohne HAL auskommt.
Funktioniert im Prinzip besser, aber mein I2S macht nichts und ich
glaube, es liegt an der Clock-Configuration (warum weiter unten).
Hier der Initialisierungs-Code für die I2S:
Die Schleife, die ganz unten zufällige Daten über I2S rausschicken soll
läuft im Prinzip - aber nicht im HAL-freien Projekt.
Auf keinem der I2S-Pins sieht man irgendwelche Pegel-wechsel.
Zu dieser Zeile hier:
HAL hatte den PD6 mit AF5 statt AF6 initialisiert, was im HAL-Projekt
auch funktioniert. Keine Ahnung weshalb und im Manual hatte ich nichts
dazu gefunden ... Hat jemand vlt eine Idee? Hab beides ausprobiert, geht
beides nicht.
Hier noch die Initialisierung meiner Clocks (1 zu 1 aus der
system_stm32f4xx.c aus einem ST-CMSIS-Example-Code für I2S):
Ganz unten wird die I2SPLL initialisiert.
Das sollte eigentlich passen, aber aus meinem I2S kommt nichts...
Wenn ich in einem funktionierenden HAL-Projekt die Clock-Configuration
durch die obige SetSysClock ersetze, dann funktioniert dort I2S auch
nicht mehr.
Muss wohl irgendwas mit dem Clock zu tun haben, hab es aber nicht
herausgefunden und nach einem Tag debugging bin ich mittlerweile völlig
ratlos.
VG
Mampf
Mampf F. schrieb:> Muss wohl irgendwas mit dem Clock zu tun haben, hab es aber nicht> herausgefunden und nach einem Tag debugging bin ich mittlerweile völlig> ratlos.
Das hat mich beim STM32F407 (Dicovery Board) auch eine Weile
beschäftigt. Über die serielle habe ich mir dann die Register ausgegeben
und festgestellt, das der I2S Prescaler nicht richtig gesetzt wurde.
Mein Projekt nutzt allerdings 48kHz Samplefrequenz, deswegen sieht das
hier etwas anders aus:
1
#define I2SDIV 0x0103;
2
// init the Pins for I2S Alternate Function
3
//...
4
5
/* now set the parameters for the I2S Interface itself */
// set the MCLK Output enable bit and prescaler , cause the initfunction is bugged
15
SPI3->I2SPR=I2S_MCLKOutput_Enable|I2SDIV;
16
// Configure the I2S Tx empty IRQ
17
// ...
Wenn du keine Masterclock brauchst, setzt du stattdessen nur den
Teilerwert ein ohne das gesetzte 'I2S_MCLKOutput_Enable' Bit.
Bei mir hat es sich bewährt, nach jedem Init irgendeiner Funktion einen
Ausgang blinken zu lassen (das Disco Board hat ja genug LEDs).
Matthias S. schrieb:> Über die serielle habe ich mir dann die Register ausgegeben> und festgestellt, das der I2S Prescaler nicht richtig gesetzt wurde.
Puh, hört sich auch nach viel Debugging-Freude an :)
Vielen Dank, ich geh gleich mal nachforschen, vlt hilft das bei mir
auch! :)
Mampf F. schrieb:> Matthias S. schrieb:>> Über die serielle habe ich mir dann die Register ausgegeben>> und festgestellt, das der I2S Prescaler nicht richtig gesetzt wurde.>> Puh, hört sich auch nach viel Debugging-Freude an :)>> Hmm, das ist eigentlich seltsam ... Die I2S-Init-Routing liest die> Clock-Prescaler der PLLI2S und errechnet daraus die Clock-Frequenz und> ermittelt daraus die I2S-Interface-Einstellungen.>> Wenn die Prescaler vorher falsch waren, wär das I2S-Interface völlig> falsch konfiguriert worden.>> Oder die Funktion macht den Prescaler selbst dann irgendwie kaputt.>> Ich muss gestehen, ich hab den PLL-Clock noch nicht nach einem I2S_Init> durchgeführt, vlt wäre das des Rätsels Lösung gewesen.>> Danke schonmal!
Achso, noch eines, die I2SPLL sollte unbedingt konfiguriert werden,
nicht auf System Init verlassen:
Matthias S. schrieb:> Achso, noch eines, die I2SPLL sollte unbedingt konfiguriert werden,> nicht auf System Init verlassen
Vielen Dank, probier ich aus! :)
Kann leider erst morgen Bescheid geben, ob es was gebracht hat ...
Bastelkram in der Arbeit :'(
Jetzt hab ich es mal getestet ... es passiert trommelwirbel nichts :(
Keinen Mux gibt das I2S von sich ... Ich glaube, ich werde mir jetzt mal
funktionierende Beispiele suchen ...
Unglaublich, dass das Ding so rumzickt ... :(
Mampf F. schrieb:> Keinen Mux gibt das I2S von sich ... Ich glaube, ich werde mir jetzt mal> funktionierende Beispiele suchen ...
Ich habe zum Testen auch erstmal auf DMA verzichtet und lade SPI3->DR
per ISR für die Ausgabe bzw. hole mir von SPI2-DR per ISR den Input (das
Dings hier soll einen 4-Kanal Multitrack Recorder ersetzen). Das ist
schon eine Weile her, ich weiss aber, das ich mit dem Krams auch ganz
schön gekämpft habe.
Du wirst meinen Code nicht 1zu1 übernehmen können, weil hier alles auf
48kHz mit Masterclock konfiguriert ist, aber bei Interesse poste ichs
gerne mal.
Ohne die serielle Ausgabe fürs Debuggen wäre ich aber vermutlich nicht
drauf gekommen.
Den Stereo Ausgang macht bei mir der CS43L22 Chip auf dem Disco Board,
der ADC am Eingang ist ein CS5341.
Ich hab mich jetzt von dir inspirieren lassen und hab mir mal alle
Register von GPIOA-H, RCC und SPI3 quasi dumpen lassen ...
Das sieht dann so aus:
1
*((uint32_t*)0x40020000)=0xa8000200;
2
*((uint32_t*)0x40020004)=0x00000000;
3
*((uint32_t*)0x40020008)=0x0c000000;
4
*((uint32_t*)0x4002000c)=0x64000000;
5
*((uint32_t*)0x40020010)=0x0000f7df;
6
*((uint32_t*)0x40020014)=0x00000000;
7
*((uint32_t*)0x40020018)=0x00000000;
8
<snip>
9
*((uint32_t*)0x4002387c)=0x00000000;
10
*((uint32_t*)0x40023880)=0x00000000;
11
*((uint32_t*)0x40023884)=0x70002b00;
Und tatsächlich ... Mit dem zusätzlichen Code funktioniert es auch.
Jetzt kommentier ich Stück für Stück aus, bis das I2S nicht mehr
funktioniert, dann müsste ich wissen, woran es liegt :)
WTF Das setzen der AFs hat nichts gemacht ...
u.A. GPIO_PinAFConfig(GPIOA, GPIO_Pin_4, GPIO_AF_SPI3);
Hmm, das ist ja oberseltsam!
Ohmann, diese P****r!
GPIO_Pin_4 ist falsch bei GPIO_PinAFConfig ... Die GPIO_Pin_Teile sind
Bitmuster und die Funktion erwartet eine Pin-Nummer.
Den Designer der Library müsste man verprügeln, ganz ehrlich!
Mampf F. schrieb:> GPIO_Pin_4 ist falsch bei GPIO_PinAFConfig
Ach, entschuldige, das hätte ich sehen müssen :-O Ja, man muss
stattdessen dann immer 'GPIO_PinSourceNN' übergeben.