From 8b1d9bfd272cea1dbc5ac0a57b9129a23dd402df Mon Sep 17 00:00:00 2001
From: Jonathan BAUDIN <jonathan.baudin@atmel.com>
Date: Thu, 15 May 2014 18:10:01 +0200
Subject: [PATCH]  SPI implement tested

---
 cores/arduino/SERCOM.cpp          |  4 ++--
 cores/arduino/SERCOM.h            |  2 +-
 libraries/SPI/SPI.cpp             | 10 ++++++----
 variants/arduino_zero/variant.cpp |  2 +-
 4 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp
index 2cc41741..41840873 100644
--- a/cores/arduino/SERCOM.cpp
+++ b/cores/arduino/SERCOM.cpp
@@ -266,9 +266,9 @@ void SERCOM::writeDataSPI(uint8_t data)
 	sercom->SPI.DATA.bit.DATA = data;
 }
 
-uint8_t SERCOM::readDataSPI()
+uint16_t SERCOM::readDataSPI()
 {
-	return sercom->SPI.DATA.bit.DATA;
+	return sercom->SPI.DATA.reg;
 }
 
 bool SERCOM::isBufferOverflowErrorSPI()
diff --git a/cores/arduino/SERCOM.h b/cores/arduino/SERCOM.h
index 9ad35ee9..82b953ae 100644
--- a/cores/arduino/SERCOM.h
+++ b/cores/arduino/SERCOM.h
@@ -157,7 +157,7 @@ class SERCOM
 		void setBaudrateSPI(uint8_t divider);
 		void setClockModeSPI(SercomSpiClockMode clockMode);
 		void writeDataSPI(uint8_t data);
-		uint8_t readDataSPI();
+		uint16_t readDataSPI();
 		bool isBufferOverflowErrorSPI();
 		bool isDataRegisterEmptySPI();
 		bool isTransmitCompleteSPI();
diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp
index 0685952f..8eb5ac29 100644
--- a/libraries/SPI/SPI.cpp
+++ b/libraries/SPI/SPI.cpp
@@ -10,18 +10,20 @@
 
 #include "SPI.h"
 #include "wiring_digital.h"
+#include "assert.h"
 
 
 SPIClass::SPIClass(SERCOM *s)
 {
+	assert(s != NULL );
 	sercom = s;
-	
-	pinPeripheral(18, g_APinDescription[18].ulPinType);
-	pinPeripheral(20, g_APinDescription[20].ulPinType);
-	pinPeripheral(21, g_APinDescription[21].ulPinType);
 }
 
 void SPIClass::begin() {
+	// PIO init 
+	pinPeripheral(18, g_APinDescription[18].ulPinType);
+	pinPeripheral(20, g_APinDescription[20].ulPinType);
+	pinPeripheral(21, g_APinDescription[21].ulPinType);
 	// Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first.
 	sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST);
 	sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000);
diff --git a/variants/arduino_zero/variant.cpp b/variants/arduino_zero/variant.cpp
index de7498f8..34595a75 100644
--- a/variants/arduino_zero/variant.cpp
+++ b/variants/arduino_zero/variant.cpp
@@ -138,7 +138,7 @@ const PinDescription g_APinDescription[]=
   { PORTA, 23, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // SCL: SERCOM3/PAD[1]
 
   // 18..23 SPI (ICSP:MISO,SCK,MOSI)
-  { PORTA, 12, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // MISO: SERCOM4/PAD[0]
+  { PORTA, 12, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // MISO: SERCOM4/PAD[0]
   { NOT_A_PORT, 0, PIO_NOT_A_PIN, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // 5V0
   { PORTB, 11, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // SCK: SERCOM4/PAD[3]
   { PORTB, 10, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI: SERCOM4/PAD[2]
-- 
GitLab