diff --git a/examples/stm32wle5jc/src/bin/bpsk_tx.rs b/examples/stm32wle5jc/src/bin/bpsk_tx.rs index de536a0..00a6f23 100644 --- a/examples/stm32wle5jc/src/bin/bpsk_tx.rs +++ b/examples/stm32wle5jc/src/bin/bpsk_tx.rs @@ -9,7 +9,6 @@ use embassy_stm32::{ rcc::{MSIRange, Sysclk, mux}, spi::Spi, }; -use embassy_time::{Duration, Timer}; use stm32wl_subghz::{ Configure, PaSelection, Radio, SubGhzSpiDevice, Transmit, modulations::bpsk::{Bitrate, BpskConfig, BpskRadio}, @@ -39,19 +38,15 @@ async fn main(_spawner: Spawner) { frequency: 868_100_000, bitrate: Bitrate::Bps600, pa: PaSelection::HighPower, - power_dbm: 17, + power_dbm: 22, ..Default::default() }) .await .unwrap(); - info!("sending stuffs"); - match bpsk.tx(b"hiiiii!").await { - Ok(_) => info!("yay :3"), + info!("sending bpsk stuffs"); + match bpsk.tx(b"hiiiii hello :3 :3 :3 this is a looooooooooooooooong text! very long :> and cute! :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 ummmm urghhh awwwooooooo woof wooooof woof").await { + Ok(_) => info!("yay tx done :3"), Err(e) => error!("tx error: {:?}", e), } - - loop { - Timer::after(Duration::from_secs(1)).await; - } } diff --git a/examples/stm32wle5jc/src/bin/fsk_rx.rs b/examples/stm32wle5jc/src/bin/fsk_rx.rs new file mode 100644 index 0000000..1bc7c69 --- /dev/null +++ b/examples/stm32wle5jc/src/bin/fsk_rx.rs @@ -0,0 +1,56 @@ +#![no_std] +#![no_main] + +use defmt::{error, info, warn}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, RadioError, Receive, SubGhzSpiDevice, + modulations::fsk::{Bandwidth, Bitrate, FreqDev, FskConfig, FskRadio}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut fsk = FskRadio::new(&mut radio); + fsk.configure(&FskConfig { + frequency: 868_100_000, + bitrate: Bitrate::Custom(600), + fdev: FreqDev::Hz(32_000), + bandwidth: Bandwidth::Bw78_2kHz, // >= 2 * (32000 + 600/2) = 64.6 kHz + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("waiting for fsk stuffs..."); + let mut buf = [0u8; 255]; + match fsk.rx(&mut buf, 5_000).await { + Ok(len) => info!("yay :3 got {} bytes: {:x}", len, &buf[..len]), + Err(RadioError::Timeout) => warn!("nobody is talking to me :<"), + Err(e) => error!("rx error: {:?}", e), + } +} diff --git a/examples/stm32wle5jc/src/bin/fsk_tx.rs b/examples/stm32wle5jc/src/bin/fsk_tx.rs new file mode 100644 index 0000000..c806046 --- /dev/null +++ b/examples/stm32wle5jc/src/bin/fsk_tx.rs @@ -0,0 +1,53 @@ +#![no_std] +#![no_main] + +use defmt::{error, info}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, SubGhzSpiDevice, Transmit, + modulations::fsk::{Bitrate, FreqDev, FskConfig, FskRadio}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut fsk = FskRadio::new(&mut radio); + fsk.configure(&FskConfig { + frequency: 868_100_000, + bitrate: Bitrate::Custom(600), + fdev: FreqDev::Hz(32_000), + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("sending fsk stuffs"); + match fsk.tx(b"hiiiii hello :3 :3 :3 this is a looooooooooooooooong text! very long :> and cute! :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 ummmm urghhh awwwooooooo woof wooooof woof").await { + Ok(_) => info!("yay tx done :3"), + Err(e) => error!("tx error: {:?}", e), + } +} diff --git a/examples/stm32wle5jc/src/bin/lora_rx.rs b/examples/stm32wle5jc/src/bin/lora_rx.rs index c75ef13..c104dce 100644 --- a/examples/stm32wle5jc/src/bin/lora_rx.rs +++ b/examples/stm32wle5jc/src/bin/lora_rx.rs @@ -38,7 +38,7 @@ async fn main(_spawner: Spawner) { lora.configure(&LoraConfig { frequency: 868_100_000, sf: SpreadingFactor::SF9, - bw: Bandwidth::Bw7_8kHz, + bw: Bandwidth::Bw20_83kHz, pa: PaSelection::HighPower, power_dbm: 22, ..Default::default() @@ -46,11 +46,11 @@ async fn main(_spawner: Spawner) { .await .unwrap(); - info!("waiting for packet..."); + info!("waiting for lora stuffs..."); let mut buf = [0u8; 255]; match lora.rx(&mut buf, 5_000).await { - Ok(len) => info!("rx {} bytes: {:x}", len, &buf[..len]), - Err(RadioError::Timeout) => warn!("no packet received (timeout)"), + Ok(len) => info!("yay :3 got {} bytes: {:x}", len, &buf[..len]), + Err(RadioError::Timeout) => warn!("nobody is talking to me :<"), Err(e) => error!("rx error: {:?}", e), } diff --git a/examples/stm32wle5jc/src/bin/lora_tx.rs b/examples/stm32wle5jc/src/bin/lora_tx.rs index 45edf63..2d0192e 100644 --- a/examples/stm32wle5jc/src/bin/lora_tx.rs +++ b/examples/stm32wle5jc/src/bin/lora_tx.rs @@ -9,7 +9,6 @@ use embassy_stm32::{ rcc::{MSIRange, Sysclk, mux}, spi::Spi, }; -use embassy_time::{Duration, Timer}; use stm32wl_subghz::{ Configure, PaSelection, Radio, SubGhzSpiDevice, Transmit, modulations::lora::{Bandwidth, LoraConfig, LoraRadio, SpreadingFactor}, @@ -38,7 +37,7 @@ async fn main(_spawner: Spawner) { lora.configure(&LoraConfig { frequency: 868_100_000, sf: SpreadingFactor::SF9, - bw: Bandwidth::Bw7_8kHz, + bw: Bandwidth::Bw20_83kHz, pa: PaSelection::HighPower, power_dbm: 22, ..Default::default() @@ -46,13 +45,9 @@ async fn main(_spawner: Spawner) { .await .unwrap(); - info!("sending stuffs"); - match lora.tx(b"hiiiiiII!").await { - Ok(_) => info!("yay :3"), + info!("sending lora stuffs"); + match lora.tx(b"hiiiii hello :3 :3 :3 this is a looooooooooooooooong text! very long :> and cute! :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 ummmm urghhh awwwooooooo woof wooooof woof").await { + Ok(_) => info!("yay tx done :3"), Err(e) => error!("tx error: {:?}", e), } - - loop { - Timer::after(Duration::from_secs(1)).await; - } } diff --git a/examples/stm32wle5jc/src/bin/msk_rx.rs b/examples/stm32wle5jc/src/bin/msk_rx.rs new file mode 100644 index 0000000..4a04075 --- /dev/null +++ b/examples/stm32wle5jc/src/bin/msk_rx.rs @@ -0,0 +1,55 @@ +#![no_std] +#![no_main] + +use defmt::{error, info, warn}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, RadioError, Receive, SubGhzSpiDevice, + modulations::msk::{Bitrate, MskConfig, MskRadio, PulseShape}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut msk = MskRadio::new(&mut radio); + msk.configure(&MskConfig { + frequency: 868_100_000, + bitrate: Bitrate::Custom(600), + pulse_shape: PulseShape::GaussianBt05, + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("waiting for msk stuffs..."); + let mut buf = [0u8; 255]; + match msk.rx(&mut buf, 5_000).await { + Ok(len) => info!("yay :3 got {} bytes: {:x}", len, &buf[..len]), + Err(RadioError::Timeout) => warn!("nobody is talking to me :<"), + Err(e) => error!("rx error: {:?}", e), + } +} diff --git a/examples/stm32wle5jc/src/bin/msk_tx.rs b/examples/stm32wle5jc/src/bin/msk_tx.rs new file mode 100644 index 0000000..0c7984b --- /dev/null +++ b/examples/stm32wle5jc/src/bin/msk_tx.rs @@ -0,0 +1,53 @@ +#![no_std] +#![no_main] + +use defmt::{error, info}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, SubGhzSpiDevice, Transmit, + modulations::msk::{Bitrate, MskConfig, MskRadio, PulseShape}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut msk = MskRadio::new(&mut radio); + msk.configure(&MskConfig { + frequency: 868_100_000, + bitrate: Bitrate::Custom(600), + pulse_shape: PulseShape::GaussianBt05, + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("sending msk stuffs"); + match msk.tx(b"hiiiii hello :3 :3 :3 this is a looooooooooooooooong text! very long :> and cute! :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 ummmm urghhh awwwooooooo woof wooooof woof").await { + Ok(_) => info!("yay tx done :3"), + Err(e) => error!("tx error: {:?}", e), + } +}