Использование дополнительных GPIO в качестве цифрового ввода-вывода?

11

надеюсь, этот вопрос довольно прост, но мой быстрый поиск в Google не нашел ответа.

Я знаю, что RPi имеет несколько GPIO, которые я могу использовать, а также специализированные GPIO (SPI, I2C, UART и т. Д.). В моем проекте у меня фактически заканчиваются обычные GPIO, и я хотел бы использовать SPI, I2C и другие GPIO в качестве «обычных» GPIO. Я знаю, что это можно сделать, но, думаю, я не уверен, как настроить их так, чтобы они не работали в режимах SPI / I2C / etc и просто работали как обычные GPIO.

Нужно ли что-то делать, чтобы правильно настроить их для этого?

Андрей Корсини
источник

Ответы:

10

Краткий ответ

Нет, ты (почти) нет. На самом деле все наоборот - их нужно настраивать не для GPIO, а для выполнения их специальных задач. Единственным исключением являются контакты UART. Также и I²C контакты как-то особенные.

Контакты UART

Выводы UART используются ядром для консоли. Вам нужно будет настроить систему так, чтобы они не использовались, если вы хотите, чтобы они были доступны для вашего использования:

  • редактировать /boot/cmdline.txtи удалять console=ttyAMA0,115200и kgdboc=ttyAMA0,115200параметры
  • отредактируйте /etc/inittabи закомментируйте (поставьте #перед ним символ) строку:

    T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    
  • перезагрузите свой RaspberryPi

Теперь контакты не должны использоваться системой, и вы можете использовать их

I²C контакты

На выводы I²C установлены встроенные нагрузочные резисторы 1,8 кОм. Они не могут быть отключены. Это ограничивает использование этих выводов в некоторых ситуациях (но может быть удобно в других).

Дополнительные решения

Если у вас мало контактов GPIO, иногда вы можете легко увеличить его число, используя дополнительное (но простое) оборудование. Например, для вывода можно использовать shift registersили I²C I/O expanders(также называемый расширителем шины I²C), который легко купить и использовать. Вы можете найти пример его использования здесь .

PFC8574(или аналогичные из этого семейства) настолько популярны, что есть готовый модуль ядра, который обрабатывает все коммуникации для вас ( он не включен в официальном ядре RaspberryPi, вам нужно будет скомпилировать собственное ядро, чтобы использовать его ). Модуль называется gpio_pcf857x, при условии, что вы загрузили его modprobe(вместе с драйверами I²C) и что у вас есть чип, подключенный к I²Cшине, вы можете активировать его следующим образом:

echo pcf8574 0x27 > /sys/class/i2c-adapter/i2c-0/new_device

где pcf8574- ваше реальное имя чипа (этот модуль может обрабатывать несколько различных чипов, таких как pca967xи max732x) и 0x27его адрес I²C(вы можете настроить адрес чипа при его подключении).

Это создаст записи в /sys/class/gpio/каталоге, которые позволят вам использовать их так же, как и другие порты GPIO в RaspberryPi, при условии, что вы используете sysинтерфейс (например, wiringPiSetupSys()в wiringPi). К сожалению, RPi.GPIOмодуль Python не поддерживает этот режим, поэтому он не сможет использовать эти контакты с этой библиотекой. Контакты будут иметь несколько больших чисел, таких как 248-255 или аналогичные.

Примечание: PCF8574 is sinking current- он может дать потребителю накопитель (принять в низком состоянии) до 20 мА, но он может выдавать только 0,1 мА в высоком состоянии. Это означает , что вы обычно собираетесь использовать его в обратном логике, то есть +3.3V -> LED -> RESISTOR -> PCF8574_PIN.

Кшиштоф Адамски
источник