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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren