Forum: Mikrocontroller und Digitale Elektronik STM32F303 plötzlich keinen SPI Clock mehr


von Werner P. (werner4096)


Lesenswert?

Hallo zusammen.

Habe hier ein kurioses Problem. Spiele gerade mit einem STM32F303 und 
RFM95 Modul. Anfangs lief alles wie es soll. Doch plötzlich habe ich 
Probleme mit dem SPI Clock.

Wenn das RFM95 Modul dran ist dann sehe ich CS, MOSI aber keinen Clock. 
Nehme ich das RFM95 Modul vom Bus dann habe ich Clock.

Jetzt habe ich noch ein anderes STM32F303 Boards und mehrere RFM95 
probiert. Immer das gleiche Problem.

Da das RFM95 Modul an einem Atmega328P ohne Probleme funktioniert gehe 
ich davon aus dass meine 2 STM32F303 defekt sind.

Hatte schon mal einer solch ein Problem?

Ich programmiere mit STM32CubeIDE.

Die Initialsierung von SPI:
1
static void MX_SPI1_Init(void)
2
{
3
4
  /* USER CODE BEGIN SPI1_Init 0 */
5
6
  /* USER CODE END SPI1_Init 0 */
7
8
  /* USER CODE BEGIN SPI1_Init 1 */
9
10
  /* USER CODE END SPI1_Init 1 */
11
  /* SPI1 parameter configuration*/
12
  hspi1.Instance = SPI1;
13
  hspi1.Init.Mode = SPI_MODE_MASTER;
14
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
15
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
16
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
17
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
18
  hspi1.Init.NSS = SPI_NSS_SOFT;
19
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
20
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
21
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
22
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
23
  hspi1.Init.CRCPolynomial = 7;
24
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
25
  {
26
    Error_Handler();
27
  }
28
  /* USER CODE BEGIN SPI1_Init 2 */
29
30
  /* USER CODE END SPI1_Init 2 */
31
}

Und in der main.c die Initialisierung
1
  /* Initialize all configured peripherals */
2
  MX_GPIO_Init();
3
  MX_SPI1_Init();
4
  MX_TIM2_Init();
5
  MX_USART1_UART_Init();
6
  /* USER CODE BEGIN 2 */
7
  HAL_TIM_Base_Start_IT(&htim2);
8
  __HAL_SPI_ENABLE(&hspi1);

Kann mir eigentlich nur vorstellen dass durch das rumprobieren die Clock 
Ports Hops gegangen sind.

Danke und Grüße

von STM Apprentice (Gast)


Lesenswert?

Werner P. schrieb:
> Kann mir eigentlich nur vorstellen dass durch das rumprobieren die Clock
> Ports Hops gegangen sind.

Nein es wird an der Initialisierung deiner SPI Pins liegen.

Die Initialisierung hast du uns ja nicht gezeigt.

von Werner P. (werner4096)


Angehängte Dateien:

Lesenswert?

ok, hier noch die SystemClock_Config und
die MX_GPIO Init Funktion
1
void SystemClock_Config(void)
2
{
3
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
4
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
5
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
6
7
  /** Initializes the CPU, AHB and APB busses clocks 
8
  */
9
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
10
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
11
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
12
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
13
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
14
  {
15
    Error_Handler();
16
  }
17
  /** Initializes the CPU, AHB and APB busses clocks 
18
  */
19
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
20
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
21
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
22
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
23
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
24
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
25
26
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
27
  {
28
    Error_Handler();
29
  }
30
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
31
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
32
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
33
  {
34
    Error_Handler();
35
  }
36
}
1
static void MX_GPIO_Init(void)
2
{
3
  GPIO_InitTypeDef GPIO_InitStruct = {0};
4
5
  /* GPIO Ports Clock Enable */
6
  __HAL_RCC_GPIOF_CLK_ENABLE();
7
  __HAL_RCC_GPIOA_CLK_ENABLE();
8
  __HAL_RCC_GPIOB_CLK_ENABLE();
9
10
  /*Configure GPIO pin Output Level */
11
  HAL_GPIO_WritePin(GPIOA, RST_Pin|NSS_Pin, GPIO_PIN_SET);
12
13
  /*Configure GPIO pin Output Level */
14
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
15
16
  /*Configure GPIO pins : RST_Pin NSS_Pin */
17
  GPIO_InitStruct.Pin = RST_Pin|NSS_Pin;
18
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
19
  GPIO_InitStruct.Pull = GPIO_NOPULL;
20
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
21
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
22
23
  /*Configure GPIO pin : LED_Pin */
24
  GPIO_InitStruct.Pin = LED_Pin;
25
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
26
  GPIO_InitStruct.Pull = GPIO_NOPULL;
27
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
28
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
29
30
  /*Configure GPIO pins : DIO0_Pin DIO1_Pin DIO2_Pin */
31
  GPIO_InitStruct.Pin = DIO0_Pin|DIO1_Pin|DIO2_Pin;
32
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
33
  GPIO_InitStruct.Pull = GPIO_NOPULL;
34
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
35
36
  /* EXTI interrupt init*/
37
  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
38
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
39
40
}

