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
http://www.diller-technologies.de/stm32_wide.html#spi_dma Das muss nur noch für deine Zwecke angepasst werden.
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
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?
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
>Nachtrag: SPI1 habe ich auf 8bit gestellt. Und es sollte auch so >bleiben. Dann muss dein MemoryBuffer auch uint8_t werden.
So wie ich das DM00031020.pdf Seite 312 Table 48 sehe sollte es auch so gehen das Source 16bit und Dest 8bit ist.
>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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.