Подключение к Olimexino FPGA

Вдохновлённый успехом PWM-синтезатора на базе Olimexino-STM32, я сказал себе, что было бы неплохо подключить к Olimexino-STM32 аудио-кодек.

К моему сожалению микроконтроллер STM32F103RBT6, в отличие от своих старших собратьев, не оснащён контроллером интерфейса I2S. Но зато у него есть целых два интерфейса SPI, и поэтому я решил, что к аудио-кодеку его можно подключить, подключив сам кодек к FPGA, а микроконтроллер с FPGA связать по интерфейсу SPI, что с одной стороны удобно -- не требуется думать о таких вещах, как реалтаймовое быстродействие алгоритмов для частот квантования кодека, а с другой стороны интересно и перспективно, ведь FPGA сам по себе предоставляет широкие возможности для создания нестандартных дополнительных функций цифровой обработки сигналов (ЦОС).

Подключение FPGA к Olimexino-STM32

Прежде всего я электрически соединил обе платы (Olimexino-STM32 и плату c чипом FPGA), подключив к порту SPI1 Olimexino-STM32 выбранные пины Row I/O или Column I/O чипа Altera Cyclone с тем, чтобы иметь возможность при необходимости использовать в качестве мастера SPI как Olimexino-STM32, так и FPGA, а для этого нужно, чтобы пин поддерживал режим двунаправленного ввода-вывода (так называемый bidirectional). Нужно заметить, что пины ввода-вывода FPGA, в отличие от пинов ввода-вывода современных микроконтроллеров, не оснащены встроенными подтягивающими (pull-up) резисторами, поэтому после подключения выяснилось, что такие резисторы требуются. Получилась следующая схема:

Схема подключения Olimexino-STM32 к FPGA по интерфейсу SPI

Для FPGA я написал Slave-модуль интерфейса SPI, а в Olimexino-STM32 загрузил следующий тестовый скетч (скачать):

HardwareSPI spi(1);


#define LED 7

#define NSS1 10


unsigned char count = 0;


void setup()

{

pinMode(LED, OUTPUT);

spi.begin(SPI_18MHZ, MSBFIRST, SPI_MODE_0);

//spi.beginSlave(MSBFIRST, SPI_MODE_0);

pinMode(NSS1, OUTPUT);

digitalWrite(NSS1, LOW);

}


void loop()

{

count += 1;

digitalWrite(LED, HIGH);

byte response = spi.transfer(count);

// Print out the response received.

SerialUSB.print(count, DEC);

SerialUSB.print(" response: ");

SerialUSB.println(response, DEC);

delay(250);

digitalWrite(LED, LOW);

delay(250);

}

Вывод работы скетча со Slave-модулем можно посмотреть в терминале (Serial Monitor) Maple IDE, выглядит это примерно следующим образом:

36 response: 35

37 response: 36

38 response: 37

39 response: 38

40 response: 39

41 response: 40

42 response: 41

43 response: 42

Проще говоря, регистр slave-модуля интерфейса SPI содержит предыдущее полученное от Olimexino-STM32 значение, которое благодаря циклическому сдвигу по цепочке MOSI-MISO передаётся обратно в сдвиговый регистр интерфейса SPI1 микроконтроллера STM32F103RBT6.

После успешного подключения микроконтроллера Olimexino-STM32 к FPGA, я получил не менее успешное функционирование slave-модуля SPI на скорости передачи 18 МГц (чип FPGA при этом тактировался от кварцевого генератора с частотой 48 МГц).

Автор: Андрей Шаройко <vanyamboe@gmail.com>