Описание Expander Shield

Expander Shield – оригинальный дополнительный модуль, предназначенный для увеличения количества портов ввода/вывода микроконтроллеров на базе платформы Arduino, а также других микроконтроллеров, используя расширители портов с SPI или I2C интерфейсом.

[cryout-multi][cryout-column width=»1/2″]ExpanderShield_I2C_1_smallExpanderShield_SPI_2_small  [/cryout-column]Основным элементами дополнительного модуля Expander Shield являются две микросхемы MCP23S17 или MCP23017 (два 16-разрядных расширителя портов ввода/вывода с SPI или I2C интерфейсом, соответственно), позволяющие добавить четыре 8-битных порта ввода/вывода, то есть 32 дополнительных «ноги». [cryout-column width=»1/2″][/cryout-column] [/cryout-multi]

Технические характеристики

Приведем наиболее важные функциональные особенности модуля Expander Shield.

  • удобный переключатель режима работы модуля в зависимости от типа установленных в данный момент микросхем расширителей портов;
  • для каждой из двух применяемых микросхем 16-разрядных расширителей портов ввода/вывода с помощью перемычек задается трехбитный адрес на шине, что позволяет размещать на одной шине до 8 таких микросхем;
  • возможность выбора с помощью перемычки номера соответствующего выхода микроконтроллера Freeduino/Arduino (digital pin 8, 9 или 10) для сигнала CS шины SPI;
  • в модуле применены «проходные» разъемы, позволяющие состыковывать несколько модулей без сдвига относительно платы Arduino;
  • сигналы микросхем выведены на четыре разъема PBD-10R с дополнительными контактами «земля» и +5В;
  • возможность выбора отдельного или совместного аппаратного сброса (кнопкой RESET) микросхем 16-разрядных расширителей портов ввода/вывода и микроконтроллера Freeduino/Arduino с помощью перемычек;
  • дополнительный разъем JPIC с выводами прерываний (INTA, INTB), аппаратного сброса (RST) и выбора микросхемы (CS);

Прочие характеристики модуля определяются в первую очередь характеристиками микросхем MCP23S17/MCP23017

Режимы работы

Режим работы Expander Shield выбирается с помощью DIP-переключателя и перемычек.

Выбор интерфейса и управление подтяжкой шины I2C

С помощью DIP переключателя выбирается либо режим SPI (включением контактной группы 1-4) для микросхем MCP23S17, либо режим I2C (включением контактной группы 5-6) для микросхем MCP23017. Также, в режиме I2C с помощью 7 и 8 контактной группы при необходимости шина I2C подтягивается через токоограничивающие сопротивления к шине питания +5В. Как правило, подтягивающие резисторы должны быть подключены если на шине I2C только одно устройство. Если устройств несколько, то резисторы подключаются только у одного из устройств.

Одновременное включение шины SPI и I2C, а также шины SPI и 7, 8 контактной группы не допускается.

[cryout-multi][cryout-column width=»1/3″]ExpanderShield_Settings_SPI  [/cryout-column] [cryout-column width=»1/3″]ExpanderShield_Settings_I2C[/cryout-column] [cryout-column width=»1/3″]ExpanderShield_Settings_I2C_nopullup [/cryout-column] [/cryout-multi]

Комбинированный режим работы, когда одна из двух микросхем в одном модуле Expander Shield работает по SPI интерфейсу (MCP23S17), а другая по I2C интерфейсу (MCP23017) невозможен.

Если требуется организовать работу одновременно по SPI и I2C интерфейсу необходимо использовать два (несколько) дополнительных модулей Expander Shield, с соотвтетствующим положением переключателей.

Выбор номера вывода для управления сигналом CS шины SPI

Для шины SPI необходимо выбрать вывод микроконтроллера Freeduino/Arduino, используемый в качестве сигнала CS. Обычно  используется вывод 10, что соответствует крайнему левому положению перемычки на разъеме SS1. Переставляя перемычку на одно из двух других положений, возможен выбор 9 и 8 вывода соответственно.

ExpanderShield_Settings_Reset

Выбор адреса микросхем на шине

Младшие три бита адреса микросхем MCP23S17/MCP23017 выбираются с помощью перемычек на разъемах IC1_addr/IC2_addr притягиванием битов 0, 1, 2 к «земле» (Gnd) или +5В (5V).

Адрес каждой микросхемы должен быть уникальным.

Таким образом, на одной шине можно разместить до 8 микросхем (объединив, например, 4 штуки Expander Shield).

ExpanderShield_Settings_Addresses

Выбор режима работы аппаратного сброса (кнопкой RESET)

Возможна организация одного из ряда режимов работы кнопки RESET

  • Кнопка RESET сбрасывает Freeduino/Arduino и микросхемы MCP23S17/MCP23017
  • Кнопка RESET сбрасывает только Freeduino/Arduino
  • Кнопка RESET сбрасывает только микросхемы MCP23S17/MCP23017

Соответствующие положения перемычек на разъеме JRS (слева направо) показаны ниже.

ExpanderShield_Settings_CS

Библиотека MCP23xxx

Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: MCP23xxx. Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).

Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.

Структура каталогов папки libraries после установки должна стать такой:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 — это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.

К библиотеке прилагаются примеры, поясняющие работу с ней.

Рассмотрим пример работы с модулем для шины I2C:


//В примере считывается состояние выводов 1-го чипа, и такие же значения выставляются на 2-м

//Для I2C версии подключаем Wire.h:
#include <Wire.h>
//подключаем библиотеку
#include <MCP23xxx.h>

//Создаем два объекта класса CMCP23017, но не инициализируем, т.к. шина I2C не готова
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//Инициализируем шину I2C ...
Wire.begin();
//... и объекты MCP23* с адресами 0 и 1
mcp23_1.init(0);
mcp23_2.init(1);

//Все выводы 1-го чипа нужно сделать входами, а 2-го - выходами
//Это можно сделать в цикле
for (int i=0; i<16; i++) {
mcp23_1.pinMode(i, INPUT);
mcp23_2.pinMode(i, OUTPUT);
}
//или за один раз, вызовом метод pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Прочесть все входы 1-го чипа, и выставить то же самое на 2-м можно в цикле
for (int i=0; i<16; i++) {
mcp23_2.digitalWrite(i, mcp23_1.digitalRead(i));
}
//или за раз, используя методы digitalRead16 и digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

По материалам  сайта  фридуино.ру

 

 

Метки: , , , , , , , , . Закладка Постоянная ссылка.

Комментарии запрещены.