Теоретически, чтобы подключить к Arduino микросхему FPGA, требуется выполнить согласование уровней напряжений сигналов, поскольку выводы FPGA соответствуют стандарту логических уровней напряжений LVTTL. Так я и поступил, подключив чип FPGA к Arduino по следующей схеме согласования:
Однако стабильно эта схема работать по невыясненной пока причине отказалась -- данные передавались как бы с помехами на линии (периодически два-три байта передавались неверно). Чуть лучше всё это работало, если после отправки каждого байта посылался импульс по линии nSS.
Тогда я попробовал подключить к FPGA трёхвольтовую плату Olimexino-STM32, и в результате выяснилось, что первая версия slave-модуля интерфейса SPIбыла написана что называется криво. Переписав модуль с нуля и добавив подтягивающие (pull-up) резисторы, я получил работающую схему, которая успешно передает данные даже с частотой тактирования SCK 18 МГц (18 Мбод).
Я соединил по такой же схеме согласования уровней Arduino и Olimexino-STM32, однако выяснилось, что данные по ней получается передавать, только когда Olimexino-STM32 выступает в качестве мастера, а Arduino в режиме slave. Да и то, со скоростью не выше 1.125 МГц.
С написанным мною slave-модулем интерфейса SPI, после добавления в схему дополнительных подтягивающих (pull-up) резисторов, Arduino в качестве мастера работать и вовсе отказался -- данные передаются, но неверно. Тестирование самой схемы согласования не выявило никаких проблем, да и Olimexino-STM32 в роли мастера и Arduino в режиме slave с ней успешно работают.
UPD1: Есть подозрение, что вышел из строя кварцевый осциллятор. Возможно, причина того, что данные от Arduino перестали передаваться, заключается именно в этом.
UPD2: Замена осциллятора не спасла положения. Возможных вариантов вижу 3:
UPD3: Удалось выяснить причину появления "мусора" при передаче. Причиной оказался блок питания, который я использовал. Попробую заменить на другой.
UPD4: Заказал на Farnell DE0-Nano.