Das Zeugs wird ja durch STM32CubeIDE generiert. Und vorher lief es ja.

Edit: das Witzige ist ja das ich Clock habe wenn ich nichts am Bus 
angeschlossen habe.

: Bearbeitet durch User
von STM Apprentice (Gast)


Lesenswert?

Werner P. schrieb:
> Und vorher lief es ja.

Vor was lief es?

Ich sehe keine GPIO-Initialisierung der SPI Pins.

von Werner P. (werner4096)


Lesenswert?

STM Apprentice schrieb:
> Werner P. schrieb:
>> Und vorher lief es ja.
>
> Vor was lief es?
>
> Ich sehe keine GPIO-Initialisierung der SPI Pins.

Ich habe in einer Funktion eine Änderung vorgenommen welche aber nichts 
mit SPI zu tun hat. Und danach lief es nicht mehr. Ich sags ja. Kurios.

Ehrlich gesagt ich sehe auch keine. Habe aber in anderen Projekten, in 
welchen ich SPI verwende, nachgesehen und da sehe ich auch keine 
Initialiserung der SPI Ports. MOSI, MISO und CLK

Denke das liegt an STM32CubeIDE. Möglichweise werden die an anderer 
Stelle konfiguriert. keine Ahnung.

: Bearbeitet durch User
von STM Apprentice (Gast)


Lesenswert?

Werner P. schrieb:
> Denke das liegt an STM32CubeIDE. Möglichweise werden die an anderer
> Stelle konfiguriert. keine Ahnung.

Schau im CubeMX *.ioc nach (unter GPIO) ob die SPI Pins vorkommen.
Irgendwo brauchen die ja eine Spezifikation (Speed, Input/Output ...)
wie sie wirken sollen.

von Glutenfreier laktoseintoleranter Frutarier (Gast)


Lesenswert?

Evt. solltest du dich mal mit Versionskontrolle wie z.B. GIT 
beschäftigen.

von W.S. (Gast)


Lesenswert?

Werner P. schrieb:
> Wenn das RFM95 Modul dran ist dann sehe ich CS, MOSI aber keinen Clock.
> Nehme ich das RFM95 Modul vom Bus dann habe ich Clock.

Und wo hängt dann dein Clock-Signal? Low oder high? Hänge doch anstelle 
deines Moduls einfach mal nen Widerstand dran und schau, wie es dann 
aussieht.

Wenn ich mich recht erinnere, dann kann man bei all den Portpins die 
Treiberstärke einstellen. Das heißt dann 2, 10 oder 50 MHz oder so 
ähnlich. 2 MHz ist dabei der schlappeste Ausgangstreiber.

W.S.

von STM Apprentice (Gast)


Lesenswert?

W.S. schrieb:
> 2 MHz ist dabei der schlappeste Ausgangstreiber.

Auch in der "schlappesten" Version muss so ein Pin einige
(wenn nicht zig) Milliampere treiben können.

von Werner P. (werner4096)


Lesenswert?

W.S. schrieb:
> Werner P. schrieb:
>> Wenn das RFM95 Modul dran ist dann sehe ich CS, MOSI aber keinen Clock.
>> Nehme ich das RFM95 Modul vom Bus dann habe ich Clock.
>
> Und wo hängt dann dein Clock-Signal? Low oder high? Hänge doch anstelle
> deines Moduls einfach mal nen Widerstand dran und schau, wie es dann
> aussieht.
>
> Wenn ich mich recht erinnere, dann kann man bei all den Portpins die
> Treiberstärke einstellen. Das heißt dann 2, 10 oder 50 MHz oder so
> ähnlich. 2 MHz ist dabei der schlappeste Ausgangstreiber.
>
> W.S.

mit den Widerständen habe ich auch schon probiert. Aber wie gesagt. Wenn 
nichts am Bus ist dann habe ich ja Clock!

Übrigens. Die SPI Ports werden in der stm32fxx_hal_msp.c intialisiert.
1
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
2
{
3
  GPIO_InitTypeDef GPIO_InitStruct = {0};
4
  if(hspi->Instance==SPI1)
5
  {
6
  /* USER CODE BEGIN SPI1_MspInit 0 */
7
8
  /* USER CODE END SPI1_MspInit 0 */
9
    /* Peripheral clock enable */
10
    __HAL_RCC_SPI1_CLK_ENABLE();
11
  
12
    __HAL_RCC_GPIOA_CLK_ENABLE();
13
    /**SPI1 GPIO Configuration    
14
    PA5     ------> SPI1_SCK
15
    PA6     ------> SPI1_MISO
16
    PA7     ------> SPI1_MOSI 
17
    */
18
    GPIO_InitStruct.Pin = SPI1_SCK_Pin|SPI1_MISO_Pin|SPI1_MOSI_Pin;
19
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
20
    GPIO_InitStruct.Pull = GPIO_NOPULL;
21
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
22
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
23
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
24
25
  /* USER CODE BEGIN SPI1_MspInit 1 */
26
27
  /* USER CODE END SPI1_MspInit 1 */
28
  }
29
30
}

