STM32 DMA neustarten

OP #4699879
Lesenswert?
• ▲
▼
Guten Tag

Ich versuche den DMA bei einem STM32 welcher als SPI fungiert, während 
der SPI Übertragung neuzustarten.

Das sieht wie folgt aus:

CS ------|____________________|--------
SCK       |||| |||| |||| ||||
DMA         |-----------------

Ein SCK Grüppchen |||| entspricht 8 Clocks bzw. einem Byte
Ich triggere intern auf die 5te Flanke des ersten Bytes und möchte ab da 
für die folgenden Bytes den DMA parat haben, so dass dieser die nächsten 
Bytes sendet.

Dazu habe ich folgenden Code getestet:
1
 void DMA_Config(void)
2
 {
3
   DMA_InitTypeDef  DMA_InitStructure;
4

5
   DMA_DeInit(DMA1_Channel5);
6
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;   //0x4000380C;
7
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&dataSendA[0];
8
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
9
   DMA_InitStructure.DMA_BufferSize = 3;
10
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
11
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
12
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
13
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
14
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
15
   DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
16
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
17
   DMA_Init(DMA1_Channel5, &DMA_InitStructure);
18

19
   //DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
20

21
   DMA_Cmd(DMA1_Channel5, DISABLE);
22

23

24
   //DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
25
   SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
26
 }
27

28

29

30

31

32
.....
33
//Neustarten:
34

35
  //DMA Deaktivieren
36
  DMA1_Channel5->CCR &= (uint16_t)(~DMA_CCR1_EN);
37

38
  //Adresse
39
  DMA1_Channel5->CMAR = (uint32_t)&dataSendA[0];
40

41
        //DMA Counter auf 3 Bytes
42
  DMA1_Channel5->CNDTR = 3;
43

44
        //SPI TX DMA Kanal aktivieren
45
  SPI2->CR2 |= SPI_I2S_DMAReq_Tx;
46

47
  //DMA Aktivieren
48
  DMA1_Channel5->CCR |= DMA_CCR1_EN;

Leider funktioniert dies nicht wie gewünscht.
Das erste Byte ist willkürlich. das zweite stimmt dann das dritte ist 0.

Hat jemand eine Idee?
OP #4699890
Lesenswert?
• ▲
▼
Reginald L. schrieb:
> Vergiss nicht ungelesene Bytes aus dem spi auszulesen

Hab ich...


Hier ist die vollständige routine:
1
void TIM1_CC_IRQHandler(void)
2
{
3

4
  uint8_t cmd;
5
  TIM1->SR = (uint16_t)~TIM_IT_CC1;
6
  //cmd = SPI2->DR;
7

8
  //DMA Deaktivieren
9
  DMA1_Channel5->CCR &= (uint16_t)(~DMA_CCR1_EN);
10

11
  //Adresse
12
  DMA1_Channel5->CMAR = (uint32_t)&dataSendA[0];
13
  DMA1_Channel5->CNDTR = 3;
14

15
  SPI2->CR2 |= SPI_I2S_DMAReq_Tx;
16

17
  //delay(2);
18

19
  //DMA Aktivieren
20
  DMA1_Channel5->CCR |= DMA_CCR1_EN;
21

22
  GPIOC->ODR = 0xFF;
23
  GPIOC->ODR = 0x00;
24
}


Im Anhang das Bild.
Es zeigt, dass ich 0x81, 0x75, 0x27 und 0x03 empfange.
Mein Buffer ist jedoch:
1
uint8_t  dataSendA[10] = {0x75, 0x33, 0x81, 0x01, 0x77, 0x14, 0x41, 0x63, 0x20, 0xAA};

Eine Merkwürdigkeit ist noch, dass wenn ich das Programm mehrmals 
hintereinander flashe, sich der DMA unterschiedlich verhält.
Manchmal sendet der SPI Slave nur 0x00 und dies immer, dann wieder 
0x81,0x75,0x27,0x03
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.