diff --git a/libraries/SPI3/SPI3.cpp b/libraries/SPI3/SPI3.cpp
index 510046664b5e3cabdde350de6d5dae5c55e6aaaf..078abda819b43ebee9be081c49ebc30c4e22c7f3 100644
--- a/libraries/SPI3/SPI3.cpp
+++ b/libraries/SPI3/SPI3.cpp
@@ -49,7 +49,12 @@ void SPI3Class::begin() {
 // Note: this is untested
 void SPI3Class::end() {
     uint8_t temp = UCSR3C;
-    
+
+    // check spi bus has been initialised
+    if( !_initialised ) {
+        return;
+    }
+
     // put UART3 into ASync UART mode
     temp = (temp & ~SPI3_USART_MASK) | SPI3_USART_ASYNC_UART;
     UCSR3C = temp;
@@ -59,6 +64,11 @@ void SPI3Class::end() {
 }
 
 uint8_t SPI3Class::transfer(uint8_t data) {
+    // check spi bus has been initialised
+    if( !_initialised ) {
+        return 0;
+    }
+
     /* Wait for empty transmit buffer */
     while ( !( UCSR3A & (1<<UDRE3)) ) ;
 
@@ -74,20 +84,29 @@ uint8_t SPI3Class::transfer(uint8_t data) {
 
 void SPI3Class::setBitOrder(uint8_t bitOrder)
 {
-  if(bitOrder == SPI3_LSBFIRST) {
-    UCSR3C |= _BV(2);
-  } else {
-    UCSR3C &= ~(_BV(2));
-  }
+    // check spi bus has been initialised
+    if( !_initialised ) {
+        return;
+    }
+
+    if(bitOrder == SPI3_LSBFIRST) {
+        UCSR3C |= _BV(2);
+    } else {
+        UCSR3C &= ~(_BV(2));
+    }
 }
 
 void SPI3Class::setDataMode(uint8_t mode)
 {
-  UCSR3C = (UCSR3C & ~SPI3_MODE_MASK) | mode;
+    if( _initialised ) {
+        UCSR3C = (UCSR3C & ~SPI3_MODE_MASK) | mode;
+    }
 }
 
 void SPI3Class::setSpeed(uint8_t rate)
 {
-  UBRR3 = rate;
+    if( _initialised ) {
+        UBRR3 = rate;
+    }
 }