Перейти к содержанию
Материалы раздела

Модуль PCA9555

Модуль управляет 16-битным расширителем портов ввода-вывода PCA9555 по шине I2C.

Назначение

PCA9555 — это микросхема расширения портов с двумя 8-битными портами (Port 0 и Port 1), итого 16 линий ввода-вывода, управляемых по I2C. Каждая линия независимо настраивается как вход или выход, поддерживается инверсия полярности входов.

В Lua биты двух портов объединены в одно 16-битное значение:

БитыПорт
0…7Port 0 (P0_0…P0_7)
8…15Port 1 (P1_0…P1_7)

Lua API

pca9555.new(i2c_id [, address [, speed]])

Создаёт объект расширителя и подключает устройство к шине I2C.

ПараметрТипПо умолчаниюОписание
i2c_idintНомер шины I2C (0 или 1)
addressint0x207-битный адрес устройства (0x200x27)
speedint400000Частота шины, от 1 до 400000 Гц

Возвращает объект устройства. При ошибке возникает исключение. Адрес вне диапазона 0x200x27 и неподдерживаемая частота отклоняются как ошибочные аргументы.

Объект создаётся через точечный вызов (pca9555.new(...)), методы вызываются через двоеточие (dev:read()). По умолчанию после new() все линии — входы (состояние микросхемы после сброса); направление задаётся методом direction().

dev:direction(config [, port1_config])

Настраивает направление линий: бит 1 — вход, бит 0 — выход.

  • Один аргумент — 16-битная маска: биты 0…7 → Port 0, биты 8…15 → Port 1.
  • Два аргумента — отдельные 8-битные маски для Port 0 и Port 1.
-- Биты 0–9 как входы, биты 10–15 как выходы
dev:direction(0x03FF)

-- То же самое двумя байтами: Port0 = все входы, Port1 = младшие 2 входа
dev:direction(0xFF, 0x03)

dev:polarity(config [, port1_config])

Настраивает инверсию полярности входов: бит 1 — инвертировать, бит 0 — без инверсии. Формат аргументов такой же, как у direction().

dev:polarity(0x0001)  -- инвертировать вход P0_0

dev:read()

Читает состояние всех 16 входов. Возвращает 16-битное целое: младший байт — Port 0, старший байт — Port 1.

local value = dev:read()
local p0_0  = (value & 0x0001) ~= 0   -- состояние линии P0_0
local p1_3  = (value & 0x0800) ~= 0   -- состояние линии P1_3

dev:write(value)

Записывает 16-битное значение в выходные регистры: младший байт — Port 0, старший байт — Port 1. Значения вне диапазона 0x00000xFFFF отклоняются, а не обрезаются до 16 бит.

dev:write(0x8001)  -- установить P0_0 и P1_7 в 1, остальные в 0

Пример

-- Расширитель на шине I2C0, адрес 0x20
local dev = pca9555.new(0, 0x20)

-- Port 0 — выходы (светодиоды), Port 1 — входы (кнопки)
dev:direction(0xFF00)   -- биты 8–15 (Port 1) = входы, биты 0–7 (Port 0) = выходы

-- Зажечь все светодиоды Port 0
dev:write(0x00FF)

-- Опросить кнопки Port 1
while true do
    local v = dev:read()
    local buttons = (v >> 8) & 0xFF
    print(string.format("buttons = 0x%02X", buttons))
    tmr.delayms(100)
end