#include // similar to variables used in TFT library volatile uint8_t *csport, *rsport; uint8_t cspinmask, rspinmask; void setup() { SPI.begin(); Serial.begin(9600); SPI.setClockDivider(SPI_CLOCK_DIV2); while (!Serial) ; delay(1000); Serial.println(); Serial.print(" Plain SPI: "); test_no_transaction(); Serial.println(); #if defined(SPI_HAS_TRANSACTION) Serial.print("Transaction API (interrupts not used): (TFT estimate) "); test_transaction_TFT(); Serial.println(); // Uncomment to check interrupt-based API SPI.usingInterrupt(0); // Uncomment to check event-based API //SPI.onBeginEvent(beginEvent); //SPI.onEndEvent(endEvent); Serial.print("Transaction API (using interrupts): (TFT estimate) "); test_transaction_TFT(); Serial.println(); #endif csport = &PORTC; rsport = &PORTC; cspinmask = 1; rspinmask = 2; } boolean interruptSave; void beginEvent() { interruptSave = interruptsStatus(); noInterrupts(); } void endEvent() { if (interruptSave) interrupts(); } void loop() { } void writecommand(byte cmd) { *rsport &= ~rspinmask; *csport &= ~cspinmask; SPI.transfer(cmd); *csport |= cspinmask; } void writedata(byte cmd) { *rsport |= rspinmask; *csport &= ~cspinmask; SPI.transfer(cmd); *csport |= cspinmask; } void test_transaction_TFT() { uint32_t start = millis(); for (int i = 0; i < 30000; i++) { // emulate setAddrWindow() -- 11 SPI transfers SPI.beginTransaction(SPI_CLOCK_8000000, MSBFIRST, SPI_MODE0); writecommand(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writecommand(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writecommand(0xff); SPI.endTransaction(); SPI.beginTransaction(SPI_CLOCK_8000000, MSBFIRST, SPI_MODE0); *rsport |= rspinmask; *csport &= ~cspinmask; SPI.transfer(0xff); SPI.transfer(0xff); *csport |= cspinmask; SPI.endTransaction(); } uint32_t delta = millis() - start; float loopsPerSec = 1000.0 / delta * 30000.0; float throughput = loopsPerSec * 13 * 8; Serial.print(throughput); } void test_no_transaction() { uint32_t start = millis(); for (int i = 0; i < 30000; i++) { writecommand(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writecommand(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writedata(0xff); writecommand(0xff); *rsport |= rspinmask; *csport &= ~cspinmask; SPI.transfer(0xff); SPI.transfer(0xff); *csport |= cspinmask; } uint32_t delta = millis() - start; float loopsPerSec = 1000.0 / delta * 30000.0; float throughput = loopsPerSec * 13 * 8; Serial.print(throughput); }