Hallo Leute,
evtl. hat von euch einer eine Idee was hier faul sein könnte.
Ich habe eine simple DMA Übertragung von einem Array im RAM zum
UART, so nun ist es so, dass wenn ich die 1000 Werte die jeweils darin
liegen per for schleife rüberschaufle immer sauber ankommen.
Wenn ich die 1000 Werte per DMA zum UART schaufeln lasse, dann überträgt
er meißt die ersten 400 - 800 Werte einwandfrei, die restlichen Werte
sind nullen...
Dieses Verhalten ist komplett sporadisch, ich hab im RAM direkt schon
nachgesehen, alle werte stehen am richtigen platz und sind vorhanden.
Was könnte dieses Verhalten hervorrufen?
Hier mein DMA Code:
1 | DMA_DeInit(DMA1_Stream4); //Am Anfang deinit um wiederholten transfer zu ermöglichen
|
2 |
|
3 | DMA_InitTypeDef DMA_InitStruct;
|
4 |
|
5 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); //Clock einschalten DMA1
|
6 |
|
7 |
|
8 | DMA_InitStruct.DMA_Channel = DMA_Channel_4; //DMA1 Channel 4 Stream 4
|
9 | DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(UART4->DR); //Senke UART4 Datenregister
|
10 | DMA_InitStruct.DMA_Memory0BaseAddr = BaseAddr; //Quelle Datenarray
|
11 | DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripheral; //Richtung Speicher zum UART
|
12 | DMA_InitStruct.DMA_BufferSize = 2000; //x Bytes übertragen
|
13 | DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //UART Datenregister Statisch
|
14 | DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; //im array weiterzählen
|
15 | DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //nur ein byte immer (UART 8 bit modus)
|
16 | DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //nur ein byte immer holen##############################
|
17 | DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; //wiederholend???
|
18 | DMA_InitStruct.DMA_Priority = DMA_Priority_High; //Priorität
|
19 | DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; //FIFO aus
|
20 | DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //nur bei aktivem FIFO benötigt
|
21 | DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single; //ununterbrechbare transfermenge je zyklus
|
22 | DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //ununterbrechbare transfermenge je zyklus
|
23 |
|
24 | DMA_Init(DMA1_Stream4, &DMA_InitStruct);
|
25 |
|
26 | DMA_Cmd(DMA1_Stream4, ENABLE); //DMA einschalten... Übertragung starten...
|
Noch ein paar infos zur Applikation, die DMA Übertragung eines gleich
großen Arrays mit konstanten werten funktioniert auch ohne probleme.
Der sporadische Kommunikationsfehler tritt nur bei einem variablen Array
auf, das Array wird in einer Interruptroutine mit den ADC Werten
gefüllt. Der DMA überträgt dieses Array nicht komplett obwohl es im RAM
laut debugger komplett gefüllt ist.
Zur gleichen zeit ist es möglich das Array mit den konstanten Werten
ohne probleme zu übertragen.
Ich bin am verzweifeln, wenn das Array im RAM sauber zu lesen ist, dann
muss es der DMA doch auch ohne probleme übertragen können.
Vielen Dank für eure Antworten