diff --git a/embassy-lora/src/sx126x/mod.rs b/embassy-lora/src/sx126x/mod.rs index d67c7b10..ed8cb405 100644 --- a/embassy-lora/src/sx126x/mod.rs +++ b/embassy-lora/src/sx126x/mod.rs @@ -13,35 +13,29 @@ use sx126x_lora::LoRa; use self::sx126x_lora::mod_params::RadioError; /// Semtech Sx126x LoRa peripheral -pub struct Sx126xRadio +pub struct Sx126xRadio where SPI: SpiBus + 'static, - CS: OutputPin + 'static, - RESET: OutputPin + 'static, - ANTRX: OutputPin + 'static, - ANTTX: OutputPin + 'static, + CTRL: OutputPin + 'static, WAIT: Wait + 'static, BUS: Error + Format + 'static, { - pub lora: LoRa, + pub lora: LoRa, } -impl Sx126xRadio +impl Sx126xRadio where SPI: SpiBus + 'static, - CS: OutputPin + 'static, - RESET: OutputPin + 'static, - ANTRX: OutputPin + 'static, - ANTTX: OutputPin + 'static, + CTRL: OutputPin + 'static, WAIT: Wait + 'static, BUS: Error + Format + 'static, { pub async fn new( spi: SPI, - cs: CS, - reset: RESET, - antenna_rx: ANTRX, - antenna_tx: ANTTX, + cs: CTRL, + reset: CTRL, + antenna_rx: CTRL, + antenna_tx: CTRL, dio1: WAIT, busy: WAIT, enable_public_network: bool, @@ -53,13 +47,10 @@ where } } -impl Timings for Sx126xRadio +impl Timings for Sx126xRadio where SPI: SpiBus + 'static, - CS: OutputPin + 'static, - RESET: OutputPin + 'static, - ANTRX: OutputPin + 'static, - ANTTX: OutputPin + 'static, + CTRL: OutputPin + 'static, WAIT: Wait + 'static, BUS: Error + Format + 'static, { @@ -71,13 +62,10 @@ where } } -impl PhyRxTx for Sx126xRadio +impl PhyRxTx for Sx126xRadio where SPI: SpiBus + 'static, - CS: OutputPin + 'static, - RESET: OutputPin + 'static, - ANTRX: OutputPin + 'static, - ANTTX: OutputPin + 'static, + CTRL: OutputPin + 'static, WAIT: Wait + 'static, BUS: Error + Format + 'static, { @@ -86,10 +74,7 @@ where type TxFuture<'m> = impl Future> + 'm where SPI: 'm, - CS: 'm, - RESET: 'm, - ANTRX: 'm, - ANTTX: 'm, + CTRL: 'm, WAIT: 'm, BUS: 'm; @@ -122,10 +107,7 @@ where type RxFuture<'m> = impl Future> + 'm where SPI: 'm, - CS: 'm, - RESET: 'm, - ANTRX: 'm, - ANTTX: 'm, + CTRL: 'm, WAIT: 'm, BUS: 'm; diff --git a/embassy-lora/src/sx126x/sx126x_lora/board_specific.rs b/embassy-lora/src/sx126x/sx126x_lora/board_specific.rs index 5b4891c0..1fb08588 100644 --- a/embassy-lora/src/sx126x/sx126x_lora/board_specific.rs +++ b/embassy-lora/src/sx126x/sx126x_lora/board_specific.rs @@ -13,13 +13,10 @@ const BRD_TCXO_WAKEUP_TIME: u32 = 10; // Provides board-specific functionality for Semtech SX126x-based boards. Use #[cfg(feature = "board_type")] to specify unique board functionality. // The base implementation supports the RAK4631 board. -impl LoRa +impl LoRa where SPI: SpiBus, - CS: OutputPin, - RESET: OutputPin, - ANTRX: OutputPin, - ANTTX: OutputPin, + CTRL: OutputPin, WAIT: Wait, { // De-initialize the radio I/Os pins interface. Useful when going into MCU low power modes. @@ -210,14 +207,34 @@ where RadioType::SX1262 } - // Initialize the RF switch I/O pins interface - pub(super) async fn brd_ant_sw_on(&mut self) -> Result<(), RadioError> { - Ok(()) // no operation currently + // Quiesce the antenna(s). + pub(super) fn brd_ant_sleep(&mut self) -> Result<(), RadioError> { + #[cfg(feature = "rak4631")] + { + self.antenna_tx.set_low().map_err(|_| AntTx)?; + self.antenna_rx.set_low().map_err(|_| AntRx)?; + } + Ok(()) } - // De-initialize the RF switch I/O pins interface for MCU low power modes - pub(super) async fn brd_ant_sw_off(&mut self) -> Result<(), RadioError> { - Ok(()) // no operation currently + // Prepare the antenna(s) for a receive operation + pub(super) fn brd_ant_set_rx(&mut self) -> Result<(), RadioError> { + #[cfg(feature = "rak4631")] + { + self.antenna_tx.set_low().map_err(|_| AntTx)?; + self.antenna_rx.set_high().map_err(|_| AntRx)?; + } + Ok(()) + } + + // Prepare the antenna(s) for a send operation + pub(super) fn brd_ant_set_tx(&mut self) -> Result<(), RadioError> { + #[cfg(feature = "rak4631")] + { + self.antenna_rx.set_low().map_err(|_| AntRx)?; + self.antenna_tx.set_high().map_err(|_| AntTx)?; + } + Ok(()) } // Check if the given RF frequency is supported by the hardware diff --git a/embassy-lora/src/sx126x/sx126x_lora/mod.rs b/embassy-lora/src/sx126x/sx126x_lora/mod.rs index 53fbde74..280f26d5 100644 --- a/embassy-lora/src/sx126x/sx126x_lora/mod.rs +++ b/embassy-lora/src/sx126x/sx126x_lora/mod.rs @@ -26,12 +26,12 @@ const LORA_BANDWIDTHS: [Bandwidth; 3] = [Bandwidth::_125KHz, Bandwidth::_250KHz, const RADIO_WAKEUP_TIME: u32 = 3; /// Provides high-level access to Semtech SX126x-based boards -pub struct LoRa { +pub struct LoRa { spi: SPI, - cs: CS, - reset: RESET, - antenna_rx: ANTRX, - antenna_tx: ANTTX, + cs: CTRL, + reset: CTRL, + antenna_rx: CTRL, + antenna_tx: CTRL, dio1: WAIT, busy: WAIT, operating_mode: RadioMode, @@ -45,17 +45,14 @@ pub struct LoRa { frequency_error: u32, } -impl LoRa +impl LoRa where SPI: SpiBus, - CS: OutputPin, - RESET: OutputPin, - ANTRX: OutputPin, - ANTTX: OutputPin, + CTRL: OutputPin, WAIT: Wait, { /// Builds and returns a new instance of the radio. Only one instance of the radio should exist at a time () - pub fn new(spi: SPI, cs: CS, reset: RESET, antenna_rx: ANTRX, antenna_tx: ANTTX, dio1: WAIT, busy: WAIT) -> Self { + pub fn new(spi: SPI, cs: CTRL, reset: CTRL, antenna_rx: CTRL, antenna_tx: CTRL, dio1: WAIT, busy: WAIT) -> Self { Self { spi, cs, diff --git a/embassy-lora/src/sx126x/sx126x_lora/subroutine.rs b/embassy-lora/src/sx126x/sx126x_lora/subroutine.rs index 02a0a72e..283e6099 100644 --- a/embassy-lora/src/sx126x/sx126x_lora/subroutine.rs +++ b/embassy-lora/src/sx126x/sx126x_lora/subroutine.rs @@ -19,13 +19,10 @@ const SX126X_MAX_LORA_SYMB_NUM_TIMEOUT: u8 = 248; // Provides board-specific functionality for Semtech SX126x-based boards -impl LoRa +impl LoRa where SPI: SpiBus, - CS: OutputPin, - RESET: OutputPin, - ANTRX: OutputPin, - ANTTX: OutputPin, + CTRL: OutputPin, WAIT: Wait, { // Initialize the radio driver @@ -44,7 +41,6 @@ where let operating_mode = self.brd_get_operating_mode(); if operating_mode == RadioMode::Sleep || operating_mode == RadioMode::ReceiveDutyCycle { self.brd_wakeup().await?; - self.brd_ant_sw_on().await?; } self.brd_wait_on_busy().await?; Ok(()) @@ -117,10 +113,7 @@ where // Set the radio in sleep mode pub(super) async fn sub_set_sleep(&mut self, sleep_config: SleepParams) -> Result<(), RadioError> { - self.brd_ant_sw_off().await?; - - let _fix_rx = self.antenna_rx.set_low(); - let _fix_tx = self.antenna_tx.set_low(); + self.brd_ant_sleep()?; if !sleep_config.warm_start { self.image_calibrated = false; @@ -141,8 +134,7 @@ where self.brd_set_operating_mode(RadioMode::StandbyXOSC); } - let _fix_rx = self.antenna_rx.set_low(); - let _fix_tx = self.antenna_tx.set_low(); + self.brd_ant_sleep()?; Ok(()) } @@ -162,8 +154,7 @@ where Self::timeout_3(timeout), ]; - let _fix_rx = self.antenna_rx.set_low(); - let _fix_tx = self.antenna_tx.set_high(); + self.brd_ant_set_tx()?; self.brd_set_operating_mode(RadioMode::Transmit); self.brd_write_command(OpCode::SetTx, &buffer).await?; @@ -178,8 +169,7 @@ where Self::timeout_3(timeout), ]; - let _fix_rx = self.antenna_rx.set_high(); - let _fix_tx = self.antenna_tx.set_low(); + self.brd_ant_set_rx()?; self.brd_set_operating_mode(RadioMode::Receive); self.brd_write_registers(Register::RxGain, &[0x94u8]).await?; @@ -195,8 +185,7 @@ where Self::timeout_3(timeout), ]; - let _fix_rx = self.antenna_rx.set_high(); - let _fix_tx = self.antenna_tx.set_low(); + self.brd_ant_set_rx()?; self.brd_set_operating_mode(RadioMode::Receive); // set max LNA gain, increase current by ~2mA for around ~3dB in sensitivity @@ -225,8 +214,7 @@ where // Set the radio in CAD mode pub(super) async fn sub_set_cad(&mut self) -> Result<(), RadioError> { - let _fix_rx = self.antenna_rx.set_high(); - let _fix_tx = self.antenna_tx.set_low(); + self.brd_ant_set_rx()?; self.brd_write_command(OpCode::SetCAD, &[]).await?; self.brd_set_operating_mode(RadioMode::ChannelActivityDetection); @@ -235,8 +223,7 @@ where // Set the radio in continuous wave transmission mode pub(super) async fn sub_set_tx_continuous_wave(&mut self) -> Result<(), RadioError> { - let _fix_rx = self.antenna_rx.set_low(); - let _fix_tx = self.antenna_tx.set_high(); + self.brd_ant_set_tx()?; self.brd_write_command(OpCode::SetTxContinuousWave, &[]).await?; self.brd_set_operating_mode(RadioMode::Transmit); @@ -245,8 +232,7 @@ where // Set the radio in continuous preamble transmission mode pub(super) async fn sub_set_tx_infinite_preamble(&mut self) -> Result<(), RadioError> { - let _fix_rx = self.antenna_rx.set_low(); - let _fix_tx = self.antenna_tx.set_high(); + self.brd_ant_set_tx()?; self.brd_write_command(OpCode::SetTxContinuousPremable, &[]).await?; self.brd_set_operating_mode(RadioMode::Transmit); diff --git a/examples/nrf/src/bin/lora_p2p_report.rs b/examples/nrf/src/bin/lora_p2p_report.rs index 46cb848b..4ba3d30c 100644 --- a/examples/nrf/src/bin/lora_p2p_report.rs +++ b/examples/nrf/src/bin/lora_p2p_report.rs @@ -24,12 +24,12 @@ async fn main(_spawner: Spawner) { let irq = interrupt::take!(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1); let spim = spim::Spim::new(p.TWISPI1, irq, p.P1_11, p.P1_13, p.P1_12, spi_config); - let cs = Output::new(p.P1_10, Level::High, OutputDrive::Standard); - let reset = Output::new(p.P1_06, Level::High, OutputDrive::Standard); + let cs = Output::new(p.P1_10.degrade(), Level::High, OutputDrive::Standard); + let reset = Output::new(p.P1_06.degrade(), Level::High, OutputDrive::Standard); let dio1 = Input::new(p.P1_15.degrade(), Pull::Down); let busy = Input::new(p.P1_14.degrade(), Pull::Down); - let antenna_rx = Output::new(p.P1_05, Level::Low, OutputDrive::Standard); - let antenna_tx = Output::new(p.P1_07, Level::Low, OutputDrive::Standard); + let antenna_rx = Output::new(p.P1_05.degrade(), Level::Low, OutputDrive::Standard); + let antenna_tx = Output::new(p.P1_07.degrade(), Level::Low, OutputDrive::Standard); match Sx126xRadio::new(spim, cs, reset, antenna_rx, antenna_tx, dio1, busy, false).await { Ok(r) => r, diff --git a/examples/nrf/src/bin/lora_p2p_sense.rs b/examples/nrf/src/bin/lora_p2p_sense.rs index 3c6bb876..405a8403 100644 --- a/examples/nrf/src/bin/lora_p2p_sense.rs +++ b/examples/nrf/src/bin/lora_p2p_sense.rs @@ -97,12 +97,12 @@ async fn main(spawner: Spawner) { let irq = interrupt::take!(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1); let spim = spim::Spim::new(p.TWISPI1, irq, p.P1_11, p.P1_13, p.P1_12, spi_config); - let cs = Output::new(p.P1_10, Level::High, OutputDrive::Standard); - let reset = Output::new(p.P1_06, Level::High, OutputDrive::Standard); + let cs = Output::new(p.P1_10.degrade(), Level::High, OutputDrive::Standard); + let reset = Output::new(p.P1_06.degrade(), Level::High, OutputDrive::Standard); let dio1 = Input::new(p.P1_15.degrade(), Pull::Down); let busy = Input::new(p.P1_14.degrade(), Pull::Down); - let antenna_rx = Output::new(p.P1_05, Level::Low, OutputDrive::Standard); - let antenna_tx = Output::new(p.P1_07, Level::Low, OutputDrive::Standard); + let antenna_rx = Output::new(p.P1_05.degrade(), Level::Low, OutputDrive::Standard); + let antenna_tx = Output::new(p.P1_07.degrade(), Level::Low, OutputDrive::Standard); match Sx126xRadio::new(spim, cs, reset, antenna_rx, antenna_tx, dio1, busy, false).await { Ok(r) => r,