diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp
index e9c6cf35d..97457ef01 100644
--- a/libraries/SPI/SPI.cpp
+++ b/libraries/SPI/SPI.cpp
@@ -350,11 +350,7 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
     while(SPI1CMD & SPIBUSY) {}
 }
 
-
 /**
- * Note:
- *  data need to be aligned to 32Bit
- *  or you get an Fatal exception (9)
  * @param data uint8_t *
  * @param size uint8_t  max for size is 64Byte
  * @param repeat uint32_t
@@ -362,37 +358,46 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
 void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
     if(size > 64) return; //max Hardware FIFO
 
-    uint32_t byte = (size * repeat);
-    uint8_t r = (64 / size);
+    while(SPI1CMD & SPIBUSY) {}
 
-    while(byte) {
-        if(byte > 64) {
-            writePattern_(data, size, r);
-            byte -= 64;
-        } else {
-            writePattern_(data, size, (byte / size));
-            byte = 0;
-        }
-    }
-}
+    uint32_t buffer[16];
+    uint8_t *bufferPtr=(uint8_t *)&buffer;
+    uint8_t *dataPtr = data;
+    volatile uint32_t * fifoPtr = &SPI1W0;
+    uint8_t r = 64 / size;
+    uint32_t repeatRem = repeat % r;
+    repeat = repeat / r;
 
-void SPIClass::writePattern_(uint8_t * data, uint8_t size, uint8_t repeat) {
-    uint8_t bytes = (size * repeat);
-    uint8_t buffer[64];
-    uint8_t * bufferPtr = &buffer[0];
-    uint8_t * dataPtr;
-    uint8_t dataSize = bytes;
-    for(uint8_t i = 0; i < repeat; i++) {
-        dataSize = size;
+    while(r--){
         dataPtr = data;
-        while(dataSize--) {
+        for(uint8_t i=0; i<size; i++){
             *bufferPtr = *dataPtr;
-            dataPtr++;
             bufferPtr++;
+            dataPtr++;
         }
     }
 
-    writeBytes(&buffer[0], bytes);
+    fifoPtr = &SPI1W0;
+    for(uint8_t i=0; i<16; i++){
+        *fifoPtr = buffer[i];
+        fifoPtr++;
+    }
+
+    r = 64 / size;
+
+    SPI1U = SPIUMOSI | SPIUSSE;
+    //Fill fifo with data
+    setDataBits(r * size * 8);
+    while(repeat--){
+        SPI1CMD |= SPIBUSY;
+        while(SPI1CMD & SPIBUSY) {}
+    }
+
+    setDataBits(repeatRem * size * 8);
+    SPI1CMD |= SPIBUSY;
+    while(SPI1CMD & SPIBUSY) {}
+
+    SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
 }
 
 /**
diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h
index 141f30ef4..4a9273a61 100644
--- a/libraries/SPI/SPI.h
+++ b/libraries/SPI/SPI.h
@@ -75,7 +75,6 @@ public:
 private:
   bool useHwCs;
   void writeBytes_(uint8_t * data, uint8_t size);
-  void writePattern_(uint8_t * data, uint8_t size, uint8_t repeat);
   void transferBytes_(uint8_t * out, uint8_t * in, uint8_t size);
   inline void setDataBits(uint16_t bits);
 };