Использование 40 контактного разъема GPIO
Описание контактов

Нумерация контактов на плате следующая:

Функции контактов разъёма приведены в таблице:
| Контакт | ACPI GPIO | DT GPIO | GPIO | Альтернативная функция | Альтернативная функция |
|---|---|---|---|---|---|
| 1 | 3.3 V | ||||
| 2 | 5 V | ||||
| 3 | 13 | 65 | GPIO 056 | I2C-2_SDA (0x04030000) | |
| 4 | 5 V | ||||
| 5 | 12 | 64 | GPIO 055 | I2C-2_CLK | |
| 6 | GND | ||||
| 7 | 54 | 106 | GPIO 097 | PWM_5 (0x04115000) | |
| 8 | 62 | 114 | GPIO 105 | UART_3_TXD (0x040e0000) | |
| 9 | GND | ||||
| 10 | 63 | 115 | GPIO 106 | UART_3_RXD | |
| 11 | 155 | 32 | GPIO 015 | ||
| 12 | 157 | 34 | GPIO 017 | ||
| 13 | 156 | 33 | GPIO 116 | ||
| 14 | GND | ||||
| 15 | 56 | 108 | GPIO 099 | PWM_5 (0x04113000) | UART_1_TXD (0x040c0000) |
| 16 | 57 | 109 | GPIO 100 | UART_1_RXD | |
| 17 | 3.3 V | ||||
| 18 | 158 | 35 | GPIO 018 | ||
| 19 | 130 | 17 | GPIO 028 | SPI_1_MOSI | |
| 20 | GND | ||||
| 21 | 127 | 14 | GPIO 025 | SPI_1_MISO | |
| 22 | 159 | 36 | GPIO 019 | ||
| 23 | 131 | 18 | GPIO 029 | SPI_1_CLK | |
| 24 | 128 | 15 | GPIO 026 | SPI_1_CS0 | |
| 25 | GND | ||||
| 26 | 129 | 16 | GPIO 027 | SPI_1_CS1 | |
| 27 | 5 | 57 | GPIO 048 | I2C-5_SDA (0x04060000) | |
| 28 | 4 | 56 | GPIO 047 | I2C-5_CLK | |
| 29 | 160 | 37 | GPIO 020 | ||
| 30 | GND | ||||
| 31 | 163 | 40 | GPIO 023 | ||
| 32 | 161 | 38 | GPIO 021 | ||
| 33 | 164 | 41 | GPIO 024 | ||
| 34 | GND | ||||
| 35 | 14 | 66 | GPIO 057 | ||
| 36 | 162 | 39 | GPIO 022 | ||
| 37 | 17 | 69 | GPIO 060 | ||
| 38 | 18 | 70 | GPIO 061 | I2C-4_CLK | |
| 39 | GND | ||||
| 40 | 19 | 71 | GPIO 062 | I2C-4_SDA (0x04050000) |
Часть содержимого приведенной таблицы приведена на цветном изображении:

В таблице выше показаны базовые адреса соответствующих регистров для PWM, I2C и UART. Это полезно для проверки того, какому выводу в 40-контактном разъеме соответствует узел в /sys/class
Всего в 40-контактном интерфейсе имеется 28 портов GPIO. Напряжение всех GPIO портов — 3,3 В.
Использование портов
GPIO
-
В системах с ядром Linux 6.1 необходимо убедиться, что система загружена в режиме 0 Orange Pi 6 plus (Device Tree).

