Skip to content

Commit 7f66a34

Browse files
In the Adafruit_SPIDevice class, when running on the SAMD architecture in the hardware SPI case, use the SPIClass::transfer(txbuf, rxbuf, count, block) method when writing instead of looping over individual bytes.
This makes use of DMA and is noticeably faster.
1 parent 69b929d commit 7f66a34

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

Adafruit_SPIDevice.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,15 @@ bool Adafruit_SPIDevice::write(uint8_t *buffer, size_t len,
310310
_spi->transferBytes(buffer, nullptr, len);
311311
}
312312
} else
313+
#elif defined(ARDUINO_ARCH_SAMD)
314+
if (_spi) {
315+
if (prefix_len > 0) {
316+
_spi->transfer(prefix_buffer, nullptr, prefix_len);
317+
}
318+
if (len > 0) {
319+
_spi->transfer(buffer, nullptr, len);
320+
}
321+
} else
313322
#endif
314323
{
315324
for (size_t i = 0; i < prefix_len; i++) {
@@ -414,6 +423,12 @@ bool Adafruit_SPIDevice::write_then_read(uint8_t *write_buffer,
414423
_spi->transferBytes(write_buffer, nullptr, write_len);
415424
}
416425
} else
426+
#elif defined(ARDUINO_ARCH_SAMD)
427+
if (_spi) {
428+
if (write_len > 0) {
429+
_spi->transfer(write_buffer, nullptr, write_len);
430+
}
431+
} else
417432
#endif
418433
{
419434
for (size_t i = 0; i < write_len; i++) {

0 commit comments

Comments
 (0)