aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32l0/src
diff options
context:
space:
mode:
authorceekdee <[email protected]>2023-04-21 01:20:46 -0500
committerceekdee <[email protected]>2023-04-21 01:20:46 -0500
commit02c86bca5275328a15376176ff44487ab7655866 (patch)
tree4f4c3c76261e95e389219b7732cfe6da5777de98 /examples/stm32l0/src
parentfb27594b2eb2cca2aea25dd92a7b730c185b6ecc (diff)
Add external LoRa physical layer functionality.
Diffstat (limited to 'examples/stm32l0/src')
-rw-r--r--examples/stm32l0/src/bin/lora_p2p_receive.rs120
1 files changed, 120 insertions, 0 deletions
diff --git a/examples/stm32l0/src/bin/lora_p2p_receive.rs b/examples/stm32l0/src/bin/lora_p2p_receive.rs
new file mode 100644
index 000000000..a5c5f75ea
--- /dev/null
+++ b/examples/stm32l0/src/bin/lora_p2p_receive.rs
@@ -0,0 +1,120 @@
1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
2//! It demonstrates LORA P2P receive functionality.
3#![no_std]
4#![no_main]
5#![macro_use]
6#![feature(type_alias_impl_trait)]
7
8use defmt::*;
9use embassy_executor::Spawner;
10use embassy_lora::iv::Stm32l0InterfaceVariant;
11use embassy_stm32::exti::{Channel, ExtiInput};
12use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
13use embassy_stm32::spi;
14use embassy_stm32::time::khz;
15use embassy_time::{Delay, Duration, Timer};
16use lora_phy::mod_params::*;
17use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
18use lora_phy::LoRa;
19use {defmt_rtt as _, panic_probe as _};
20
21#[embassy_executor::main]
22async fn main(_spawner: Spawner) {
23 let mut config = embassy_stm32::Config::default();
24 config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
25 config.rcc.enable_hsi48 = true;
26 let p = embassy_stm32::init(config);
27
28 // SPI for sx1276
29 let spi = spi::Spi::new(
30 p.SPI1,
31 p.PB3,
32 p.PA7,
33 p.PA6,
34 p.DMA1_CH3,
35 p.DMA1_CH2,
36 khz(200),
37 spi::Config::default(),
38 );
39
40 let nss = Output::new(p.PA15.degrade(), Level::High, Speed::Low);
41 let reset = Output::new(p.PC0.degrade(), Level::High, Speed::Low);
42
43 let irq_pin = Input::new(p.PB4.degrade(), Pull::Up);
44 let irq = ExtiInput::new(irq_pin, p.EXTI4.degrade());
45
46 let iv = Stm32l0InterfaceVariant::new(nss, reset, irq, None, None).unwrap();
47
48 let mut delay = Delay;
49
50 let mut lora = {
51 match LoRa::new(SX1276_7_8_9::new(BoardType::Stm32l0Sx1276, spi, iv), false, &mut delay).await {
52 Ok(l) => l,
53 Err(err) => {
54 info!("Radio error = {}", err);
55 return;
56 }
57 }
58 };
59
60 let mut debug_indicator = Output::new(p.PB5, Level::Low, Speed::Low);
61 let mut start_indicator = Output::new(p.PB6, Level::Low, Speed::Low);
62
63 start_indicator.set_high();
64 Timer::after(Duration::from_secs(5)).await;
65 start_indicator.set_low();
66
67 let mut receiving_buffer = [00u8; 100];
68
69 let mdltn_params = {
70 match lora.create_modulation_params(SpreadingFactor::_10, Bandwidth::_250KHz, CodingRate::_4_8, 903900000) {
71 Ok(mp) => mp,
72 Err(err) => {
73 info!("Radio error = {}", err);
74 return;
75 }
76 }
77 };
78
79 let rx_pkt_params = {
80 match lora.create_rx_packet_params(4, false, receiving_buffer.len() as u8, true, false, &mdltn_params) {
81 Ok(pp) => pp,
82 Err(err) => {
83 info!("Radio error = {}", err);
84 return;
85 }
86 }
87 };
88
89 match lora
90 .prepare_for_rx(&mdltn_params, &rx_pkt_params, None, true, false, 0, 0x00ffffffu32)
91 .await
92 {
93 Ok(()) => {}
94 Err(err) => {
95 info!("Radio error = {}", err);
96 return;
97 }
98 };
99
100 loop {
101 receiving_buffer = [00u8; 100];
102 match lora.rx(&rx_pkt_params, &mut receiving_buffer).await {
103 Ok((received_len, _rx_pkt_status)) => {
104 if (received_len == 3)
105 && (receiving_buffer[0] == 0x01u8)
106 && (receiving_buffer[1] == 0x02u8)
107 && (receiving_buffer[2] == 0x03u8)
108 {
109 info!("rx successful");
110 debug_indicator.set_high();
111 Timer::after(Duration::from_secs(5)).await;
112 debug_indicator.set_low();
113 } else {
114 info!("rx unknown packet");
115 }
116 }
117 Err(err) => info!("rx unsuccessful = {}", err),
118 }
119 }
120}