STM32F030 SPI DMA verhält sich komisch

Gast #5173219
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.