Forum: Mikrocontroller und Digitale Elektronik 2 STM32F4 SPI Master/Slave FullDuplex


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

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

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

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.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

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
void EXTI0_IRQHandler()
2
{
3
4
  ERROR_HARD_SET();
5
6
  // Clear IT
7
  EXTI->PR = EXTI_Line0;
8
9
  // Enable DMA Rx
10
  DMA2_Stream2->CR |= (uint32_t)DMA_SxCR_EN;
11
12
  ERROR_HARD_RESET();
13
14
}


Die zweite negative Flanke, kommt wie erwartet (DMA Zählerregister steht 
auf 1) nach dem ersten empfangenen Halfword:
1
// On Reception end
2
void DMA2_Stream2_IRQHandler()
3
{
4
  ERROR_HARD_SET();
5
6
  // Clear IT
7
  DMA2->LIFCR |= 0x200000;
8
9
  // Set reply for master
10
  switch (DAQPipe.rx_frame)
11
  {
12
  case DAQ_PIPE_CMD_CONNECT:
13
    DMA2_Stream5->NDTR = (uint16_t)1;
14
    DMA2_Stream5->M0AR = (uint32_t)&DAQPipe.tx_frame_con;
15
    break;
16
  case DAQ_PIPE_CMD_GETCONFIG:
17
    DMA2_Stream5->NDTR = (uint16_t)DAQ_PIPE_TX_BUFFERSIZE;
18
    DMA2_Stream5->M0AR = (uint32_t)&DAQPipe.tx_frame_cfg;
19
  }
20
21
  // Enable DMA Tx
22
  DMA2_Stream5->CR |= (uint32_t)DMA_SxCR_EN;
23
24
  // Reset DMA Rx
25
  DMA2_Stream2->NDTR = (uint16_t)1;
26
27
  ERROR_HARD_RESET();
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?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

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

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.