diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index 2cfb172aa..b88159f1d 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -262,6 +262,11 @@ void SERCOM::setDataOrderSPI(SercomDataOrder dataOrder) enableSPI(); } +SercomDataOrder SERCOM::getDataOrderSPI() +{ + return (sercom->SPI.CTRLA.bit.DORD ? LSB_FIRST : MSB_FIRST); +} + void SERCOM::setBaudrateSPI(uint8_t divider) { //Can't divide by 0 diff --git a/cores/arduino/SERCOM.h b/cores/arduino/SERCOM.h index fbd27e624..7608386c9 100644 --- a/cores/arduino/SERCOM.h +++ b/cores/arduino/SERCOM.h @@ -173,6 +173,7 @@ class SERCOM void enableSPI( void ) ; void disableSPI( void ) ; void setDataOrderSPI(SercomDataOrder dataOrder) ; + SercomDataOrder getDataOrderSPI( void ) ; void setBaudrateSPI(uint8_t divider) ; void setClockModeSPI(SercomSpiClockMode clockMode) ; void writeDataSPI(uint8_t data) ; diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 62d28c0d5..bcf817415 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -194,6 +194,22 @@ byte SPIClass::transfer(uint8_t data) return _p_sercom->readDataSPI() & 0xFF; } +uint16_t SPIClass::transfer16(uint16_t data) { + union { uint16_t val; struct { uint8_t lsb; uint8_t msb; }; } t; + + t.val = data; + + if (_p_sercom->getDataOrderSPI() == LSB_FIRST) { + t.lsb = transfer(t.lsb); + t.msb = transfer(t.msb); + } else { + t.msb = transfer(t.msb); + t.lsb = transfer(t.lsb); + } + + return t.val; +} + void SPIClass::attachInterrupt() { // Should be enableInterrupt() } diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 63f311710..12dae5622 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -95,6 +95,7 @@ class SPIClass { byte transfer(uint8_t data); + uint16_t transfer16(uint16_t data); inline void transfer(void *buf, size_t count); // Transaction Functions