Skip to content

Commit b55e9a4

Browse files
committed
Add SPI.transfer16(...) API's
1 parent 802f671 commit b55e9a4

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

libraries/SPI/SPI.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,23 @@ byte SPIClass::transfer(byte _pin, uint8_t _data, SPITransferMode _mode) {
196196
return d & 0xFF;
197197
}
198198

199+
uint16_t SPIClass::transfer16(byte _pin, uint16_t _data, SPITransferMode _mode) {
200+
union { uint16_t val; struct { uint8_t lsb; uint8_t msb; }; } t;
201+
uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(_pin);
202+
203+
t.val = _data;
204+
205+
if (bitOrder[ch] == LSBFIRST) {
206+
t.lsb = transfer(_pin, t.lsb, _mode);
207+
t.msb = transfer(_pin, t.msb, _mode);
208+
} else {
209+
t.msb = transfer(_pin, t.msb, _mode);
210+
t.lsb = transfer(_pin, t.lsb, _mode);
211+
}
212+
213+
return t.val;
214+
}
215+
199216
void SPIClass::transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode) {
200217
if (_count == 0)
201218
return;

libraries/SPI/SPI.h

+2
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ class SPIClass {
8282

8383
// Transfer functions
8484
byte transfer(byte _pin, uint8_t _data, SPITransferMode _mode = SPI_LAST);
85+
uint16_t transfer16(byte _pin, uint16_t _data, SPITransferMode _mode = SPI_LAST);
8586
void transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode = SPI_LAST);
8687
// Transfer functions on default pin BOARD_SPI_DEFAULT_SS
8788
byte transfer(uint8_t _data, SPITransferMode _mode = SPI_LAST) { return transfer(BOARD_SPI_DEFAULT_SS, _data, _mode); }
89+
uint16_t transfer16(uint16_t _data, SPITransferMode _mode = SPI_LAST) { return transfer16(BOARD_SPI_DEFAULT_SS, _data, _mode); }
8890
void transfer(void *_buf, size_t _count, SPITransferMode _mode = SPI_LAST) { transfer(BOARD_SPI_DEFAULT_SS, _buf, _count, _mode); }
8991

9092
// Transaction Functions

0 commit comments

Comments
 (0)