Имеем поток 16-ти битных слова от мастера:
3.3v TTL. Клок 1.25Мгц. Слова идут непрерывно, паузы между пакетами в 1Tc.
Непрерывно весь поток читать не нужно, только переодически отслеживать изменение значения слова.
Пытаюсь отладить чтение в SPI-slave режиме на Atmega328p (платка arduino nano v3), 5В питалово. Т.к slave ничего не пердаёт, подключен напрямую без шифтера 3.3-5в.
В итоге, всё читается, но где-то один из 200-300 пакетов в среднем, читается неправильно.
Все тайминги по даташиту проходят с запасом.
В основном путается порядок байт в слове, но иногда неверно читаются и сами байты.
Прогнал на логанализаторе с длинной памятью c порогами для 5v TTL - никаких ошибок в передаче нет.
Пробовал читать с прерываним по SS и просто в цикле с предварительным опросом ноги SS, без разницы.
В итоге упростил код до:
while (!(PINB & 0x4) ); // wait until SlaveSelect goes High
while(!(SPSR & (1<<SPIF))); // SPIF bit set when 8 bits received
w.c[0] = SPDR;
while(!(SPSR & (1<<SPIF))); // SPIF bit set when 8 bits received
w.c[1] = SPDR;
никаких прерываний, только чтение и вывод на serial. Всё по прежнему.
Но, если вставить задержку порядка 1мс в основном цикле до или после вышеприведённого кода, то ошибки чтения пропадают полностью. Оставлял на час, ни одной ошибки. Если менять задержку как в большую, так и в меньшую сторону, ошибки снова возникают с разной частотой в зависимости от задержки.