diff --git a/src/shared/sensors/UBXGPS/UBXGPSSpi.cpp b/src/shared/sensors/UBXGPS/UBXGPSSpi.cpp
index 72bc7ad12971940a3e368c0c8d8c8c96c0135448..03fed0fb0cf22d4a6b8663b1c10cec790bbbde51 100644
--- a/src/shared/sensors/UBXGPS/UBXGPSSpi.cpp
+++ b/src/shared/sensors/UBXGPS/UBXGPSSpi.cpp
@@ -49,7 +49,8 @@ UBXGPSSpi::UBXGPSSpi(SPIBusInterface& spiBus, miosix::GpioPin spiCs,
 SPIBusConfig UBXGPSSpi::getDefaultSPIConfig()
 {
     SPIBusConfig config;
-    config.clockDivider = SPI::ClockDivider::DIV_16;
+    config.clockDivider  = SPI::ClockDivider::DIV_16;
+    config.csSetupTimeUs = 10;
     return config;
 }
 
@@ -109,9 +110,22 @@ bool UBXGPSSpi::selfTest() { return true; }
 
 UBXGPSData UBXGPSSpi::sampleImpl()
 {
+    int64_t currentTimestamp = Kernel::getOldTick();
+
+    // Returns the last sample if the time difference is less than 1ms
+    // From sensor specification, the time between SPI transactions must be at
+    // least 1ms. If sampling is requested before that time has passed, return
+    // the last sample.
+
+    if (currentTimestamp - lastSampleTimestamp < 1)
+    {
+        lastError = SensorErrors::NO_NEW_DATA;
+        return lastSample;
+    }
+
     UBXPvtFrame pvt;
 
-    if (!readUBXFrame(pvt))
+    if (!readUBXFrame(pvt, false))
         return lastSample;
 
     UBXPvtFrame::Payload& pvtP = pvt.getPayload();
@@ -138,6 +152,8 @@ UBXGPSData UBXGPSSpi::sampleImpl()
                             .nanosecond = pvtP.nano,
                             .accuracy   = pvtP.tAcc};
 
+    lastSampleTimestamp = Kernel::getOldTick();
+    lastError           = SensorErrors::NO_ERRORS;
     return sample;
 }
 
@@ -238,7 +254,7 @@ bool UBXGPSSpi::setPVTMessageRate()
     return safeWriteUBXFrame(frame);
 }
 
-bool UBXGPSSpi::readUBXFrame(UBXFrame& frame)
+bool UBXGPSSpi::readUBXFrame(UBXFrame& frame, bool wait)
 {
     long long start = Kernel::getOldTick();
     long long end   = start + READ_TIMEOUT;
@@ -256,7 +272,8 @@ bool UBXGPSSpi::readUBXFrame(UBXFrame& frame)
             {
                 // LOG_ERR(logger, "Timeout for read expired");
                 spiSlave.bus.deselect(spiSlave.cs);
-                Thread::sleep(1);  // GPS minimum time after deselect
+                if (wait)
+                    Thread::sleep(1);  // GPS minimum time after deselect
                 return false;
             }
 
@@ -297,7 +314,8 @@ bool UBXGPSSpi::readUBXFrame(UBXFrame& frame)
         spiSlave.bus.read(frame.checksum, 2);
 
         spiSlave.bus.deselect(spiSlave.cs);
-        Thread::sleep(1);  // GPS minimum time after deselect
+        if (wait)
+            Thread::sleep(1);  // GPS minimum time after deselect
     }
 
     if (!frame.isValid())
diff --git a/src/shared/sensors/UBXGPS/UBXGPSSpi.h b/src/shared/sensors/UBXGPS/UBXGPSSpi.h
index eb14fb4e274abb9b6f3a729395407204d029f887..6164696bfb242bfab8282d93ad11449c1095af8a 100644
--- a/src/shared/sensors/UBXGPS/UBXGPSSpi.h
+++ b/src/shared/sensors/UBXGPS/UBXGPSSpi.h
@@ -117,9 +117,10 @@ private:
      * @brief Reads a UBX frame.
      *
      * @param frame The received frame.
+     * @param wait Whether to wait 1ms after slave deselection or not
      * @return True if a valid frame was read.
      */
-    bool readUBXFrame(UBXFrame& frame);
+    bool readUBXFrame(UBXFrame& frame, bool wait = true);
 
     /**
      * @brief Writes a UBX frame.
@@ -139,6 +140,7 @@ private:
 
     SPISlave spiSlave;
     uint8_t sampleRate;
+    int64_t lastSampleTimestamp = 0;
 
     PrintLogger logger = Logging::getLogger("ubxgps");