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