diff --git a/src/shared/radio/SX1278/SX1278Defs.h b/src/shared/radio/SX1278/SX1278Defs.h
index ee5e4ea17ca6cb373adbb40c97a46fa07862403d..d19874b1b209234fbf1597baaa4c328e733baaf3 100644
--- a/src/shared/radio/SX1278/SX1278Defs.h
+++ b/src/shared/radio/SX1278/SX1278Defs.h
@@ -54,6 +54,16 @@ inline SPIBusConfig getSpiBusConfig(SPI::ClockDivider clock_divider)
     return bus_config;
 }
 
+constexpr int MIN_BITRATE = FXOSC / 0xffff;
+constexpr int MAX_BITRATE = FXOSC;
+
+constexpr int MIN_FREQ_DEV = 0;
+constexpr int MAX_FREQ_DEV = 0x3fff * FSTEP;
+
+constexpr int MIN_FREQ_RF = 0;
+constexpr int MAX_FREQ_RF = 0xffffff * FSTEP;
+
+
 /**
  * @brief Represents a DIO..
  */
diff --git a/src/shared/radio/SX1278/SX1278Fsk.cpp b/src/shared/radio/SX1278/SX1278Fsk.cpp
index 5051e6b7e5cc06095d48f3114cb53a08819dff5f..49878b1a3e4f473566ed4eec877cc00c84628068 100644
--- a/src/shared/radio/SX1278/SX1278Fsk.cpp
+++ b/src/shared/radio/SX1278/SX1278Fsk.cpp
@@ -25,6 +25,7 @@
 #include <kernel/scheduler/scheduler.h>
 #include <utils/Debug.h>
 
+#include <cassert>
 #include <cmath>
 
 namespace Boardcore
@@ -69,6 +70,23 @@ bool SX1278Fsk::checkVersion()
 
 SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
 {
+    // Check that the configuration is actually valid
+    bool pa_boost = getFrontend().isOnPaBoost();
+    int min_power = pa_boost ? 2 : 0;
+    int max_power = getFrontend().maxInPower();
+
+    assert(config.power >= min_power && config.power <= max_power &&
+           "[sx1278] Configured power invalid for given frontend!");
+    assert(((config.ocp >= 0 && config.ocp <= 120) ||
+            (config.ocp >= 130 && config.ocp <= 240)) &&
+           "[sx1278] Invalid ocp!");
+    assert(config.bitrate >= MIN_BITRATE && config.bitrate <= MAX_BITRATE &&
+           "[sx1278] Invalid bitrate!");
+    assert(config.freq_dev >= MIN_FREQ_DEV && config.freq_dev <= MAX_FREQ_DEV &&
+           "[sx1278] Invalid freq_dev!");
+    assert(config.freq_rf >= MIN_FREQ_RF && config.freq_rf <= MAX_FREQ_RF &&
+           "[sx1278] Invalid freq_rf");
+
     // First make sure the device is in fsk and in standby
     enterFskMode();
 
@@ -87,14 +105,15 @@ SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
     // if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 0, 1000))
     //     return Error::IRQ_TIMEOUT;
 
-    int bitrate              = config.bitrate;
-    int freq_dev             = config.freq_dev;
-    int freq_rf              = config.freq_rf;
+    int bitrate = std::max(std::min(config.bitrate, MAX_BITRATE), MIN_BITRATE);
+    int freq_dev =
+        std::max(std::min(config.freq_dev, MAX_FREQ_DEV), MIN_FREQ_DEV);
+    int freq_rf = std::max(std::min(config.freq_rf, MAX_FREQ_RF), MIN_FREQ_RF);
     RegRxBw::RxBw rx_bw      = static_cast<RegRxBw::RxBw>(config.rx_bw);
     RegAfcBw::RxBwAfc afc_bw = static_cast<RegAfcBw::RxBwAfc>(config.afc_bw);
-    int ocp                  = config.ocp;
-    int power     = std::min(config.power, getFrontend().maxInPower());
-    bool pa_boost = getFrontend().isOnPaBoost();
+    int ocp   = config.ocp <= 120 ? std::max(std::min(config.ocp, 120), 0)
+                                  : std::max(std::min(config.ocp, 240), 130);
+    int power = std::max(std::min(config.power, max_power), min_power);
     RegPaRamp::ModulationShaping shaping =
         static_cast<RegPaRamp::ModulationShaping>(config.shaping);
     RegPacketConfig1::DcFree dc_free =
@@ -106,8 +125,8 @@ SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
         SPITransaction spi(getSpiSlave());
 
         // Setup bitrate
-        uint16_t bitrate_val = FXOSC / bitrate;
-        spi.writeRegister16(REG_BITRATE_MSB, bitrate_val);
+        uint16_t bitrate_raw = FXOSC / bitrate;
+        spi.writeRegister16(REG_BITRATE_MSB, bitrate_raw);
 
         // Setup frequency deviation
         uint16_t freq_dev_raw = freq_dev / FSTEP;