Forum: Mikrocontroller und Digitale Elektronik STM32WL kein Signal auf MISO-Leitung bei SUBGHZ SPI


von Manuel N. (manuelambaum)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich versuche, eine SPI-Kommunikation mit dem integrierten 
LoRa-Transceiver des STM32WL einzurichten. Die NSS,MOSI und 
SCK-Datenleitungen scheinen zu funktionieren, jedoch erhalte ich keine 
Rückmeldung des LoRa-Transceivers auf der MISO-Leitung.

Mein Code ist der folgende:
1
 void SUBGHZSPI_DebugEnable(void) {
2
  RCC->AHB2ENR |= (1U << 0);    //enable GPIO-A
3
4
  GPIOA->MODER &= ~(3U << 8);    //reset PA4
5
  GPIOA->MODER |= (2U <<   8);    //set PA4
6
7
  GPIOA->MODER &= ~(3U << 10);  //reset PA5
8
  GPIOA->MODER |= (2U << 10);    //set PA5
9
10
  GPIOA->MODER &= ~(3U << 12);  //reset PA6
11
  GPIOA->MODER |= (2U << 12);    //set PA6
12
13
  GPIOA->MODER &= ~(3U << 14);  //reset PA7
14
  GPIOA->MODER |= (2U << 14);    //set PA7
15
16
  GPIOA->AFR[0] &= ~(15U<<16);  //reset AF of PA4
17
  GPIOA->AFR[0] |= (13U<<16);    //set AF13 of PA4
18
19
  GPIOA->AFR[0] &= ~(15U<<20);  //reset AF of PA5
20
  GPIOA->AFR[0] |= (13U<<20);    //set AF13 of PA5
21
22
  GPIOA->AFR[0] &= ~(15U<<24);  //reset AF of PA6
23
  GPIOA->AFR[0] |= (13U<<24);    //set AF13 of PA6
24
25
  GPIOA->AFR[0] &= ~(15U<<28);  //reset AF of PA7
26
  GPIOA->AFR[0] |= (13U<<28);    //set AF13 of PA7
27
28
  GPIOA->OSPEEDR |= (3U << 8);  //set output speed for PA4 to HIGH speed
29
  GPIOA->OSPEEDR |= (3U << 10);  //set output speed for PA5 to HIGH speed
30
  GPIOA->OSPEEDR |= (3U << 12);  //set output speed for PA6 to HIGH speed
31
  GPIOA->OSPEEDR |= (3U << 14);  //set output speed for PA7 to HIGH speed
32
}
33
34
35
36
void SUBGHZSPI_init(void) {
37
38
      RCC->APB3ENR |= (1<<0); // enable SUBGHZ SPI
39
40
      SUBGHZSPI->CR1 |= (1 << 9); // SSM
41
      SUBGHZSPI->CR1 |= (1 << 8); // SSI
42
43
      SUBGHZSPI->CR1 &= ~(7 << 3);
44
      SUBGHZSPI->CR1 |= (1<<3); // baudrate (1MHz)
45
46
      SUBGHZSPI->CR1 |= (1<<2); // Master
47
      SUBGHZSPI->CR1 &= ~(1<<10); // full-duplex
48
49
      SUBGHZSPI->CR2 |= (1<<12); // FIFO threshold 8bit
50
51
      SUBGHZSPI->CR1 |= (1<<6); // enable SPI
52
}

ich rufe diesen code dann vom main.c auf:
1
while(1) {
2
    PWR->SUBGHZSPICR &= ~(1 << 15); // NSS low
3
4
    while (!(SUBGHZSPI->SR & (1 << 1))); // TXE
5
    *(__IO uint8_t*)(&SUBGHZSPI->DR) = 0x13;
6
7
    while (!(SUBGHZSPI->SR & (1 << 0))); // RXNE
8
    uint32_t status = SUBGHZSPI->DR;
9
10
    PWR->SUBGHZSPICR |= (1 << 15); // NSS high
11
  }

Ich kann daten senden und diese ebenfalls mit meinem logic level 
analyzer verifizieren, aber die MISO-Leitung bleibt dauerhaft auf "high" 
(siehe Anhang)

Kann mir jemand sagen, was fehlt oder was ich falsch mache?
Danke im Vorraus

von Harry L. (mysth)


Lesenswert?

Manuel N. schrieb:
> Kann mir jemand sagen, was fehlt oder was ich falsch mache?

Ich sehe da z.B. und u.A. keine Clock-Initialisierung.

Nutz CubeMX und HAL!
ST hat da viel Arbeit investiert, und das funktioniert.

Manuel N. schrieb:
> Danke im Vorraus

Gern geschehen.

von Wastl (hartundweichware)


Lesenswert?

Harry L. schrieb:
> Ich sehe da z.B. und u.A. keine Clock-Initialisierung.

Ich sehe da viele Magic Numbers. Was für ein Grauen ....

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Harry L. schrieb:
> Ich sehe da z.B. und u.A. keine Clock-Initialisierung.

Genau, und RCC_CSR_RFRST wird nicht gelöscht, RCC_CSR_RFRSTF wird nicht 
geprüft.

Harry L. schrieb:
> ST hat da viel Arbeit investiert, und das funktioniert.

Die Ansteuerung des Modems ist tatsächlich relativ komplex, was von der 
SubGHz_Phy-Middleware implementiert wird. Außerdem enthält diese so 
diverse Workarounds für die verschiedenen Hardware-Bugs, und auch 
Software-Implementationen für Whitening und lange Pakete (> 255 bytes).

Leider ist die Middleware dennoch relativ verbuggt, dies muss man erst 
einmal selbst bereinigen damit sie funktioniert. Das ist schon ein 
gewisser Aufwand, aber immer noch viel weniger als das alles komplett 
von Null auf neu zu implementieren. Was im Übrigen genau das ist, was 
die RadioLib macht.

von Rainer W. (rawi)


Lesenswert?

Manuel N. schrieb:
> STM32WL kein Signal auf MISO-Leitung bei SUBGHZ SPI

Ist nicht alles unter 1 GHz irgendwie "SUBGHZ"?
scnr

Wie ist die Zeitskala in SPI_SUBGHZ_debug.png?

von Wastl (hartundweichware)


Lesenswert?

Manuel N. schrieb:
> SUBGHZSPI->CR1 |= (1<<6); // enable SPI

Ich empfehle eine präzisere Bezeichnung für diese Register-
struktur.

z.B.  MeinSPIUnterEinGHZRegisterSatz->CR1 |= (1<<6); // enable SPI

SCNR

von Rahul D. (rahul)


Lesenswert?

Wastl schrieb:
> z.B.  MeinSPIUnterEinGHZRegisterSatz->CR1 |= (1<<6); // enable SPI

und dann auch bitte noch das Bitmakro verwenden. Magic numbers sind 
immer blöd.

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.