-
Для систем с ядром Linux 6.6, использующих ACPI, убедитесь с помощью команды dmidecode, что версия BIOS - v1.0_for_opi6plus_linux
sudo dmidecode -s bios-versionЕсли это не так, то обратитесь к разделу Обновление BIOS на плате Orange Pi 6 plus, чтобы записать нужную версию BIOS
Соответствие номеров интерфейсов в системе с номерами GPIO показана в таблице выше. Если ядро использует Device Tree, то номер интерфейса указан в столбце DT GPIO. Если используется ядро ACPI, см. столбец ACPI GPIO.
Интерфейс /sys/class/gpio можно использовать для управления высоким и низким уровнями выходов GPIO. Пример управления уровнем GPIO 056 показан ниже:
-
Переключитесь на пользователя root
sudo -i -
Номер интерфеса GPIO в системе из таблицы.
- Для ядра Linux 6.1 GPIO 056 номер интерфейса равен 65
- Для ядра Linux 6.6 GPIO 056 - интерфейс номер 13
-
Затем используйте следующую команду для экспорта GPIO056:
-
Linux 6.1
echo 65 > /sys/class/gpio/export -
Linux 6.6
echo 13 > /sys/class/gpio/export
-
-
Затем установите GPIO056 в режим вывода.
-
Linux 6.1
echo out > /sys/class/gpio/gpio65/direction -
Linux 6.6
echo out > /sys/class/gpio/gpio13/direction
-
-
Затем используйте следующую команду, чтобы установить высокий уровень GPIO056.
-
Linux 6.1
echo 1 > /sys/class/gpio/gpio65/value -
Linux 6.6
echo 1 > /sys/class/gpio/gpio13/value
-
-
Для установки низкого уровня GPIO056.
-
Linux 6.1
echo 0 > /sys/class/gpio/gpio65/value -
Linux 6.6
echo 0 > /sys/class/gpio/gpio13/value
-
-
В системе Linux предустановлен сценарий blink_gpio.sh, который можно использовать чтобы быстро проверить работу порта GPIO, выдающего высокие и низкие уровни.
-
Получить путь к скрипту blink_gpio.sh можно следующей командой:
which blink_gpio.sh -
Для использования скрипта blink_gpio.sh нужно добавить в параметры команды один или несколько портов GPIO, соответствующих проверяемым контактам. После запуска сценарий будет циклически повторяться, включая и выключая порты GPIO.
Linux 6.1
sudo blink_gpio.sh 65Linux 6.6
sudo blink_gpio.sh 13 -
После выполнения приведенной выше команды используйте мультиметр для проверки контакта соответствующиего GPIO056. Вы увидите, что напряжения циклически меняется от 0 В до 3,3 В.
-
Для циклического изменения напряжения на всех контактах GPIO используйте следующую команду:
Linux 6.1
sudo blink_gpio.sh 65 64 106 32 33 108 17 14 18 57 37 40 41 66 69 114 115 34 109 35 36 15Linux 6.6
sudo blink_gpio.sh 4 5 12 13 14 17 18 19 54 56 57 62 63 127 128 129 130 131 155 156 157 158 159 160 161 162 163 164
-
SPI
-
В системах с ядром Linux 6.1 необходимо убедиться, что система загружена в режиме 1 Orange Pi 6 plus 40pin (Device Tree).

-
Для систем с ядром Linux 6.6, использующих ACPI, убедитесь с помощью команды dmidecode, что версия BIOS - v1.0_for_opi6plus_linux_40pin
sudo dmidecode -s bios-versionЕсли это не так, то обратитесь к разделу Обновление BIOS на плате Orange Pi 6 plus, чтобы записать нужную версию BIOS
Проверьте, есть ли в Linux узел устройства spidev0.x. Если он существует, это значит, что SPI настроен и его можно использовать напрямую.
ls /dev/spidev
Без замыкания контактов MOSI и MISO SPI1 результат запуска команды spidev_test будет следующим:
sudo spidev_test -v -D /dev/spidev0.0

Затем закоротите контакты MOSI и MISO SPI1 и снова запустите spidev_test. Вы можете видеть, что отправленные и полученные данные совпадают, что указывает на то, что шлейф SPI исправен

I2C
-
В системах с ядром Linux 6.1 необходимо убедиться, что система загружена в режиме 1 Orange Pi 6 plus 40pin (Device Tree).

-
Для систем с ядром Linux 6.6, использующих ACPI, убедитесь с помощью команды dmidecode, что версия BIOS - v1.0_for_opi6plus_linux_40pin
sudo dmidecode -s bios-versionЕсли это не так, то обратитесь к разделу Обновление BIOS на плате Orange Pi 6 plus, чтобы записать нужную версию BIOS
Как видно из таблицы выше, в 40-контактном разъеме платы разработки есть 3 группы шин I2C: I2C-2, I2C-4 и I2C-5. Перед дальнейшими действиями с портами проверьте соответствие между I2C контроллера и именем узла устройства в /dev. Для этого используйте команду i2cdetect -l
sudo i2cdetect -l
В выведенном списке:
- 0x04030000 представляет контроллер I2C2, соответствующий /dev/i2c-2
- 0x04050000 представляет контроллер I2C4, соответствующий /dev/i2c-4
- 0x04060000 представляет контроллер I2C5, соответствующий /dev/i2c-5
Затем подключите устройство I2C к соответствующим контактам 40-контактного интерфейса. Для удобства использования соответствующие контакты трех шин I2C показаны в следующей таблице:
| Шина I2C | SDA | SCL |
|---|---|---|
| I2C-2 | 3 | 5 |
| I2C-4 | 40 | 38 |
| I2C-5 | 27 | 28 |
Затем используйте команду i2cdetect -y.
-
для I2C-2
sudo i2cdetect -y -r 2 -
для I2C-4
sudo i2cdetect -y -r 4 -
для I2C-5
sudo i2cdetect -y -r 5
Если устройство найдено, то отобразится его адрес.

