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