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 ....

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.