diff --git a/src/entrypoints/anakin-test-dma.cpp b/src/entrypoints/anakin-test-dma.cpp
index 7f7505acc5383ba0a46c06a0cd613377c6804862..72350005f70eb4d065bfa89f2d1978a53085ce28 100644
--- a/src/entrypoints/anakin-test-dma.cpp
+++ b/src/entrypoints/anakin-test-dma.cpp
@@ -30,6 +30,7 @@ using namespace miosix;
 
 int main()
 {
+    printf("\n");
     Leds::init();
     Leds::set(0);
     Log::getInstance();
@@ -38,6 +39,9 @@ int main()
     const std::vector<SingleSensor>& data = sBoard->debugGetSensors();
     int ctr=0;
 
+    char buf[128] = {0};
+
+    const SPIDriver& spi = SPIDriver::instance();
     while(1)
     {
         for(const auto& s : data)
@@ -54,8 +58,13 @@ int main()
                     break;
             }
         }
+        DMAFIFOStatus tx = spi.getTxFIFOStatus();
+        DMAFIFOStatus rx = spi.getRxFIFOStatus();
+
+        if(tx > -1) sLog->logLimitedInt(17, DFS_EE, DFS_100, tx);
+        if(rx > -1) sLog->logLimitedInt(18, DFS_EE, DFS_100, rx);
     
-        Thread::sleep(10);
+        Thread::sleep(1);
     }
 
     // NOT EXECUTED
diff --git a/src/shared/DMA/DMA.cpp b/src/shared/DMA/DMA.cpp
index 2f14f41d1bc0b4aa0d19225620e28b38abb051cf..3545107cce6ebc7e78f1b913cdad120d89eaa833 100644
--- a/src/shared/DMA/DMA.cpp
+++ b/src/shared/DMA/DMA.cpp
@@ -183,6 +183,11 @@ void SPIRequest::IRQbeginTransaction()
     DMA2_Stream0->PAR  = reinterpret_cast<unsigned int>(&SPI1->DR);
     DMA2_Stream0->M0AR = reinterpret_cast<unsigned int>(fromPeripheral.data());
     DMA2_Stream0->NDTR = fromPeripheral.size();
+
+    DMA2_Stream0->FCR  = DMA_SxFCR_FEIE   //Enable interrupt on FIFO error 
+                       | DMA_SxFCR_FTH_0  //FTH = 11 -> Full FIFO
+                       | DMA_SxFCR_FTH_1;
+
     DMA2_Stream0->CR   = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0 // Channel 3
                        | DMA_SxCR_PL_1    //High priority because fifo disabled
                        | DMA_SxCR_MINC    //Increment memory pointer
@@ -190,12 +195,18 @@ void SPIRequest::IRQbeginTransaction()
                        | DMA_SxCR_TEIE    //Interrupt on transfer error
                        | DMA_SxCR_DMEIE   //Interrupt on direct mode error
                        | DMA_SxCR_EN;     //Start DMA
+
     
     // Tx
     DMA2_Stream5->CR   = 0;
     DMA2_Stream5->PAR  = reinterpret_cast<unsigned int>(&SPI1->DR);
     DMA2_Stream5->M0AR = reinterpret_cast<unsigned int>(toPeripheral.data());
     DMA2_Stream5->NDTR = toPeripheral.size();
+
+    DMA2_Stream5->FCR  = DMA_SxFCR_FEIE   //Enable interrupt on FIFO error 
+                       | DMA_SxFCR_FTH_0  //FTH = 11 -> Full FIFO
+                       | DMA_SxFCR_FTH_1;
+
     DMA2_Stream5->CR   = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0 // Channel 3
                        | DMA_SxCR_PL_1    //High priority because fifo disabled
                        | DMA_SxCR_MINC    //Increment memory pointer
diff --git a/src/shared/DMA/DMA.h b/src/shared/DMA/DMA.h
index 58e9a89bc593490a9221e6f4ca09fe7e2be9dfde..f5f929e407303add384847fb2fe9cac67defd093 100644
--- a/src/shared/DMA/DMA.h
+++ b/src/shared/DMA/DMA.h
@@ -27,13 +27,34 @@
 
 class SPIRequest;
 
+enum DMAFIFOStatus
+{
+    DFS_UNK = -1,// Unk
+    DFS_EE  = 0, // x == 0
+    DFS_10  = 1, // 0  <  x < 25
+    DFS_25  = 2, // 25 <= x < 50
+    DFS_50  = 3, // 50 <= x < 75
+    DFS_75  = 4, // 75 <= x < 100
+    DFS_100 = 5, // x == 100
+};
+
 class SPIDriver
 {
 public:
     static SPIDriver& instance();
     
     bool transaction(std::vector<SPIRequest>& requests);
-    
+
+    DMAFIFOStatus getTxFIFOStatus() const
+    {
+        return intToFIFOStatus((DMA2_Stream5->FCR & DMA_SxFCR_FS) >> 3);
+    }
+
+    DMAFIFOStatus getRxFIFOStatus() const
+    {
+        return intToFIFOStatus((DMA2_Stream0->FCR & DMA_SxFCR_FS) >> 3);
+    }
+
 private:
     SPIDriver();
     
@@ -50,6 +71,21 @@ private:
     {
         SPI1->CR2 = 0; 
     }
+
+    inline DMAFIFOStatus intToFIFOStatus(uint8_t s) const
+    {
+        switch(s)
+        {
+            case 0: return DFS_10;
+            case 1: return DFS_25;
+            case 2: return DFS_50;
+            case 3: return DFS_75;
+            case 4: return DFS_EE;
+            case 5: return DFS_100;
+        }
+        return DFS_UNK;
+    }
+
     pthread_mutex_t mutex;
 };
 
diff --git a/src/shared/log/Log.h b/src/shared/log/Log.h
index 3be1e16ffdc9add2275d41651034f5e51f7f2f1d..e16f217a52c27c3a47a53e237746ba86de8f1b3b 100644
--- a/src/shared/log/Log.h
+++ b/src/shared/log/Log.h
@@ -20,6 +20,7 @@ class Log : public Singleton<Log>, ActiveObject
         DATA_FLOAT  = 2,
         DATA_INT    = 3,
         DATA_STRING = 4,
+        DATA_LIMITED_INT = 5,
     };
 
     friend class Singleton<Log>;
@@ -49,6 +50,19 @@ public:
         queue(std::move(buf));
     }
 
+    void logLimitedInt(uint8_t id, int min, int max, int data)
+    {
+        assert(max > min);
+        uint32_t v = (data - min) * 256 / (max - min); 
+
+        std::vector<uint8_t> buf(2 + 1);
+        buf[0] = DATA_LIMITED_INT;
+        buf[1] = id;
+        buf[2] = v & 0xff;
+
+        queue(std::move(buf));
+    }
+
     void logSensorVec3(uint8_t id, const Vec3& data)
     {
         float tmp;