111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
 | |
| //! It demonstrates LORA P2P send functionality.
 | |
| #![no_std]
 | |
| #![no_main]
 | |
| #![macro_use]
 | |
| #![feature(type_alias_impl_trait)]
 | |
| 
 | |
| use defmt::*;
 | |
| use embassy_executor::Spawner;
 | |
| use embassy_lora::iv::Stm32l0InterfaceVariant;
 | |
| use embassy_stm32::exti::{Channel, ExtiInput};
 | |
| use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
 | |
| use embassy_stm32::spi;
 | |
| use embassy_stm32::time::khz;
 | |
| use embassy_time::Delay;
 | |
| use lora_phy::mod_params::*;
 | |
| use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
 | |
| use lora_phy::LoRa;
 | |
| use {defmt_rtt as _, panic_probe as _};
 | |
| 
 | |
| const LORA_FREQUENCY_IN_HZ: u32 = 903_900_000; // warning: set this appropriately for the region
 | |
| 
 | |
| #[embassy_executor::main]
 | |
| async fn main(_spawner: Spawner) {
 | |
|     let mut config = embassy_stm32::Config::default();
 | |
|     config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
 | |
|     config.rcc.enable_hsi48 = true;
 | |
|     let p = embassy_stm32::init(config);
 | |
| 
 | |
|     // SPI for sx1276
 | |
|     let spi = spi::Spi::new(
 | |
|         p.SPI1,
 | |
|         p.PB3,
 | |
|         p.PA7,
 | |
|         p.PA6,
 | |
|         p.DMA1_CH3,
 | |
|         p.DMA1_CH2,
 | |
|         khz(200),
 | |
|         spi::Config::default(),
 | |
|     );
 | |
| 
 | |
|     let nss = Output::new(p.PA15.degrade(), Level::High, Speed::Low);
 | |
|     let reset = Output::new(p.PC0.degrade(), Level::High, Speed::Low);
 | |
| 
 | |
|     let irq_pin = Input::new(p.PB4.degrade(), Pull::Up);
 | |
|     let irq = ExtiInput::new(irq_pin, p.EXTI4.degrade());
 | |
| 
 | |
|     let iv = Stm32l0InterfaceVariant::new(nss, reset, irq, None, None).unwrap();
 | |
| 
 | |
|     let mut delay = Delay;
 | |
| 
 | |
|     let mut lora = {
 | |
|         match LoRa::new(SX1276_7_8_9::new(BoardType::Stm32l0Sx1276, spi, iv), false, &mut delay).await {
 | |
|             Ok(l) => l,
 | |
|             Err(err) => {
 | |
|                 info!("Radio error = {}", err);
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let mdltn_params = {
 | |
|         match lora.create_modulation_params(
 | |
|             SpreadingFactor::_10,
 | |
|             Bandwidth::_250KHz,
 | |
|             CodingRate::_4_8,
 | |
|             LORA_FREQUENCY_IN_HZ,
 | |
|         ) {
 | |
|             Ok(mp) => mp,
 | |
|             Err(err) => {
 | |
|                 info!("Radio error = {}", err);
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let mut tx_pkt_params = {
 | |
|         match lora.create_tx_packet_params(4, false, true, false, &mdltn_params) {
 | |
|             Ok(pp) => pp,
 | |
|             Err(err) => {
 | |
|                 info!("Radio error = {}", err);
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     match lora.prepare_for_tx(&mdltn_params, 17, true).await {
 | |
|         Ok(()) => {}
 | |
|         Err(err) => {
 | |
|             info!("Radio error = {}", err);
 | |
|             return;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let buffer = [0x01u8, 0x02u8, 0x03u8];
 | |
|     match lora.tx(&mdltn_params, &mut tx_pkt_params, &buffer, 0xffffff).await {
 | |
|         Ok(()) => {
 | |
|             info!("TX DONE");
 | |
|         }
 | |
|         Err(err) => {
 | |
|             info!("Radio error = {}", err);
 | |
|             return;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     match lora.sleep(&mut delay).await {
 | |
|         Ok(()) => info!("Sleep successful"),
 | |
|         Err(err) => info!("Sleep unsuccessful = {}", err),
 | |
|     }
 | |
| }
 |