Как управлять сигналом CS в модуле SPIDEV на Raspberry Pi - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь использовать модуль SPIDEV в Python 2.7 для взаимодействия Raspberry Pi 3 с ADS1256 ADC по шине SPI, доступной на устройстве Raspberry Pi.Проект состоит в том, чтобы установить связь с двумя из этих АЦП и сэмплировать все каналы (по 8 каналов каждый) с частотой дискретизации 250 Гц.

Функции в модуле SPIDEV, отвечающие за передачу данных, xfer и xfer2.Проблема с этими функциями заключается в том, что они выдают активную команду CS (переводят CS в низкий уровень), выполняют транзакцию и дают команду освобождения CS (выводят CS в высокий уровень).Для связи с ADS1256 необходимо отправить серию команд на АЦП, в то время как для CS поддерживается низкий логический уровень.Это возможно, перечислив все команды вместе и передав их в функцию xfer / xfer2 следующим образом:

$xfer2([10, 20, 30, 40])$

Однако этот способ отправки команд не дает АЦП достаточно времени для обработкикаждая команда или, другими словами, синхронизация между инструкциями нарушает спецификации синхронизации АЦП.Если, с другой стороны, отправляется одна команда за раз, то переключение CS заставляет АЦП забыть предыдущую команду.

Две другие альтернативы, предложенные онлайн, которые я пробовал, вводят слишком большую задержку, которую я не могуСожмите все чтения канала в течение промежутка времени, который у меня есть между каждым экземпляром выборки.Этими альтернативами являются:

  • Модуль WiringPi: этот модуль имеет функцию wiringPiSPIDataRW, которая выполняет только транзакцию данных, и CS может управляться отдельно с помощью функций ввода-вывода в модуле.Недостатком является то, что время между каждым вызовом этой функции, а также время между установлением минимума CS и вызовом этой функции составляет более 200 микросекунд, которые в совокупности превысят 4 миллисекунды (мой период выборки), когда я буду производить выборку всех каналов.,Использование отдельного пина для CS при использовании SPIDEV: эта опция также вводит более 100-микросекундных задержек между вызовами функций.

Это два предложения, которые я изучил, изучая сообщество Raspberry Pi и переполнение стека..

Функции xfer в SPIDEV также предоставляют аргумент, называемый задержкой, и в соответствии с документацией он должен контролировать задержку между блоками, но это означает только то, как долго CS должен оставаться низким после завершения транзакции.,Например: если я выдаю:

$xfer2([12, 23, 34, 46], 1800000, 30)$

Он будет поддерживать низкий уровень CS в течение 30 микросекунд в конце только после того, как отправка 46 закончится.Он не обеспечивает 30 микросекунд между каждым байтом, т.е. 12, 23, 34 и 46, что является идеальной вещью, которая мне нужна.Однако, если я, конечно, из-за природы Raspberry Pi сделаю

xfer2([12])
xfer2([23])
xfer2([34])
xfer2([46])

, то время между каждым будет больше 100 микросекунд, с которым я не справлюсь.

Так что это поможетМне нужно контролировать задержку между командами.

Если это невозможно, то, что позволит мне управлять CS в функциях xfer, чтобы они не переключали его.Это означает, что я могу управлять выводом CS с помощью функций ввода-вывода.Это предотвратит модификацию аппаратного обеспечения на моей плате, в которой в качестве CS используется вывод CE заголовка raspberry pi GPIO.Хотя это все еще медленное решение, но намного быстрее, чем функции в модуле wiringPi.В худшем случае мне придется изменить свое оборудование и использовать другой вывод GPIO для использования в качестве CS.

Спасибо за чтение

...