Forum: Mikrocontroller und Digitale Elektronik STM32F4 SPI Aussetzer bei Verwendung mehrere SPI Kanäle


von Julian B. (luhlen)


Angehängte Dateien:

Lesenswert?

Servus,

ich benutze das STM32F429 DiscoveryII (mit STM32F429ZIT6UV) und möchte 
die selben Daten über 3 unterschiedliche SPI Kanäle parallel senden. Ich 
sende im Interruptmode mit Baudrateprescaler_32 -> also mit 2,5MBit/s.
Ich benute die SPI Kanäle 1,4,5 im send only master mode und führe die 
HAL_SPI_Transmit_IT dreimal nacheinander aus. Ebenfalls sind die Kanäle 
identisch parametriert.

Ich bin gespannt, was ich falsch mache;)
Bei weiteren Fragen, Anregungen,... nur her damit.

Viele Grüße
Julian

von DerDan (Gast)


Lesenswert?

Nutzt du die cube lib?
bzw. zeig den Code ...

Die Cube lib wartet bei manchen Bussen (bei SPI bin ich nicht sicher) 
innerhalb des Interrupts auf das senden der lezten Bytes.


Also evtl. nicht dein Fehler sondern ST :-)

mfg

DerDan

von Stephan (Gast)


Lesenswert?

Julian B. schrieb:
> Ich bin gespannt, was ich falsch mache;)

Du sendest die Daten mit Hilfe der CPU (TX-INT), und glaubst das diese 
nur für deine SPI Transmission da ist.

Meine Glaskugel sagt: Das ist kein Fehler, du hast noch andere INTs 
aktiviert. Einer hatte gerade für die ca. 10us(Bild) die CPU anderweitig 
beschäftigt!

>Bei weiteren Fragen, Anregungen,... nur her damit.
Wenn du eine DMA Senderoutine nimmst, sollte diese Effekt nicht 
auftreten.

ohne weitere Infos kann man sonst nicht viel sagen.....

von Julian B. (luhlen)


Lesenswert?

Hi,
vielen Dank schon mal für den Input.
Ja ich benutze die Cube Lib, anbei ist mein Code.
Bis auf den Ticktimer sind aber sonst alle Interrupts raus.
1
/* Includes ------------------------------------------------------------------*/
2
#include "stm32f4xx_hal.h"
3
4
/* USER CODE BEGIN Includes */
5
#include "stm32f429i_discovery.h" //for easy use of Buttons and LEDs on discovery Board
6
/* USER CODE END Includes */
7
8
/* Private variables ---------------------------------------------------------*/
9
SPI_HandleTypeDef hspi1;
10
SPI_HandleTypeDef hspi4;
11
SPI_HandleTypeDef hspi5;
12
13
SDRAM_HandleTypeDef hsdram1;
14
15
/* USER CODE BEGIN PV */
16
/* Size of buffer */
17
#define BUFFERSIZE1                       (COUNTOF(aTxBuffer1))
18
/* Exported macro ------------------------------------------------------------*/
19
#define COUNTOF(__BUFFER__)   (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
20
/* Buffer used for transmission */
21
uint16_t aTxBuffer = 0;                            //Transmit Buffer in transmit function HAL_SPI_Transmit() for all SPIchannels    
22
uint16_t aTxBuffer1[] = {0x0016,0x0027,0x00FF,0xFFFF,0x0000,0x0283};              //Data Buffer for SPI1
23
HAL_SPI_StateTypeDef  state, state2;
24
uint32_t ErrorCode;
25
/* USER CODE END PV */
26
27
/* Private function prototypes -----------------------------------------------*/
28
void SystemClock_Config(void);
29
static void MX_GPIO_Init(void);
30
static void MX_FMC_Init(void);
31
static void MX_SPI1_Init(void);
32
static void MX_SPI4_Init(void);
33
static void MX_SPI5_Init(void);
34
35
/* USER CODE BEGIN PFP */
36
37
static void Error_Handler(void);
38
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
39
40
/* USER CODE END PFP */
41
42
/* USER CODE BEGIN 0 */
43
44
/* USER CODE END 0 */
45
46
int main(void)
47
{
48
49
  /* USER CODE BEGIN 1 */
50
51
  /* USER CODE END 1 */
52
53
  /* MCU Configuration----------------------------------------------------------*/
54
55
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
56
  HAL_Init();
57
58
  /* Configure the system clock */
59
  SystemClock_Config();
60
61
  /* Initialize all configured peripherals */
62
  MX_GPIO_Init();
63
  MX_FMC_Init();
64
  MX_SPI1_Init();
65
  MX_SPI4_Init();
66
  MX_SPI5_Init();
67
68
  /* USER CODE BEGIN 2 */
69
  /* --------------------------------------Configure LED3 and LED4 */
70
  BSP_LED_Init(LED3);
71
  BSP_LED_Init(LED4);
72
  
73
  /* Configure USER Button */
74
  BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);
75
76
  /* Wait for USER Button press before starting the Communication */
77
  while (BSP_PB_GetState(BUTTON_KEY) != 1)
78
  {
79
    BSP_LED_Toggle(LED3);
80
    HAL_Delay(40);
81
  }
82
    BSP_LED_Off(LED3);
83
84
  if (HAL_SPI_Transmit_IT(&hspi1, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){
85
      
86
  }
87
  if (HAL_SPI_Transmit_IT(&hspi4, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){
88
      
89
  }  
90
  if (HAL_SPI_Transmit_IT(&hspi5, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){
91
      
92
  }  
93
    while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){
94
      
95
    }
96
97
  /* USER CODE END 2 */
98
99
  /* USER CODE BEGIN 3 */
100
  /* Infinite loop */
101
  while (1)
102
  {
103
  }
104
  /* USER CODE END 3 */
105
106
}
107
108
/** System Clock Configuration
109
*/
110
void SystemClock_Config(void)
111
{
112
113
  RCC_OscInitTypeDef RCC_OscInitStruct;
114
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
115
116
  __PWR_CLK_ENABLE();
117
118
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
119
120
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
121
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
122
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
123
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
124
  RCC_OscInitStruct.PLL.PLLM = 8;
125
  RCC_OscInitStruct.PLL.PLLN = 336;
126
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
127
  RCC_OscInitStruct.PLL.PLLQ = 7;
128
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
129
130
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
131
                              |RCC_CLOCKTYPE_PCLK2;
132
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
133
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
134
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
135
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
136
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
137
138
}
139
140
/* SPI1 init function */
141
void MX_SPI1_Init(void)
142
{
143
144
  hspi1.Instance = SPI1;
145
  hspi1.Init.Mode = SPI_MODE_MASTER;
146
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
147
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
148
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
149
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
150
  hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
151
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
152
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
153
  hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
154
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
155
  HAL_SPI_Init(&hspi1);
156
157
}

die weiteren beiden SPI init functions sind die selben, nur für SPI4&5, 
GPIO inits habe ich Euch mal erspart.

Vielen Dank für die Hilfe

von Julian B. (Gast)


Lesenswert?

Dear Julian,

I suggest to use DMA transfer. In attachement, you can find tested 
example, based on STM32F429I-DISCO board, SPI3,SPI4,SPI5 were used. 
Please, generate project source by CubeMX tool and attached project.ioc 
file and then follow the attached main.c file.

Best regards,
Bartosz

ST-Support Antwort;) Alles klar

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.