2017-08-16 3 views
0

Ich versuche, eine feste Anzahl von Bytes (insgesamt 27 Bytes) von einem SPI-Slave-Gerät mit DMA zu lesen. Ich betreibe einen STM32F4-Chip.Schreiben Sie SPI-Dummy-Bytes mit DMA-Ringmodus

"Um vom SPI-Bus zu lesen, muss eine Uhr generiert werden. Sie müssen also schreiben, um zu lesen." Ich habe meinen DMA-Controller eingerichtet, um ein Dummy-Byte (0xFF) im zirkulären Modus zu schreiben.

uint8_t tx_buffer[] = {0xFF}; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; 
DMA_InitStruct.DMA_BufferSize = 1; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)tx_buffer; 

und meine Rx dma Stream ist Setup Doppelpuffer-Modus:

uint8_t rx_buffer0[27]; 
uint8_t rx_buffer1[27]; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; 
DMA_InitStruct.DMA_BufferSize = 27; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rx_buffer0; 

DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)rx_buffer1, DMA_Memory_0); 
DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE); 

(. Ich habe andere irrelevant Initialisierungen weggelassen)

Nachdem die 27 Bytes eine Übertragung abgeschlossen Unterbrechung empfangen ist Ausgelöst.

Das Problem ist wie folgt: Ich sehe korrekte Daten im ersten Puffer. Aber während der Interrupt den Tx-Zirkular-DMA auslöst, werden die ersten paar Bytes des zweiten Puffers gefüllt, bis er deaktiviert wird.

Ich möchte vermeiden, 27 Bytes für Dummy-Daten reservieren, gibt es also eine Möglichkeit, einen kreisförmigen DMA-Stream nach einer festen Anzahl von Zyklen zu stoppen?

Antwort

0

Aktivieren Sie DMA im normalen Modus und legen Sie die Anzahl der Elemente auf 27 fest.

Später deaktivieren Speichererhöhung für Speicher und für Peripheriegeräte und Ihr Ansatz funktioniert.