diff --git a/src/lib.rs b/src/lib.rs
index 3b79878bf01ac22ffe7b409dd74cb7605c69f429..61b8e567155656424c22b07c2611bc4bea448e26 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -71,6 +71,10 @@ where
         self.radio.get_rssi()
     }
 
+    pub fn sleep(&mut self) -> Result<(), RfError<Spi::Error>> {
+        self.radio.sleep()
+    }
+
     pub fn set_channel(&mut self, channel: u8) {
         self.channel = channel;
     }
@@ -160,6 +164,12 @@ where
         let len = tx_buf.len();
         assert!(len < 8192, "Packet length cannot be above 8191 bytes");
 
+        if matches!(self.state, InternalState::Rx { .. }) {
+            // if we're in the middle of rxing, we need to cancel that first
+            // otherwise it gets confused
+            self.radio.set_state(State::Sleep).txe()?;
+        }
+
         self.radio.clear_fifo().txe()?;
         self.radio.clear_ph_and_modem_interrupts().txe()?;