Forum: Mikrocontroller und Digitale Elektronik STM32 F407VGT6 SPI DMA Master


von Steph M. (stephh)


Lesenswert?

Hallo zusammen,

ich hab mir nach dem Beispiel SPI_DataExchangeDMA aus der StdPeriph Lib 
v1.7.1 einen SPI Master auf meinem F407 Discovery aufgebaut. Leider tut 
sich aber nichts. Ich hab den Code mittlerweile mehrmals durchsehen, 
aber ich find den Fehler nicht.

Was erwarte ich: Ich erwarte den String "SPI Master" zu empfangen. Als 
Empfänger verwende ich einen Logikanalyzer, welcher auf eine positive 
Flanke am Clock reagiert. Hier kommmt aber nichts an.

Vielen Dank für eure Hilfe.


Stephan

1
#define BUFFERSIZE_DMA_SPI 100
2
3
uint8_t aTxBuffer[BUFFERSIZE_DMA_SPI] = "SPI Master";
4
uint8_t aRxBuffer[BUFFERSIZE_DMA_SPI];
5
6
7
static void SPI_Config(void) {
8
  // SPI-Clock enable
9
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
10
11
  // Clock Enable der Pins
12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
13
14
  /* Enable DMA clock */
15
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
16
17
  /* Connect SPI pins to AF5 */
18
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
19
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
20
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
21
22
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
23
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
24
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
25
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;          
26
27
  /* SPI SCK PB13, MISO PB14, MOSI PB15 pin configuration */
28
  GPIO_InitStructure.GPIO_Pin = GPIO_PinSource13 | GPIO_PinSource14 | GPIO_PinSource15;
29
  GPIO_Init(GPIOB, &GPIO_InitStructure);
30
31
  /* SPI configuration -------------------------------------------------------*/
32
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
33
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
34
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
35
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
36
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  //kein enable NSS-Pin
37
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
38
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
39
  SPI_InitStructure.SPI_CRCPolynomial = 7;
40
  //SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
41
42
  /* DMA configuration -------------------------------------------------------*/
43
44
  /* Configure DMA Initialization Structure */
45
  DMA_InitStructure.DMA_BufferSize = BUFFERSIZE_DMA_SPI;
46
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
47
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
48
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
49
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
50
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
51
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
52
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR));
53
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
54
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
55
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
56
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
57
  /* Configure TX DMA */
58
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
59
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
60
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) aTxBuffer;
61
  DMA_Init(DMA1_Stream4, &DMA_InitStructure);
62
  /* Configure RX DMA */
63
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
64
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
65
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) aRxBuffer;
66
  /* Initializes the DMA for communication */
67
  DMA_Init(DMA1_Stream3, &DMA_InitStructure);
68
69
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
70
  /* Initializes the SPI communication */
71
  SPI_Init(SPI2, &SPI_InitStructure);
72
73
74
  /* Enable DMA SPI TX Stream */
75
  DMA_Cmd(DMA1_Stream4, ENABLE);
76
77
  /* Enable DMA SPI RX Stream */
78
  DMA_Cmd(DMA1_Stream3, ENABLE);
79
80
  /* Enable SPI DMA TX Requests */
81
  SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
82
83
  /* Enable SPI DMA RX Requests */
84
  SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
85
86
  /* Enable the SPI peripheral */
87
  SPI_Cmd(SPI2, ENABLE);
88
89
}

von 2cnd source (Gast)


Lesenswert?


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.