Raspberry Pi:Библиотеки/WiringPi/Расширения/Подключение чипов MCP23008 и MCP23017 (I2C)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Подключение чипов MCP23008 и MCP23017 (I2C)[1]

Библиотека WiringPi поддерживает расширительный модуль для I2C-чипов MCP23008 (8 бит) и MCP23017 (16 бит), служащих для оснащения Pi дополнительными GPIO-контактами.

Raspberry Pi оснащена одной шиной I2C, а MCP23008/MCP230173-битным адресным портом. Таким образом, в теории, к Pi можно подключить до восьми MCP23008/MCP23017, тем самым добавив плате еще 128 контактов для ввода/вывода данных.

Подключение

#include <wiringPi.h>
#include <mcp23017.h>

...и/или...

#include <mcp23008.h>

Инициализация

mcp23017Setup (int pinBase, int i2cAddress) ;

...и/или...

mcp23008Setup (int pinBase, int i2cAddress) ;

Параметр pinBase может быть любым значением выше «64», а параметр i2cAddress – это адрес девайса на шине I2C. Как правило, во втором параметре по умолчанию стоит значение «0x20», но если вы используете несколько девайсов, его можно поменять. То, правильный ли адрес вы используете, можно проверить при помощи команды i2cdetect.

Функции mcp23008Setup() и mcp23017Setup() можно вызывать сколько угодно раз – вплоть до каждого MCP23008/MCP23017, подключенного к вашей системе. Просто укажите другие адрес шины I2C и значение в параметре pinBase.

Количество контактов указывать не нужно: MCP23008 оснащен 8 контактами, а MCP2301716 контактами.

Фото ниже показывает, как это подключение выполняется вживую. Здесь плата Quick2Wire, к которой подключен чип MCP23017, а всего его контакты выведены на соседнюю макетную плату – ту, к которой подключен массив светодиодов и кнопка.

Эта программа работает как 10-битный генератор импульсов двоичного кода, и ее можно остановить, нажав на кнопку на макетной плате. Первые 10 контактов заданы как выходные, а последний (15-ый) – как входной, у которого включен подтягивающий резистор (сигнал на кнопке подтягивается к 0 вольтам).

/*
 * q2w.c:
 * Использование платы Quick2Wire для чипа MCP23017
 *
 * Копирайт (c) 2012-2013 Гордон Хендерсон. <projects@drogon.net>
 ***********************************************************************
 */

#include <stdio.h>
#include <wiringPi.h>
#include <mcp23017.h>

int main (void)
{
  int i, bit ;

  wiringPiSetup () ;
  mcp23017Setup (100, 0x20) ;

  printf ("Raspberry Pi - MCP23017 Test\n") ;
  //  "Тест Raspberry Pi и чипа MCP23017"

  for (i = 0 ; i < 10 ; ++i)
    pinMode (100 + i, OUTPUT) ;

  pinMode         (100 + 15, INPUT) ;
  pullUpDnControl (100 + 15, PUD_UP) ;

  for (;;)
  {
    for (i = 0 ; i < 1024 ; ++i)
    {
      for (bit = 0 ; bit < 10 ; ++bit)
        digitalWrite (100 + bit, i & (1 << bit)) ;
      delay (5) ;
      while (digitalRead (100 + 15) == 0)
        delay (1) ;
    }
  }
  return 0 ;
}

Примечания

  • Для использования I2C-устройств в ядро нужно будет загрузить модули для I2C. Используйте для этого команду gpio, вот так
gpio load i2c
  • Чтобы проверить, видит ли Pi ваши девайсы, просканируйте шину I2C при помощи программы i2cdetect. Чип MCP23017 виден, как правило, как «0x20», но если вы используете несколько чипов, у каждого из них будет (или должен быть!) уникальный адрес.
  • Если у вас Pi версии 1, используйте команду i2cdetect так:
i2cdetect -y 0

Если у вас Pi версии 2, используйте ее так:

i2cdetect -y 1
  • Команда gpio поддерживает команду i2cdetect и автоматически подстраивается под версию платы. Просто впишите:
gpio i2cd
  • Драйвер WiringPi для MCP23008/MCP23017 знает, какую версию Raspberry Pi вы используете, поэтому никаких мер предосторожности не нужно – ваш код будет работать с обеими версиями.
  • Чипы MCP23008 и MCP23017 оснащены только подтягивающими резисторами.
  • Максимальная сила тока, которую можно подавать или тянуть через любой контакт, составляет 25 мА, хотя чип может быть источником не более 125 мА и тянуть не более 150 мА.

См.также

Внешние ссылки