From 0722d671d6b0d67dda3f49d54874338d4a01ed97 Mon Sep 17 00:00:00 2001
From: rmackay9 <rmackay9@yahoo.com>
Date: Thu, 18 Oct 2012 19:17:24 +0900
Subject: [PATCH] SPI3: add checks that SPI bus has been initialised to reduce
 possibility of interfering with UART3 on APM1

---
 libraries/SPI3/SPI3.cpp | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/libraries/SPI3/SPI3.cpp b/libraries/SPI3/SPI3.cpp
index 510046664..078abda81 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;
+    }
 }
 
-- 
GitLab