Простенький пример - запускаю таймер и в его прерывании отправляю по SPI буфер 16 байт.
Если отправлять циклом “фор” по одному байту - передаются данные, если отправлять буфером - отправляются нули.
Код
#include <SPI.h>
// данные
uint8_t dd[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
volatile uint8_t* d_ptr = dd;
uint8_t datasize = 16;
ISR(TIMER2_COMPA_vect)
{
d_ptr = dd;
// вариант 1 - отправка побайтно
/*for (int i = 0;i < datasize;i++) {
SPI.transfer(*(d_ptr++));
}*/
// вариант 2 - отправка буфером
SPI.transfer(d_ptr, datasize);
}
void setup() {
// put your setup code here, to run once:
SPI.begin(); //Initialize the SPI port.
SPI.setBitOrder(MSBFIRST); // Set the SPI bit order
SPI.setDataMode(SPI_MODE0); //Set the SPI data mode 0
SPI.setClockDivider(SPI_CLOCK_DIV8);
uint8_t TC2_prescaler = ((1 << CS22) | (1 << CS21) | (0 << CS20));
uint8_t TC2_top = 200;
TCCR2A = (1 << COM2B1) | (0 << COM2B0) | (1 << WGM21) | (1 << WGM20); // OC2B non-invert, Fast PWM mode
TCCR2B = 0;
OCR2A = TC2_top;
OCR2B = (100 * TC2_top) / 255;
TCCR2B = TC2_prescaler;
TIMSK2 = (1 << OCIE2A); // enable compA irq
}
void loop() {
// put your main code here, to run repeatedly:
}
Я вижу что буфер затирается ПРИНЯТЫМИ данными ! Идёт именно обмен - передал получил и сохранил вместо переданного. На первом заходе думаю всё улетает нормально.
С буфером более менее красиво - пара лишних тактов всего. А если байтами или словами … Адафруит цвет передаёт словом - не буфером !!! И первая картинка именно при её отправке …
В реальности разница в скорости передачи между буфером и байтами всего порядка 15%. Хотя если посмотреть в исходник метода - становится понятно почему…