Иногда в проекте больше датчиков, кнопок или светодиодов, чем контактов микроконтроллера. PCF8574 - это простой способ добавить в микроконтроллер 8 низкоскоростных входных или выходных контактов. Конфигурируемый адрес позволяет нескольким PCF8574 существовать на одной шине, поэтому два контакта микроконтроллера могут управлять десятками контактов ввода-вывода. Ниже мы покажем вам, как использовать этот чип.
TI PCF8574 8-битный расширитель ввода/вывода I2C (Mouser 595-PCF8574N, 1,86 долл. США)
Мы нашли печатные платы для этого чипа в файлах i2c.lbr и micro-phillips.lbr на странице загрузки библиотеки Cadsoft Eagle. PCF8574 управляется по двухпроводному протоколу I2C, поэтому для демонстрации этого чипа мы использовали наш универсальный последовательный интерфейс Bus Pirate. Те же основные операции применимы к любому микроконтроллеру.
На схеме показана наша простая тестовая схема для PCF8574, вот техническое описание (PDF). Мы запитали микросхему напряжением 5 вольт и использовали развязывающий конденсатор 0,1 мкФ (C1) между выводами питания и заземления. R1 и R2 удерживают тактовую частоту I2C и шину данных на уровне 5 вольт. Мы будем использовать светодиод для проверки выходных характеристик чипа; P0 подключен к LED1 через токоограничивающий резистор R3 (330+ Ом). P6 и P7 привязаны к известным состояниям, поэтому мы можем легко протестировать входные возможности чипа.
I2C-адрес PCF8574 - 0100xxxy, с тремя битами (x), определяемыми состоянием адресных контактов A2-0, и последним битом (y), который устанавливает режим чтения (1) или записи (0).. Многие PFC8574 могут совместно использовать шину I2C, используя разные настройки контактов адреса. Поскольку мы заземлили адресные выводы, адрес записи будет 01000000 (0x40).
Вывод
Светодиод на P0 управляется записью 1 (вкл.) или 0 (выкл.) в бит 0 байта, следующего за адресом записи.
I2C>{0x40 0b00000001} <-команда220 I2C WRITE: 0x40 GOT ACK: YES <-запись адреса
220 I2C WRITE: 0x01 GOT ACK: YES <-выходное значениеI2C>
{ выдает условие запуска I2C, за которым следует адрес записи 0x40. Выходное значение 0b00000001 устанавливает P0 в высокий уровень, а остальные биты в низкий. } отправляет условие остановки шины I2C, завершая транзакцию. Когда соответствующий бит установлен на высокий уровень, загорается светодиод.
Чтобы выключить светодиод, повторите последовательность, установив соответствующий выходной бит в 0.
I2C>{0x40 0b00000000} <-команда220 I2C WRITE: 0x40 GOT ACK: YES <-запись адреса
220 I2C WRITE: 0x00 GOT ACK: YES <-выходное значениеI2C>
Теперь, когда P0 установлен на землю, светодиод выключается.
Ввод
Выводы, настроенные на высокий уровень вывода, также могут использоваться в качестве входов (лист данных на стр. 1). В этом примере P6 удерживается на высоком уровне (+5 вольт), а P7 удерживается на низком уровне (земля), но это также могут быть кнопки, датчики или другая цифровая логика. Остальные контакты остаются плавающими и не представляют достоверных данных.
I2C>{0x40 0b11000000} <-команда220 I2C WRITE: 0x40 GOT ACK: YES <-запись адреса
220 I2C WRITE: 0xC0 GOT ACK: YES <-выходное значениеI2C>
Во-первых, мы устанавливаем желаемые входные контакты на вывод высокого уровня, записывая 1 в соответствующие биты выходного значения. Биты 6 и 7 устанавливают для P6 и P7 выходной высокий уровень.
Теперь мы можем прочитать булавку. Мы выполнили эту операцию с выходом Bus Pirate, установленным в двоичный режим, чтобы значения выводов были сразу очевидны.
I2C>{0x41 r} <-command220 I2C WRITE: 0b01000001 GOT ACK: YES <-адрес
230 ЧТЕНИЕ I2C: 0b01000000 < - состояние контактаI2C>
{ выдает условие запуска I2C, 0x41 - это адрес чтения, а r считывает один байт с устройства. } отправляет условие остановки шины I2C, завершая транзакцию.
Ответ 01000000 представляет состояние входных контактов. Старший бит равен 0, потому что P7 привязан к земле. Следующий бит равен 1, потому что P6 удерживается высоким. Остальные биты (0) являются мусорными данными.
Это далеко не единственная микросхема расширителя ввода-вывода. Вы использовали другой чип?
Не забудьте наверстать упущенное в постах, которые вы могли пропустить.