Forum: Mikrocontroller und Digitale Elektronik STM32F030 SPI DMA verhält sich komisch


von ben (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich versuche einen STM32F030 im SPI slave mode mit DMA zu 
betreiben, stoße dabei auf merkwürdiges Verhalten des Controllers, 
welches ich mir nicht erklären kann.

Das habe ich vor: Geht CS high wird eine neue Übertragung vorbereitet, 
SPI und DMA neu gestartet.
Der SPI soll dann so lange einen circulären Buffer senden bis CS wieder 
high geht. Die fallende Flanke von CS soll ignoriert werden.

Ein erster Test mit der DMA im normalen Modus verläuft wie erwartet, 
schalte ich die DMA allerdings in den Circulären modus, resetten sich 
die Daten stattdessen bei der fallenden Flanke (!).

Ich verwende ein Software NSS, der hardware NSS pin wird nicht 
verwendet.

Die beiden Bilder illustrieren diesen Sachverhalt.

In beiden Fällen zieht der Master CS high, wartet eine bisschen und 
sendet dann 24 clocks. (Der slave sendet hier 3 bytes) Dann geht CS auf 
Low und der slave sendet weiter (in diesem Fall 10 Byte).
Wie man sieht werden die Daten im normalen Modus korrekt bei der 
steigenden Flanke zurückgesetzt, beim Circulären modus allerdings bei 
der Fallenden Flanke.

Hier ein bisschen code:
1
// CS-in interrupt
2
void EXTI4_15_IRQHandler()
3
{
4
  EXTI_ClearITPendingBit(EXTI_Line11);
5
  if(GPIO_ReadInputDataBit(SPI_CS_IN_PORT, SPI_CS_IN_PIN))
6
    spi_startNewDMATransfer();
7
8
}
9
10
void spi_startNewDMATransfer()
11
{
12
    //Disable DMA
13
    DMA_Cmd(DMA_SPI_TX_CHAN, DISABLE);
14
15
    //Flush SPI FIFO, Disable SPI
16
    SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
17
18
    // New data in Buffer
19
    SPIBuffer[0] = 0x2301;
20
    SPIBuffer[1] = 0x6745;
21
    SPIBuffer[2] = 0xAB89;
22
    SPIBuffer[3] = 0xEFCD;
23
24
    //Reset DMA
25
    DMA_SetCurrDataCounter(DMA_SPI_TX_CHAN, 8);
26
27
    // Enable SPI
28
    SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Reset);
29
30
    // Enable DMA
31
    DMA_Cmd(DMA_SPI_TX_CHAN, ENABLE);
32
}

SPI und DMA werden im Byte Modus betrieben, Half-word Modus ändert aber 
nichts am Verhalten..

Ich poste gerne auch den Code für die Initialisierung, etc, falls das 
hilft

Danke

von ben (Gast)


Lesenswert?

Jemand eine Idee? Danke

von ben (Gast)


Lesenswert?

? niemand?

von ben (Gast)


Lesenswert?

...

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.