Работаю с STM32, начинающий в сфере электроники. Есть задача подключить 6 АЦП ADS127l01 к STM32F767(или аналогу).
АЦП сигнализирует о готовности данных по сигналу DRDY, и есть несколько особенностей:
1) STM32 не имеет SPI с аппаратным триггером
2) АЦП 24-битный
3) Целевые скорости выдачи данных 256 кГц и выше
Путем проб и ошибок вышел на следующую схему:
1) SPI с DMA висит в режиме SLAVE постоянно
2)DRDY подключен к таймеру, таймер по сигналу генерирует 24 импульса на выходе, подключённому к SCK STM32 и АЦП, данные читаются и записываются в буфер
Схема рабочая, проверено, но:
1) таймеров которые могут сами считать 24 импульса всего 2, остальные не имеют параметра repetition counter
2)чтение данных работает только на частотах до 128 кГц
Подозреваю , что дело в тонкостях настройки pulse, поэтому приобрел внешнюю линию задержки DS1023-25+. Вопрос к знактокам, как можно обойти описанные выше проблемы, реализовывал ли кто-то подобные схемы и в правильном лиия вообще направлении двигаюсь?
Кочерга, добрый вечер, я посмотрел вашу схему и должен сказать, что ваш подход с генерацией точного числа импульсов таймером для обхода отсутствия аппаратного триггера SPI - это реально остроумно. Вы мыслите в правильном направлении, я думаю.
Мне кажется на остальных таймерах можно эмулировать поведение. Попробуйте настроить One-pulse mode, но не используйте аппаратный счетчик повторения, а подсчет нужного количества импульсов перенести в программную часть.
Попробуйте эту схему:
Переведите таймер в One-Pulse Mode, включите прерывание по событию UEV, в обработчике прерывания HAL_TIM_PeriodElapsedCallback заведите статическую переменную-счетчик. При каждом вызове прерывания -
Увеличивайте значение счетчика на 1. Если значение достигло 24, сбрасывайте счетчик на 0, и вручную снова запускайте таймер, взводя бит CEN. Импульсная последовательность на выходе прекратится.
Когда таймер в STM32 получает команду запуститься по DRDY, он синхронизирует этот сигнал со своей внутренней тактовой частотой. Эта задержка плюс задержка на выходном компараторе может составлять десятки наносекунд. В результате фронт первого SCK от таймера может приходить слишком рано, когда АЦП еще не установил первый бит данных, или слишком поздно, и STM32 в режиме SPI Slave не успевает захватить данные до прихода следующего фронта. Удачи в вашем деле! Пишите, отвечу как время будет.
kocherga_228, там есть PIO подсистема, где можно накодить хоть десяток полуаппаратных SPI обработчиков хоть на 600 МГц. Это бы решило проблему с захватом RDY и получением данных
kocherga_228, одновременно запускаешь на измерение, после снимаешь данные и снова запускаешь измерение.
если в ацп отделены циклы измерения и считывания, то можно запускать цикл измерения и пока он идет, снимать данные предыдущего цикла.
все АЦП должны работать одновременно. Должна быть система, собирающая данные от 6 АЦП соазу
Измерения должны быть синхронизированы -- это поянтно, но получить их из АЦП можно же и последовательно? На максимальной частоте SPI в 20МГц для опроса шести 24-битных АЦП с частотой 256КГц можно обойтись тремя SPI-шинами, по два АЦП на каждой.
АЦП засинхронизировать, чтобы они данные все одновременно выдавали, клоки самого АЦП и SPI тоже объединить,
а 6 выходов ацп завести в параллельный DCMI, таймером генерить CS(FSYNC) == HSYNC, и непрерывно захватывать 6-ти битную "картинку" шириной 24(32) пикселя(бита).
частоты не сильно большие возможно даже и без DCMI, можно обойтись, через таймер->DMA->GPIO.
А почему не хотите использовать Daisy-Chain (п. 9.1.2.2)? 2 SPI на 2 цепочки по 3 АЦП могут дать до 347 квыборок (SCK = 25 MHz) без учёта накладных расходов.
Если DMA умеет захватывать с GPIO, то можно попробовать тактировать интерфейс и слать команды по SPI, а выходы АЦП брать параллельно.
6 штук... контроль электроэнергии что ли? Куда там 256+ квыборок - то? КМК, достаточно до 50-100 гармоники захватить (25-50 кГц с учётом 10 кратного antialiasing).
Вы пробовали просто триггерить прерывание по EXTI? Как бы использовать такую логику: получаем прерывание по фронту на GPIO, а в прерывании читаем SPI, снова пинаем АЦП. UPD: А! Их целых 6 штук! У F767 нет аппаратного триггера? Странно. В Reference manual можно почитать про бит FRF в регистре SPIx_CR2. Там вроде можно переключаться между форматами фрейма. Тогда по идее можно будет просто зайдействовать все 6 аппаратных SPI без каких либо костылей.