Модуль PCA9555
Модуль управляет 16-битным расширителем портов ввода-вывода PCA9555 по шине I2C.
Назначение
PCA9555 — это микросхема расширения портов с двумя 8-битными портами (Port 0 и Port 1), итого 16 линий ввода-вывода, управляемых по I2C. Каждая линия независимо настраивается как вход или выход, поддерживается инверсия полярности входов.
В Lua биты двух портов объединены в одно 16-битное значение:
| Биты | Порт |
|---|---|
| 0…7 | Port 0 (P0_0…P0_7) |
| 8…15 | Port 1 (P1_0…P1_7) |
Lua API
pca9555.new(i2c_id [, address [, speed]])
Создаёт объект расширителя и подключает устройство к шине I2C.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
i2c_id | int | — | Номер шины I2C (0 или 1) |
address | int | 0x20 | 7-битный адрес устройства (0x20…0x27) |
speed | int | 400000 | Частота шины, от 1 до 400000 Гц |
Возвращает объект устройства. При ошибке возникает исключение.
Адрес вне диапазона 0x20…0x27 и неподдерживаемая частота отклоняются как
ошибочные аргументы.
Объект создаётся через точечный вызов (
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. Значения вне диапазона 0x0000…0xFFFF отклоняются,
а не обрезаются до 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