Forum: Mikrocontroller und Digitale Elektronik [STM32F4] DMA -> SPI1


von Markus C. (ljmarkus)


Lesenswert?

Hallo...

ich suche ein Codesnippet um mit dem STM32F407 per DMA nach SPI1 die 
Daten zusenden.

static uint_fast16_t x_buffer[20480];

ist der buffer der gesendet werden soll. Dieser soll immer dauerhaft 
gesendet werden.

SPI1 ist auf 16bit eingestellt.

Hoffe ihr könnt mir helfen.

Danke,
Markus

von Thomas W. (ratos)


Lesenswert?

http://www.diller-technologies.de/stm32_wide.html#spi_dma

Das muss nur noch für deine Zwecke angepasst werden.

von Markus C. (ljmarkus)


Lesenswert?

Die Seite kannte ich noch nicht.

Danke, Markus

von Markus C. (ljmarkus)


Lesenswert?

Hallo,

ich habe jetzt mein DMA so konfiguriert:

1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
2
DMA_InitTypeDef DMA_InitStructure;
3
4
DMA_DeInit(DMA2_Stream5);
5
while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);
6
DMA_StructInit(&DMA_InitStructure);
7
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (SPI1->DR);
8
DMA_InitStructure.DMA_Channel = DMA_Channel_3;
9
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
10
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
11
DMA_InitStructure.DMA_PeripheralInc = 0;
12
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
13
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
14
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
15
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
16
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
17
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
18
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
19
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
20
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)&xbuffer;
21
DMA_InitStructure.DMA_BufferSize = 20480;
22
23
DMA_Init (DMA2_Stream5, &DMA_InitStructure);
24
SPI_I2S_DMACmd (SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
25
DMA_Cmd(DMA2_Stream5, ENABLE); /// TX

nur komme ich jetzt nicht mehr weiter bei den Einstellungen Source & 
Dest Size.

Source:
uint16_t xbuffer[20480]

Dest:
darf aber nur uint8 sein.

Wie müssen die Einstellungen sein damit DMA das 16bit zu 2x8bit ausgibt?


Danke,
Markus

von Thomas W. (ratos)


Lesenswert?

Markus C. schrieb:
> SPI1 ist auf 16bit eingestellt.
Markus C. schrieb:
> DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

Das passt nicht zusammen. Nimm doch einfach 
DMA_PeripheralDataSize_HalfWord. Oder kann man das nicht so machen?

von Markus C. (ljmarkus)


Lesenswert?

Hi also mit
DMA_PeripheralDataSize_HalfWord
ist es auch nix.

Nachtrag: SPI1 habe ich auf 8bit gestellt. Und es sollte auch so 
bleiben.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Nachtrag: SPI1 habe ich auf 8bit gestellt. Und es sollte auch so
>bleiben.

Dann muss dein MemoryBuffer auch uint8_t werden.

von Markus C. (ljmarkus)


Lesenswert?

So wie ich das DM00031020.pdf Seite 312 Table 48 sehe sollte es auch so 
gehen das Source 16bit und Dest 8bit ist.

von holger (Gast)


Lesenswert?

>So wie ich das DM00031020.pdf Seite 312 Table 48 sehe sollte es auch so
>gehen das Source 16bit und Dest 8bit ist.

Macht aber igendwie keinen Sinn, oder? Wieso darf SPI nicht
mit 16Bit laufen?

von Markus R. (maggus)


Lesenswert?

Probier es mal so:

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_BufferSize = 20480 * 2;

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.