STM32WL kein Signal auf MISO-Leitung bei SUBGHZ SPI

#7909988
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

Angehängte Dateien:
Persönliche Seite #7910156
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.

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