Использование цифрового ввода/вывода (I/O)


Чтение состояний цифрового ввода/вывода (I/O)

При считывании состояния цифровых портов ввода/вывода (I/O) вы можете получить связку/множество состояний при помощи функции pid_read или одиночное состояние при помощи функции pid_ioctl. Вы также можете прочитать тип цифрового порта ввода/вывода (I/O).

pid_read($pid, VALUE);           // read multiple states(in 32bits unit)
pid_ioctl($pid, "get N ITEM");   // read a single state(in a bit unit)

В способе чтения одиночного состояния, доступны следующие пункты (ITEM):

ITEM Описание
Режим Возвращает статус порта
в стороковом виде
I/O пин: "in", "out", "led_xxx" и д.р
пины/контакты при использовании UART, SPI или I2C: "hdev"
назначенный выходной вывод ST: "st_out"
Ввод Возвращает состояние/статус входного порта целым числом (0: LOW, 1: HIGH)
Вывод Возвращает состояние/статус выходного порта целым числом (0: LOW, 1: HIGH)

Пример чтения связки/множества состояний цифровых I/O

В примере ниже показано состояние порта от 0 до 7 после команды портам показать их состояние:

$value = 0;
$pid = pid_open("/mmap/uio0");          // open UIO0
pid_ioctl($pid, "set 0-7 mode in_pu");  // set port 0 ~ 7 to input(pull-up)
pid_read($pid, $value);                 // read digital I/O status(32bits unit)
printf("0x%x\r\n", $value);             // output example: 0xffffffff

Пример чтения одиночного состояния I/O

Пример ниже показывает состояние порта 0 UIO0 после команды на вывод и получение режима состояния:

$pid = pid_open("/mmap/uio0");             // open UIO0
pid_ioctl($pid, "set 0 mode out high");    // set port 0 to output
$mode = pid_ioctl($pid, "get 0 mode");     // read a digital I/O mode
$output = pid_ioctl($pid, "get 0 output"); // read a digital I/O state
printf("%s, %d\r\n", $mode, $output);      // output example: out, 1

※ При чтении состояния порта с помощью функции pid_ioctl, вы должны использовать "get N input", если функция настраивается на входной порт и использовать "get N output", если функция настраивается на выходной порт.

Запись значений в цифровой I/O

При записи значений в цифровые I/O порты, вы можете настроить значение для нескольких портов при помощи функции pid_write function или для одиночного порта при помощи функции pid_ioctl.

pid_write($pid, VALUE);                  // write to multiple ports(32 bits unit)
pid_ioctl($pid, "set N output TYPE");    // write to a single port(a bit unit)

Пример записи значений для нескольких портов

Приведенный ниже пример показывает состояние цифровых I/O портов после установки 0 ~ 7 пинов UIO0 в выходные порты и записи заданного значения.

$value = 0;
$pid = pid_open("/mmap/uio0");                       // open UIO0
pid_ioctl($pid, "set 0-7 mode out");                 // set port 0 ~ 7 to output
pid_read($pid, $value);                              // read status
pid_write($pid, ($value & 0xffffff00) | 0x00000055); // write 0x00000055
pid_read($pid, $value);                              // read status
printf("0x%0x\r\n", $value);                         // output example: 0x00000055

Пример записи значения для одиночного порта

Приведенный ниже пример показывает состояние порта 0 UIO0 после настройки его на цифровой выход со значением по умолчанию LOW и записи HIGH.

$pid = pid_open("/mmap/uio0");             // open UIO0
pid_ioctl($pid, "set 0 mode out low");     // set port 0 to output(LOW)
pid_ioctl($pid, "set 0 output high");      // write HIGH
$output = pid_ioctl($pid, "get 0 output"); // read state of port 0
printf("%d\r\n", $output);                 // output: 1

Пример настройки блокировки выхода

Приведенный ниже пример показывает разницу между заблокированным и разблокированным состоянием порта 0.

$pid = pid_open("/mmap/uio0");              // open UIO0
pid_ioctl($pid, "set 0 mode out low");      // set port 0 to output(LOW)
pid_ioctl($pid, "set 0 lock");              // enable port 0 to output lock
pid_ioctl($pid, "set 0 output high");       // write HIGH to port 0
$output1 = pid_ioctl($pid, "get 0 output"); // read state of port 0
pid_ioctl($pid, "set 0 unlock");            // disable the output lock
pid_ioctl($pid, "set 0 output high");       // write HIGH to port 0 again
$output2 = pid_ioctl($pid, "get 0 output"); // read state of port 0
printf("%d, %d\r\n", $output1, $output2);   // output: 0, 1