Skip to content

Commit 3bdfee4

Browse files
In the Adafruit_SPIDevice class, when running on ESP32 in the hardware SPI case, use the SPIClass::transferBytes() method when writing instead of looping over individual bytes.
This makes use of the hardware fifo buffers and is noticeably faster.
1 parent ea1e1a8 commit 3bdfee4

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

Adafruit_SPIDevice.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,23 @@ bool Adafruit_SPIDevice::write(uint8_t *buffer, size_t len,
301301

302302
digitalWrite(_cs, LOW);
303303
// do the writing
304-
for (size_t i = 0; i < prefix_len; i++) {
305-
transfer(prefix_buffer[i]);
306-
}
307-
for (size_t i = 0; i < len; i++) {
308-
transfer(buffer[i]);
304+
#if defined(ARDUINO_ARCH_ESP32)
305+
if (_spi) {
306+
if (prefix_len > 0) {
307+
_spi->transferBytes(prefix_buffer, nullptr, prefix_len);
308+
}
309+
if (len > 0) {
310+
_spi->transferBytes(buffer, nullptr, len);
311+
}
312+
} else
313+
#endif
314+
{
315+
for (size_t i = 0; i < prefix_len; i++) {
316+
transfer(prefix_buffer[i]);
317+
}
318+
for (size_t i = 0; i < len; i++) {
319+
transfer(buffer[i]);
320+
}
309321
}
310322
digitalWrite(_cs, HIGH);
311323

@@ -396,8 +408,17 @@ bool Adafruit_SPIDevice::write_then_read(uint8_t *write_buffer,
396408

397409
digitalWrite(_cs, LOW);
398410
// do the writing
399-
for (size_t i = 0; i < write_len; i++) {
400-
transfer(write_buffer[i]);
411+
#if defined(ARDUINO_ARCH_ESP32)
412+
if (_spi) {
413+
if (write_len > 0) {
414+
_spi->transferBytes(write_buffer, nullptr, write_len);
415+
}
416+
} else
417+
#endif
418+
{
419+
for (size_t i = 0; i < write_len; i++) {
420+
transfer(write_buffer[i]);
421+
}
401422
}
402423

403424
#ifdef DEBUG_SERIAL

0 commit comments

Comments
 (0)