STM32H743ZI Nucleo SPI1 mit HAL funktioniert nicht

Gast #6785692
Lesenswert?
• ▲
▼
Ich probiere nun seit bestimmt 8h rum aber ich schaffe es nicht, SPI1 
auf einem Nucleo-144 mit STM32H743ZI zum laufen zu bekommen. Das ist die 
wesentliche Konfiguration:
1
__HAL_RCC_SPI1_CLK_ENABLE();
2
__HAL_RCC_I2C1_CLK_DISABLE();
3

4
__HAL_RCC_GPIOA_CLK_ENABLE();
5
__HAL_RCC_GPIOB_CLK_ENABLE();
6
__HAL_RCC_GPIOD_CLK_ENABLE();
7

8
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
9
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI1;
10
PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;
11
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
12
  std::cout << "[Error] PeriphCLK failed!\r\n";
13
}
14

15
GPIO_InitTypeDef GPIO_InitStruct = {0};
16

17
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
18
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
19
GPIO_InitStruct.Pull = GPIO_NOPULL;
20
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
21
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
22
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
23

24
GPIO_InitStruct.Pin = GPIO_PIN_5;
25
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
26
GPIO_InitStruct.Pull = GPIO_NOPULL;
27
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
28
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
29
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
30

31
/* Chip Select */
32
GPIO_InitStruct = {0};
33
GPIO_InitStruct.Pin = GPIO_PIN_14;
34
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
35
GPIO_InitStruct.Pull = GPIO_NOPULL;
36
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
37
GPIO_InitStruct.Alternate = 0x0;
38
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
39

40
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
41

42
spi_handle.Instance = SPI1;
43
spi_handle.Init.Mode = SPI_MODE_MASTER;
44
spi_handle.Init.Direction = SPI_DIRECTION_2LINES;
45
spi_handle.Init.DataSize = SPI_DATASIZE_8BIT;
46
spi_handle.Init.CLKPolarity = SPI_POLARITY_LOW;
47
spi_handle.Init.CLKPhase = SPI_PHASE_2EDGE;
48
spi_handle.Init.NSS = SPI_NSS_SOFT;
49
spi_handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
50
spi_handle.Init.FirstBit = SPI_FIRSTBIT_MSB;
51
spi_handle.Init.TIMode = SPI_TIMODE_DISABLE;
52
spi_handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
53
spi_handle.Init.CRCPolynomial = 7;
54
spi_handle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
55
spi_handle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
56
spi_handle.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
57
spi_handle.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
58
spi_handle.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
59
spi_handle.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
60
spi_handle.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
61
spi_handle.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
62
spi_handle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
63
spi_handle.Init.IOSwap = SPI_IO_SWAP_DISABLE;
64

65
const HAL_StatusTypeDef ret = HAL_SPI_Init(&spi_handle);
66

67
if(ret != HAL_OK) {
68
  std::cout << "[Error] HAL_SPI_Init failed!\r\n";
69
  exit(-1);
70
}

Nachdem man beim Googlen auf sehr viele Beiträge mit HAL-Problemen stößt 
frag ich mich, ob die Bibliothek überhaupt korrekt funktioniert. 
Allerdings konnte bisher kein Beitrag mein Problem lösen.

Das konkrete Problem ist, dass SCLK / CS zwar funktionieren aber MOSI 
immer auf 0 bleibt.

So läuft die Übertragung ab:
1
uint8_t opcodes[2];
2
opcodes[0] = 0b00100000;
3
opcodes[1] = 0b00000010;
4

5
uint8_t reg_content;
6

7
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
8

9
HAL_SPI_Transmit(&this->spi_handle, opcodes, 2, 250);
10

11
while(HAL_SPI_GetState(&this->spi_handle) != HAL_SPI_STATE_READY);
12

13
HAL_SPI_Receive(&this->spi_handle, &reg_content, 1, 250);
14

15
while(HAL_SPI_GetState(&this->spi_handle) != HAL_SPI_STATE_READY);
16

17
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
18

19
return (reg_content >> 5);

Hab schon mit einem Durchgangsprüfer gecheckt, dass die Pins passen.
Konkret sieht es so aus:
1
PA5 <-> SCLK
2
PA6 <-> MISO
3
PB5 <-> MOSI
4
PD14 <-> CS

Über jeden Tipp bin ich sehr dankbar.
Gast #6785780
Lesenswert?
• ▲
▼
TL;DR. Aber sicher richtig, wird nicht am Takt liegen.
Auch die gezeigte Konfig sieht ok aus, dann ist der Hund eher wie so oft 
im nicht gezeigten Teil begraben.
Es wird ja offensichtlich mit C++ gemischt, da kann man auch diffizile 
Fehler einbauen. Lebt das Objekt mit dem spi_handle noch wenn es benutzt 
wird? Ist der Inhalt da noch gültig? Code mal mit dem define FULL_ASSERT 
übersetzt?
Gast #6785839
Lesenswert?
• ▲
▼
Johannes S. schrieb:
> Lebt das Objekt mit dem spi_handle noch wenn es benutzt
> wird?

Nachdem alles (Clock, MOSI, MISO, CS) von der Gültigkeit des
SPI-Handles abhängig ist und Teile davon funktionieren ist es
äusserst unwahrscheinlich dass "das Objekt mit dem spi_handle"
zerstört oder ungültig gemacht worden ist.

Aber: PB5 (soll ja MOSI sein) kommt zweimal als Pin vor.

Siehe UM1974

Seite 30 --> 6.12 Solder bridges
  und
Seite 66ff --> Table 20. NUCLEO-H743ZI pin assignments

Es könnte da ein Konfigurations- oder Verwechslungs-Problem
beim TO vorhanden sein.

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.