Die Funktion wird auch aufgerufen.

Also. ich habe nach wie vor den Verdacht dass meine beiden Boards 
hinüber sind. Werde mir neue besorgen und dann berichten.

von (Gast)


Lesenswert?

Werner P. schrieb:
> mit den Widerständen habe ich auch schon probiert. Aber wie gesagt. Wenn
> nichts am Bus ist dann habe ich ja Clock!

Ganz klar ist das jetzt nicht. Wie wurde "dann habe ich ja Clock" 
gemessen? Oszi? Ist mit Widerständen (welchen, wie gschaltet) jetzt ein 
Taktsignal zu sehen oder nicht? auch kein "kleines"?

von STM Apprentice (Gast)


Lesenswert?

Werner P. schrieb:
> Also. ich habe nach wie vor den Verdacht dass meine beiden Boards
> hinüber sind.

Nein, ich denke nicht.

Eher hast du ein Problem das du deinen schnellen Clock (wegen
falscher Einstellnug) nicht messen kannst.

Mit

Werner P. schrieb:
> hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;

hast du ja je nach Clock-Konfiguration einen ziemlich hoch-
frequenten SPI-Clock auf den du a) vielleicht nicht sicher
triggerst oder b) dein "Messgerät" die Frequenz gar nicht
richtig verträgt / darstellen kann.

von Werner P. (werner4096)


Angehängte Dateien:

Lesenswert?

rµ schrieb:
> Werner P. schrieb:
>> mit den Widerständen habe ich auch schon probiert. Aber wie gesagt. Wenn
>> nichts am Bus ist dann habe ich ja Clock!
>
> Ganz klar ist das jetzt nicht. Wie wurde "dann habe ich ja Clock"
> gemessen? Oszi? Ist mit Widerständen (welchen, wie gschaltet) jetzt ein
> Taktsignal zu sehen oder nicht? auch kein "kleines"?

Am SPI Bus habe ich einen Logic Analyzer (Scaleo) dran.

1. RFM95 Modul dran. Zu sehen ist MOSI und CS. CLK ist LOW. MISO ist LOW 
da keine Daten.

2. RFM95 Modul weg. Zu sehen ist MOSI,CLK und CS. MISO ist LOW da keine 
Daten.

3. Pulldown Widerstand 2,2K an CLK. kein CLK.

4. Pullup Widerstand 2,2K an CLK. kein CLK.

spi_1.png = kein CLK (wenn RFM95 am Bus)
spi_2.png = CLK (wenn nichts am Bus)

von Werner P. (werner4096)


Lesenswert?

Sorry vertan.

Muss heissen:

3. Pulldown Widerstand 2,2K an CLK. CLK da. wenn nichts am Bus.

4. Pullup Widerstand 2,2K an CLK. CLK da wenn nichts am Bus.

: Bearbeitet durch User
von (Gast)


Lesenswert?

Und der RFM95 ist in Ordnung und auch richtig angeschlossen? Wenn der 
CLK auf GND legt ists natürlich tot....

von STM Apprentice (Gast)


Lesenswert?

Werner P. schrieb:
> Am SPI Bus habe ich einen Logic Analyzer (Scaleo) dran.

Hast du einen Masseanschluss deines Logic Analyzers fest mit
dem Controller verbunden?

Welche Logik-Schwelle hast du für den Trigger eingestellt?

von Werner P. (werner4096)


Lesenswert?

Ja alles richtig angeschlossen. Schwellwert kann ich jetzt auf die 
Schnelle nicht ermitteln. Auf dem Oszi sehen die gut aus.

von Werner P. (werner4096)


Lesenswert?

zur Info.

die beiden Boards scheinen echt ne Macke zu haben. Jetzt hab ich 
testweise ein STM32L073 Board und es funktioniert.

Danke an alle für die Unterstützung

von Wende 2.0 (Gast)


Lesenswert?

Werner P. schrieb:
> die beiden Boards scheinen echt ne Macke zu haben. Jetzt hab ich
> testweise ein STM32L073 Board und es funktioniert.

Das ist so gut wie nie der Fall.

von Werner P. (werner4096)


Lesenswert?

Wende 2.0 schrieb:
> Werner P. schrieb:
>> die beiden Boards scheinen echt ne Macke zu haben. Jetzt hab ich
>> testweise ein STM32L073 Board und es funktioniert.
>
> Das ist so gut wie nie der Fall.

Aber nur so "gut wie nie".

Was soll ich sagen. Im Debug Modus bin ich durch die Initialisierung von 
SPI. Da passt alles.

Bei beiden Projekte (F303 und L073) wurden die Init Routinen von 
STM32CubeIDE erstellt. Die passen auch.

Mehr kann ich dazu nicht sagen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Werner P. schrieb:
> Bei beiden Projekte (F303 und L073) wurden die Init Routinen von
> STM32CubeIDE erstellt.

Was noch nicht garantiert, dass sie in beiden Fällen fehlerfrei sind.

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.