Программный драйвер для работы с разными видами интерфейсов SPI
При подключении аналого-цифрового преобразователя (АЦП) к отладочной плате Altera DE10-Nano по интерфейсу SPI возникла проблема, требующая не стандартного решения. Данная проблема заключается в том, что в САПР Quartus, в IP каталоге имеется готовый блок SPI, который находится в программном средстве Platform Designer (Qsys), и имеет четыре линии для подключения (рис. 1):
- SCLK — тактовый сигнал;
- SS_n — сигнал разрешающий передачу/прием данных;
- MISO — прием данных;
- MOSI — передача данных.
В свою очередь АЦП имеет три линии для подключения:
- SLKC – тактовый сигнал;
- CSB – сигнал разрешающий передачу/прием данных;
- SDIO – двунаправленный сигнал приема/передачи данных.
Подключение тактовых сигналов и сигналов разрешения не вызывают затруднений, а сигналы на прием и передачу данных не могут быть подключены на прямую, так как необходим специальный драйвер, отвечающий за своевременное переключение сигналов MISO и MOSI.
Решить данную проблему можно несколькими способами:
- Аппаратным — добавив к принципиальной схеме несколько элементов, что добавило к изделию, стоимость, вес, а также дополнительное время на монтаж новых компонентов.
- Программным — перенастроив в Quartus линии MISO и MOSI в одну, разбираясь при этом с кодом, и тратя на это значительную часть времени.
Поэтому возникла идея создать драйвер, реализующий в себе прямое подключение данных информационных сигналов. Подключение драйвера показано на рис. 2.
Для того чтобы происходила корректная передача данных необходимо строго выдержать все временные параметры [1], а также выбрать правильный момент переключения драйвера (рис. 3), учитывая при этом и особенности работы интерфейса SPI в Qsys (рис. 4).
Реализация данного драйвера описана на языке Verilog [2] (рис. 5) где:
- SDIO_reg — регистр в который происходит запись данных с порта ввода-вывода SDIO;
- SDIO_counter — счетчик положительных фронтов сигнала SCLK;
- en — сигнал по котором осуществляется переключение;
- wire_mux, SDIO, MISO — линии подключения.
Разберем подробно работу данного драйвера. Когда сигнал CSB=1, происходит обнуление регистров SDIO_reg и SDIO_counter и сигнал разрешения en=1. По положительному фронту сигнала SCLK, если сигнал CSB=0, происходит увеличение счетчика SDIO_counter на единицу за такт, и в момент передачи первого бита информации происходит запись этого бита с порта SDIO в первый разряд регистра SDIO_reg.
По отрицательному фронту сигнала SCLK, если сигнал CSB=0, и, если выполняются еще два условия — SDIO_counter≥16, первый разряд регистра SDIO_reg=1, регистр en приобретает значение 0.
К линии wire_mux подключается MOSI, если en=1 и ток течет из MOSI в MISO и в SDIO, иначе линии переходит в третье состояние и тогда по пути наименьшего сопротивления ток течет из SDIO в MISO.
Подробная схема драйвера, сгенерированная в RTL Viewer показана на рис. 6.
Подводя итог, хотелось бы отметить, что данный драйвер является гибким в использовании, простым в перенастройке, если необходимо использовать другой момент времени для переключения линий, а также использует незначительное количество логических элементов и регистров.
- AN-877: Сопряжение быстродействующих АЦП посредством интерфейса SPI
- Строгонов А.В. «Реализация алгоритмов цифровой обработки сигналов в базисе программируемых логических интегральных схем». СПБ: Издательство «Лань». 2019.