UART
-
В системах с ядром Linux 6.1 необходимо убедиться, что система загружена в режиме 1 Orange Pi 6 plus 40pin (Device Tree).

-
Для систем с ядром Linux 6.6, использующих ACPI, убедитесь с помощью команды dmidecode, что версия BIOS - v1.0_for_opi6plus_linux_40pin
sudo dmidecode -s bios-versionЕсли это не так, то обратитесь к разделу Обновление BIOS на плате Orange Pi 6 plus, чтобы записать нужную версию BIOS
Как видно из таблицы выше, на 40-контактном разъеме есть 2 шины UART - UART1 и UART3.
Для просмотра информации о шинах UART можно испольовать команды ls /sys/class/tty/ttyAMA -l* или ls /dev/ttyAMA*
Вывод команды sudo dmesg | grep "ttyAMA. at` в ядре ACPI Linux 6.6 указывает, что:
- 0x40c0000 соответствует UART1, размещенному в /dev/ttyAMA1
- 0x40e0000 соответствует UART3, размещенному в /dev/ttyAMA3
Для тестирования порта нужно замкнуть между собой контакты TX и RX проверяемой шины:
| Шина UART | RX | TX |
|---|---|---|
| UART 1 | 16 | 15 |
| UART 3 | 10 | 8 |
Используйте команду sudo serial /dev/ttyAMA1 для проверки функции обратной связи последовательного порта, как показано на рисунке ниже. Если вы видите, что содержимое чтения и записи согласовано, это означает, что функция последовательного порта работает нормально.
sudo serial /dev/ttyAMA1
sudo serial /dev/ttyAMA3

PWM
-
В системах с ядром Linux 6.1 необходимо убедиться, что система загружена в режиме 1 Orange Pi 6 plus 40pin pwm (Device Tree).

-
Для систем с ядром Linux 6.6, использующих ACPI, убедитесь с помощью команды dmidecode, что версия BIOS - v1.0_for_opi6plus_linux_40pin_pwm
sudo dmidecode -s bios-versionЕсли это не так, то обратитесь к разделу Обновление BIOS на плате Orange Pi 6 plus, чтобы записать нужную версию BIOS
На 40-контактном разъеме присутствуют контакты 2 шин PWM - PWM3 и PWM5:
| Шина UART | Контакт на разъёме |
|---|---|
| PWM3 | 15 |
| PWM5 | 7 |
-
В ОС на ядре Linux 6.1 соответствие шин PWM адресам можно увидеть из вывода команды ls /sys/класс/pwm/pwmchip -l*:
- 0x4113000 соответствует PWM3 и pwmchip1
- 0x4115000 соответствует PWM5 и pwmchip2
-
В системе с ядром Linux 6.6 в выводе команды ls /sys/класс/pwm/pwmchip -l* можно увидеть, что:
- CIXH2011:3 соответствует PWM3 и pwmchip1
- CIXH2011:5 соответствует PWM5 и pwmchip2
Затем используйте следующую последовательность команд, чтобы на выходе PWM3 ( для PWM5 команды будут аналогичные ) получить прямоугольный сигнал частотой 50 Гц:
-
Переключитесь на пользователя root
sudo -i -
Выключите шину
echo 0 > /sys/class/pwm/pwmchip1/export -
Задайте период импульса
echo 20000 > /sys/class/pwm/pwmchip1/pwm0/period -
Укажите рабочий цикл
echo 10000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle -
Включите шину
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
Для управления PWM5 нужно просто заменить в командах pwmchip1 на pwmchip2