Чтение нестандартного АЦП с STM32F3

Я пытаюсь связать STM32F303 Nucleo с AD7748-4. Паспорт на АЦП:

https://www.analog.com/media/en/technical-documentation/data-sheets/ad7768-7768-4.pdf

Проблема в том, что АЦП НЕ выводит преобразованное значение через порт SPI, а скорее использует сигнал готовности данных (DRDY), тактовый сигнал данных (DCLK) и комбинацию из 4 выходов данных (DOUT0-DOUT3). Выходные потоки передают 96 битов последовательно через один провод, если я настроил его таким образом, но время имеет решающее значение в моем приложении, и мне нужно синхронизировать данные с использованием DOUT0 в DOUT2, каждый из которых будет выводить 32 бита. Если бы я передавал данные последовательно, я мог бы обманом заставить порт SPI прочитать их, но это не так. АЦП работает на частоте 20 МГц, поэтому DCLK будет работать на той же частоте. Nucleo работает с максимальной частотой 72 МГц, но когда используется DAM, он устанавливает тактовую частоту на 64 МГц.

В руководстве STM он описывает «регистр входных данных порта GPIO (GPIOx_IDR) (x = A..H)» как регистр только для чтения - я понимаю, что младшие 16 бит могут хранить введенное значение до 16 бит. (скорее всего, для чтения / записи данных в памяти) - поэтому вопрос в том, как я могу настроить GPIO для чтения данных? Я здесь в небольшом тупике. Мой инстинкт подсказывает мне, что Nucleo может быть недостаточно быстрым, чтобы читать данные, поступающие с АЦП ... Есть идеи? Все написано на C / C ++ в основном на голом металле ... Я новичок в Nucleo, не писал код уже 4 года - простите за упущение в знаниях ...


person Jedi Engineer    schedule 13.11.2018    source источник


Ответы (1)


Если DCLK работает на частоте 20 МГц, очевидно, что uC недостаточно быстр (у вас есть около 3 инструкций между каждым циклом, поэтому даже язык ассемблера будет трудно реализовать ...). Поскольку я не знаком с архитектурой stm, я могу только предложить трюк, который, возможно, вызовет некоторые идеи в вашей голове. Вместо того, чтобы использовать кристалл для АЦП, используйте таймер от STM, который подключен к выходному выводу, и синхронизируйте АЦП, используя этот вывод (MCLK). При настройке АЦП с использованием SPI, режима ожидания и т. Д. Вы можете оставить этот тактовый сигнал на 20 МГц. Но когда вам понадобится выборка из АЦП, остановите таймер STM и синхронизируйте АЦП «вручную». (вы практически контролируете сигнал DCLK). После завершения процедуры преобразования перезапустите таймер на 20 МГц.

person luci88filter    schedule 13.11.2018
comment
Тактовая частота 20 МГц для 32-битных данных означает, что вам потребуется прибл. 600k выборок в секунду. Вы уверены, что вам нужна такая скорость передачи данных? Если это так, возможно, микроконтроллер - не подходящее решение. - person luci88filter; 13.11.2018
comment
Спасибо @ luci88filter, мы установили делитель тактовой частоты на 4, так что это 20MHz / 4/32 = 80kSPS, для чего мы и стремимся. Тем не менее, мы переключаемся на более быстрый процессор - 216 МГц - должен дать нам достаточно времени для тактовой синхронизации - в общей сложности не менее 11 циклов, поэтому мы должны иметь возможность сдвигать данные в регистр на каждом фронте тактовой частоты. . С надеждой. Спасибо! - person Jedi Engineer; 13.11.2018