Подключение к 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) резисторами, поэтому после подключения выяснилось, что такие резисторы требуются. Получилась следующая схема:
Для 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>