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