Hallo ihr! Ich brauche mal wieder euren Rat: Ich habe SPI mit DMA zwischen einem F407 und einem F429 laufen. Alle relevanten Funktionen befinden sich im Anhang. Auch im Anhang befindet sich ein Oszigramm, der rote Kanal zeigt MISO. Habt ihr einen Plan, warum MISO zwischen den zwei Frames auf High bleibt? Mir ist aufgefallen, dass ein leichtes Delay zwischen der Master-Clock und dem MISO herrscht, hat es vllt damit etwas zu tun? Es sieht so aus, als ob er das letzte Bit auf die Leitung drückt, aber aufgrund des Delays das Frame zum Ende kommt, also wartet er mit dem runterziehen bis zum nächsten Clock? Vielleicht habt ihr ja eine Lösung, ich bin mal wieder seit 3 Tagen am rumwurschteln :) Bis hier her war es schon eine ziemlich schwere Geburt für mich. Ich kriege es auch irgendwie nicht hin, dass im zweiten Frame erst zum 3. Halfword hin gesendet wird. Er sendet beim Erhalt der Clock sofort los und zwar wohl noch das, was er im DR liegen hat. Habe auch schon versucht mit GPIO_Set/Reset mir am Oszi anzeigen zu lassen, wann was geschieht. Scheint alles zu passen soweit. Danke schonmal! Grüße Reggie
Juchu, ich hab mein Problem selber lösen können: "SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, ENABLE)" muss zur Initialisierungszeit einmalig gesetzt werden. In den Interrupts wird ausschließlich mit "DMAx_Streamx->CR |= (uint32_t)DMA_SxCR_EN" gearbeitet. Mein Denkfehler war, dass SPI anfängt mit OVR's um sich zu schmeißen und mich dann nicht mehr mag, wenn ich ihm den DMA wegnehme. Mit OVR's schmeißt er zwar rum, wenn ihm keiner das DR-Register leert, aber mögen tut er mich trotzdem :) Naja, zumindest funktionierts momentan, so wie ich das will.
Tja, und es funktioniert doch nicht so wie es soll: Auf dem Bild werden 3x16bit übertragen, Blau ist die Clock. Mit Rot setze ich zur Kontrolle einen Pin. Die erste rote negative Flanke kommt nach dem CS-Interrupt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Die zweite negative Flanke, kommt wie erwartet (DMA Zählerregister steht auf 1) nach dem ersten empfangenen Halfword:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Nach den ersten 3 Halfwords sieht ja alles gut aus. Nun schickt der Master nochmals das gleiche Frame. Wieder die erste negative Flanke nach dem IT. Das komische ist jetzt: Der DMA schießt sofort zu beginn des ersten Halfwords los?! Wo hab ich Bockmist gebaut?
Ich glaube jetzt habe ich es endgültig geschafft :> 4 Tage Arbeit, aber es hat sich gelohnt. Für alle die am selben Problem hängen: Zwar steht das alles im ReferenceManual, aber überall so ein bisschen Stückchenweise. Im CS-IT muss das SPI DR-Register ausgelesen werden, dann startet der DMA Rx IT auch nicht sofort bei der ersten Aktivierung des DMAs. Logisch, der SPI wartet, da er die Daten loswerden möchte. Im DMA Tx IT warte ich dann noch auf das SPI TXE und BSY Flag um danach das SPI DR-Register auf 0 zu setzen. Jetzt sendet SPI beim nächsten Clock auch nicht den letzten im DR befindlichen Schmarrn, sondern nur 0-en. Viel Erfolg :) EDIT: So muss es sich anfühlen ein Kind zu gebären :>
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

