Forum: Mikrocontroller und Digitale Elektronik STM32H743ZI Nucleo SPI1 mit HAL funktioniert nicht


von Dabidududuu (Gast)


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.

von Johannes S. (Gast)


Lesenswert?

Dabidududuu schrieb:
> PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;

und wie ist die PLL initialisiert? Mal Code mit CubeMX generiert? Für 
einfache Standardschnittstellen kann man dem generierten Code schon 
vertrauen.

von jo mei (Gast)


Lesenswert?

Johannes S. schrieb:
> und wie ist die PLL initialisiert?

Das ist doch voll der Käse an der Taktkonfiguration zu suchen wenn
er berichtet:

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

Dann läuft die Takt-Maschinerie ja prinzipiell.

von Johannes S. (Gast)


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?

von jo mei (Gast)


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.

von jo mei (Gast)


Lesenswert?

Dabidududuu schrieb:
> Über jeden Tipp bin ich sehr dankbar.

Poste hier ein Minimal-Projekt mit dem man den Fehler nachvollziehen
kann. Ich habe 743ZI Nucleos zum Testen, könnte also ggf. helfen.

von Johannes S. (Gast)


Lesenswert?

jo mei schrieb:
> Es könnte da ein Konfigurations- oder Verwechslungs-Problem
> beim TO vorhanden sein.

dagegen spricht:

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

zumindest wenn von der CPU aus gemessen wurde.

von jo mei (Gast)


Lesenswert?

jo mei schrieb:
> Nachdem alles (Clock, MOSI, MISO, CS) von der Gültigkeit des
> SPI-Handles abhängig ist

Ok ich nehm einen Teil zurück ... der CS wird "soft" ausgeführt,
ist also nicht von der SPI Maschine abgeleitet.

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.