diff options
| author | ceekdee <[email protected]> | 2023-04-21 01:20:46 -0500 |
|---|---|---|
| committer | ceekdee <[email protected]> | 2023-04-21 01:20:46 -0500 |
| commit | 02c86bca5275328a15376176ff44487ab7655866 (patch) | |
| tree | 4f4c3c76261e95e389219b7732cfe6da5777de98 /examples/stm32l0/src | |
| parent | fb27594b2eb2cca2aea25dd92a7b730c185b6ecc (diff) | |
Add external LoRa physical layer functionality.
Diffstat (limited to 'examples/stm32l0/src')
| -rw-r--r-- | examples/stm32l0/src/bin/lora_p2p_receive.rs | 120 |
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 | |||
| 8 | use defmt::*; | ||
| 9 | use embassy_executor::Spawner; | ||
| 10 | use embassy_lora::iv::Stm32l0InterfaceVariant; | ||
| 11 | use embassy_stm32::exti::{Channel, ExtiInput}; | ||
| 12 | use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed}; | ||
| 13 | use embassy_stm32::spi; | ||
| 14 | use embassy_stm32::time::khz; | ||
| 15 | use embassy_time::{Delay, Duration, Timer}; | ||
| 16 | use lora_phy::mod_params::*; | ||
| 17 | use lora_phy::sx1276_7_8_9::SX1276_7_8_9; | ||
| 18 | use lora_phy::LoRa; | ||
| 19 | use {defmt_rtt as _, panic_probe as _}; | ||
| 20 | |||
| 21 | #[embassy_executor::main] | ||
| 22 | async 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 | } | ||
