Интерфейс SPI и Arduino

Интерфейс SPI и Arduino

Данная библиотека позволяет Ардуино взаимодействовать с различными SPI-устройствами, выступая при этом в роли ведущего устройства.

Краткое введение в интерфейс SPI (Serial Peripheral Interface)

Последовательный периферийный интерфейс (SPI) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами. Интерфейс SPI отличается относительно высокой скоростью и предназначен для связи близко расположенных устройств. Он также может использоваться для взаимодействия двух микроконтроллеров.

Согласно протоколу SPI, одно из взаимодействующих устройств (обычно микроконтроллер) всегда является ведущим и контролирует ведомые периферийные устройства. Как правило, все взаимодействющие устройства объединены тремя общими линиями:

  • MISO (Master In Slave Out) — линия для передачи данных от ведомого устройства (Slave) к ведущему (Master),
  • MOSI (Master Out Slave In) — линия для передачи данных от ведущего устройства (Master) к ведомым (Slave),
  • SCK (Serial Clock) — тактовые импульсы, генерируемые ведущим устройством (Master) для синхронизации процесса передачи данных.

Помимо перечисленных, на каждое устройство отводится отдельная линия:

  • SS (Slave Select) — вывод, присутствующий на каждом ведомом устройстве. Он предназначен для активизации Мастером того или иного периферийного устройства.

Периферийное устройство (Slave) взаимодействует с ведущим (Master) тогда, когда на выводе SS присутствует низкий уровень сигнала. В противном случае данные от Master-устройства будут игнорироваться. Такая архитектура позволяет взаимодействовать с несколькими SPI-устройствами, подключенными к одной и той же шине: MISO, MOSI и SCK.

Перед тем, как отправлять данные новому SPI-устройству, необходимо выяснить о нем несколько основных моментов:

  • Сдвиг данных должен осуществляться, начиная со старшего бита (MSB) или с младшего бита (LSB)? Порядок следования данных контролируется функцией SPI.setBitOrder().
  • При отсутствии тактовых импульсов линия SCK должна находиться в высоком или низком уровне? Считывание данных происходит по фронту или по спаду тактового импульса? Эти режимы работы контролируются функцией SPI.setDataMode().
  • Какова должна быть скорость передачи данных по SPI? Этот параметр контролируется функцией SPI.setClockDivider().

Поскольку стандарт SPI является открытым, его реализация в разных устройствах может немного отличаться. Поэтому при написании программ, особое внимание необходимо уделять даташиту того или иного устройства.

Грубо говоря, существует четыре режима передачи данных, отличающиеся условием сдвига данных (по фронту или по спаду синхро-импульсов — так называемая фаза), а также уровнем сигнала, в котором должна находится линия SCK при отсутствии синхро-импульсов (полярность). Различные комбинации фазы и полярности, формирующие четыре режима передачи данных, сведены в таблицу:

Режим Полярность (CPOL) Фаза (CPHA)
SPI_MODE0
SPI_MODE1 1
SPI_MODE2 1
SPI_MODE3 1 1

Для изменения режима передачи данных служит функция SPI.setDataMode().

Каждое SPI-устройство налагает определенные ограничения на максимальную скорость SPI-шины. Для корректной работы периферийных устройств в библиотеке предусмотрена функция SPI.setClockDivider(), позволяющая изменять тактовую частоту шины (по умолчанию 4 МГц).

После правильной настройки всех параметров SPI, останется только выяснить, какие регистры периферийного устройства отвечают за те или иные его функции. Как правило, это описано в даташите устройства.

Для получения дополнительной информации об интерфейсе SPI, см. страницу Википедии.

Соединения

Ниже в таблице приведены номера выводов, использующиеся шиной SPI в тех или иных моделях Ардуино:

Плата Arduino MOSI MISO SCK SS (slave) SS (master)
Uno или Duemilanove 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 10
Mega1280 или Mega2560 51 или ICSP-4 50 или ICSP-1 52 или ICSP-3 53
Leonardo ICSP-4 ICSP-1 ICSP-3
Due ICSP-4 ICSP-1 ICSP-3 4, 10, 52

Обратите внимание, что на всех платах выводы MISO, MOSI и SCK соединены с одними и теми же контактами разъема ICSP. Такое расположение может быть удобно при создании универсальных плат расширения, работающих на всех моделях Ардуино.

Особенности работы вывода SS в Ардуино на базе AVR

У всех моделей Ардуино на основе микроконтроллеров AVR есть вывод SS, который используется в режиме работы Slave (например, при управлении Ардуино внешним ведущим устройством). Однако, в библиотеке реализован только режим работы Master, поэтому в этом режиме вывод SS должен быть сконфигурирован как выход. В противном случае SPI может аппаратно переключиться в режим Slave, что приведет к неработоспособности функций библиотеки.

Для управления выводом SS периферийных устройств можно использовать любой из доступных выводов. Например, на плате расширения Arduino Ethernet для взаимодействия со встроенной SD-картой и контроллером Ethernet по SPI используются выводы 4 и 10 соответственно.

Расширенные возможности SPI на Arduino Due

Существуют некоторые особенности работы с интерфейсом SPI на платах Arduino Due. Помимо основных функций и методов, применимых ко всем платам Ардуино, в библиотеке SPI предусмотрено несколько дополнительных методов. Эти методы реализовывают аппаратные возможности микроконтроллеров SAM3X и предоставляют разработчику расширенные возможности:

  • автоматический управление процессом выбора ведомого устройства;
  • автоматическое управление конфигурациями интерфейса SPI для различных устройств (тактовая частота, режим передачи данных и т.д.). Благодаря этому каждое из ведомых устройств может иметь собственный набор настроек, автоматически применяемых в начале передачи.

В Arduino Due есть три отдельных вывода (4, 10 и 52) для управления линиями SS периферийных устройств.

SPI Arduino – подключение устройств к ардуино

SPI в Arduino- это один из основных протоколов для обмена данными между платой ардуино и подключенными устройствами. Вместе с I2C и UART этот протокол часто используется для многих типов периферийных устройств, поэтому знание принципов работы SPI необходимо любому инженеру-ардуинщику. В этой статье мы коротко рассмотрим основные принципы, схему взаимодействия и способ подключения SPI датчиков и экранов к Arduino.

SPI в Arduino

SPI – это широко применяемый протокол передачи данных между микроконтроллером (Master) и периферийными устройствами (Slave). В наших проекта в качестве Master чаще всего используется плата Arduino. Интерфейс SPI был придуман и использовался компанией Motorola, но со временем стал отраслевым стандартом. Основным плюсом работы с этим интерфейсом считается высокая скорость и возможность подключения нескольких устройств на одной шине данных.

Выводы и контакты SPI

Связь по интерфейсу SPI arduino происходит между несколькими устройствами, которые расположены близко друг к другу. Платы Ардуино оснащены отдельными выводами для SPI. Сопряжение происходит при помощи четырех контактов:

  • MOSI – по этой линии передается информация к Slave от Master.
  • MISO – используется для передачи информации к Master от Slave.
  • SCLK – создание тактовых импульсов для синхронной передачи данных.
  • SS – выбор ведомого устройства.

Взаимодействие SPI устройств

Взаимодействие устройств начинается, когда на выход SS подается низкий уровень сигнала.

Перед началом работы нужно определить:

  • С какого бита должен начинаться сдвиг – со старшего или с младшего. Регулируется порядок при помощи функции PI.setBitOrder().
  • Определить уровень, на котором должна находиться линия SCK при отсутствии тактового импульса. Регулируется функцией SPI.setDataMode().
  • Выбрать скорость передачи данных. Определяется функцией SPI.setClockDivider().

Следующим шагом будет определение, в каком режиме будет происходить передача информации. Выбор режима определяется такими показателями, как полярность и фаза тактового импульса. Если уровень низкий, записывается 0, высокий – 1. Всего существует 4 режима:

  • Режим 0 – SPI_MODE0: полярность (CPOL) 0, фаза (CPHA) 0.
  • Режим 1: полярность 0, фаза 1.
  • Режим 2:полярность 1, фаза 0.
  • Режим 3: полярность 1, фаза 1.

Изначально в Ардуино заложено, что данные передаются старшим битом вперед, но перед началом нужно уточнить это в документации. Продемонстрировать режимы можно на картинке.

Возможно два вида подключения в интерфейсе SPI: независимое и каскадное. В первом случае при подключении Master обращается к каждому Slave индивидуально, во втором случае подключение происходит по очереди, т.е. каскадно.

Подключение SPI к Ардуино

Плата Arduino уже содержит специальные выводы для подключения интерфейса SPI. Эти же выводы повторены в отельном разъеме ICSP. На этом разъеме отсутствует SS – изначально предусмотрено, что микроконтроллер Ардуино будет выступать в роли ведущего устройства. Если нужно использовать его в качестве ведомого, можно использовать любой цифровой вывод в качестве SS.

На данной иллюстрации представлен вариант подключения OLDE-экрана по SPI к ардуино.

Для каждой модели Ардуино существую свои выводы для SPI. Эти выводы:

  • Uno: MOSI соответствует вывод 11 или ICSP-4, MISO – 12 или ICSP-1, SCK – 13 или ICSP-3, SS (slave) – 10.
  • Mega1280 или Mega2560: MOSI – 51 или ICSP-4, MISO – 50 или ICSP-1, SCK – 52 или ICSP-3, SS (slave) – 53.
  • Leonardo: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3.
  • Due: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS (master) – 4, 10, 52.

Последний контроллер Arduino Due расширяет возможности пользователя и позволяет реализовать больше задач, чем на остальных микроконтроллерах. Например, можно автоматически управлять ведомым устройством и автоматически выбирать различные конфигурации (тактовая частота, режим и другие).

Библиотека SPI Arduino

Для работы на Ардуино создана отдельная библиотека, которая реализует SPI. Перед началом кода нужно добавить #include , чтобы включить библиотеку.

  • begin() и end() – включение и выключение работы. При инициализации на выход настраиваются линии SCLK, MOSI и SS, подавая низкий уровень на SCLK, MOSI и высокий на SS. Функция end() не меняет уровни линий, она нужна для выключения блока, связанного с интерфейсом, на плате Ардуино.
  • setBitOrder(order) – установка порядка отправки битов информации (MSBFIRST – приоритет старшего бита, LSBFIRST – приоритет младшего бита).
  • setClockDivider(divider) – установка делителей тактов основной частоты. Можно поставить делители 2, 4, 8, 16, 32, 64 и 128. Записывается следующим образом – SPI_CLOCK_DIVn, где n – выбранный делитель.
  • setDataMode(mode) – выбор одного из четырех рабочих режимов.
  • transfer(value) – осуществление передачи байта от ведущего устройства и возвращение байта, который принят от ведомого устройства.
  • shiftIn(miso_pin, sclk_pin, bit_order) и shiftOut(mosi_pin, sclk_pin, order, value) – принятие и отправка данных, можно подключать к любым цифровым пинам, но перед этим нужно самостоятельно их настроить.

Преимущества и недостатки SPI

Преимущества интерфейса SPI:

  • Возможность передавать большие данные, не ограниченные длиной в 8 бит.
  • Простота в реализации программного обеспечения.
  • Простота аппаратной реализации.
  • Выводов нужно меньше, чем для параллельных интерфейсов.
  • Только быстродействие устройств ограничивает максимальную тактовую частоту.
  • Большое количество выводов по сравнению с I2C.
  • Slave не может управлять потоком информации.
  • Отсутствие стандартного протокола обнаружения ошибок.
  • Большое количество способов реализации интерфейса.
  • Отсутствие подтверждения приема информации.
Читайте также  Как установить магнитолу в Renault Logan

Пример использования SPI Ардуино в проекте с датчиком давления

Для реализации проекта нам нужны Ардуино, датчик давления макетная плата и провода. Пример подключения датчика изображен на рисунке.

При помощи датчика SCP1000 возможно узнавать такие параметры как давление и температура и передать эти значения через SPI.

Основные элементы скетча программы

В первую очередь в коде прописываются регистры датчика при помощи setup(). С устройства возвращаются несколько значений – одно в 19 бит для полученного давления, другое в 16 бит – для температуры. После этого происходит считывание двух температурных байтов и считывание давления в два этапа. Сначала программа берет три старших бита, затем следующие 16 бит, после чего при помощи побитового сдвига происходит объединение этих двух значений в одно. Настоящее давление – это 19-тиразрядное значение, деленное на 4.

const int PRESSURE = 0x1F; // первый этап определения давления (выявляются три старших бита)

const int PRESSURE_LSB = 0x20; // второй этап, в котором определяются 16 бит для давления

const int TEMPERATURE = 0x21; //16 бит для температуры

Для чтения данных температуры и преобразования ее в градусы Цельсия используется следующий элемент кода:

int tempData = readRegister(0x21, 2);

float realTemp = (float)tempData / 20.0; // чтобы определить реальное значение температуры в Цельсиях, нужно полученное число разделить на 20

Считывание битов давления и объединение их:

byte pressure_data_high = readRegister(0x1F, 1);

unsigned int pressure_data_low = readRegister(0x20, 2);

long pressure = ((pressure_data_high Краткие выводы о SPI

Экраны и датчики SPI часто встречаются в проектах ардуино, поэтому нужно знать, как работает этот протокол. В принципе, ничего сложного в подключении SPI устройств нет. Главное, правильно подсоединить провода и использовать методы стандартной библиотеки в нужной последовательности. Для некоторых устройств, например, SD карты или OLED — экранов, альтернатив, в принципе, не существует.

  • Все +1
  • Тематические +1

    SPI и Arduino:

    1. Теория
    2. Вывод
    3. Ввод

    Это первая статья из цикла статей, посвящённых шине SPI и работе с ней на платформе Arduino. Тема достаточно обширная, так что начнём с теории.

    SPI (Serial Peripheral Interface), или последовательный периферийный интерфейс, был разработан компанией Motorola для организации быстрого и простого в реализации обмена данными между компонентами системы — микроконтроллерами и периферийными устройствами. На шине может быть одно ведущее устройство (master) и несколько ведомых (slave).

    Интерфейс использует 4 линии для обмена данными:

    • SCLK — Serial Clock: тактовый сигнал (от ведущего)
      Другие обозначения: SCK, CLK
      Arduino: пин 13
    • MOSI — Master Output, Slave Input: данные от ведущего к ведомому
      Другие обозначения: SDI, DI, SI
      Arduino: пин 11
    • MISO — Master Input, Slave Output: данные от ведомого к ведущему
      Другие обозначения: SDO, DO, SO
      Arduino: пин 12
    • SS — Slave Select: выбор ведомого; устанавливается ведущим
      Другие обозначения: nCS, CS, CSB, CSN, nSS, STE
      Arduino: по умолчанию пин 10

    Линия SS обычно для каждого ведомого своя, но некоторых ведомых возможно подключить к одной SS — такой способ используется для каскадного подключения устройств.

    Стандартный алгоритм работы SPI таков:

    1. Ведущий устанавливает низкий уровень на той линии SS, к которой подключен нужный ведомый.
    2. Ведущий задаёт такт, «дрыгая» уровнем на SCLK, и одновременно с каждым дёрганьем SCLK выставляет нужный уровень на MOSI, передавая ведомому по биту за такт.
    3. Ведомый на каждый «дрыг» SCLK выставляет нужный уровень на MISO, передавая ведущему по биту за такт.
    4. Для завершения передачи ведущий устанавливает высокий уровень на SS.

    SPI является полнодуплексной шиной — данные передаются одновременно в обе стороны. Типичная скорость работы шины лежит в пределах 1-50 МГц. Благодаря исключительной простоте алгоритма передачи SPI получил широчайшее распространение в самых различных электронных устройствах — например, в датчиках, чипах памяти, радиомодулях, и т.д.

    Вообще, у SPI есть четыре режима передачи, которые основаны на комбинации «полярности» тактового сигнала (clock polarity, CPOL) и фазы синхронизации (clock phase, CPHA). Проще говоря, CPOL — это уровень на тактовой линии до начала и после окончания передачи: низкий (0) или высокий (1). А фаза определяет, на фронте или спаде тактового сигнала передавать биты:

    • Режим 0: CPOL=0, CPHA=0
      Чтение бита происходит на фронте тактового сигнала (переход 0 ⇨ 1), а запись — на спаде (1 ⇨ 0).
    • Режим 1: CPOL=0, CPHA=1
      Чтение — на спаде, запись — на фронте.
    • Режим 2: CPOL=1, CPHA=0
      Чтение — на спаде, запись — на фронте.
    • Режим 3: CPOL=1, CPHA=1
      Чтение — на фронте, запись — на спаде.

    Данные по SPI можно передавать либо старшим битом вперёд (по умолчанию для Arduino), либо младшим. Обычно используется первый вариант, но перед началом работы с устройством следует уточнять этот момент в документации.

    Кратко о библиотеке SPI

    Эта библиотека использует аппаратные возможности AVR для работы по SPI на Arduino, причём только в режиме ведущего (SPI master). Функций в ней совсем немного:

    • begin() и end()
      Инициализация и завершение работы с SPI. При инициализации линии SCLK (13), MOSI (11) и SS (10) настраиваются на вывод, выставляя на SCK и MOSI низкий, а на SS — высокий уровень. Вызов end() линии не трогает, оставляя в том же состоянии, что и до вызова — просто выключает блок SPI микроконтроллера.
    • setBitOrder(order)
      Устанавливает порядок посылки битов данных (order):
      MSBFIRST — первым идёт старший бит посылки (по умолчанию)
      LSBFIRST — первым идёт младший бит
    • setClockDivider(divider)
      Устанавливает делитель тактов для SPI относительно основной частоты. Доступны делители 2, 4, 8, 16, 32, 64 и 128. Соответствующие константы имеют имена вида SPI_CLOCK_DIVn, где n — делитель, например, SPI_CLOCK_DIV32. По умолчанию делитель равен 4 — при обычной тактовой частоте МК на Arduino в 16 МГц SPI будет работать на частоте 4 МГц.
      На заметку: если устройство поддерживает частоту, скажем, 1.25 МГц, то нужно выставить делитель, соответствующий этой или меньшей частоте — 16, например.
    • setDataMode(mode)
      Задаёт режим работы SPI, используя константы SPI_MODE0 (по умолчанию), SPI_MODE1, SPI_MODE2 и SPI_MODE3. Это те самые режимы c параметрами CPOL и CPHA.
    • transfer(value)
      Осуществляет двустороннюю передачу: передаёт байт value и возвращает байт, принятый от ведомого.

    Кроме того, доступны функции shiftIn(miso_pin, sclk_pin, bit_order) и shiftOut(mosi_pin, sclk_pin, order, value), они предоставляют программную полудуплексную передачу данных по SPI — этакие половинки метода transfer(): shiftIn() только принимает, а shiftOut() только передаёт данные. Как видно по их аргументам, они позволяют использовать любые цифровые пины Arduino в качестве линий SPI, но вы сами должны настроить их как входы/выходы, функции shiftIn() и shiftOut() этого не делают.

    Ссылки

    • Статьи об SPI на Википедии и gaw.ru
    • Документация к библиотеке SPI и заметка о подключении

    Следующая тема — SPI и Arduino: вывод

    UPD 2015-12-10
    Про настройку режима передачи SPI.
    Код библиотеки содержится в C:ArduinohardwarearduinoavrlibrariesSPISPI.h

    Т.о., при настройке режима передачи SPI — настраиваются 3-й и 2-й биты регистра SPCR:

    SPCR (SPI Control Register)

    Т.о., код — приведёт к установке CPOL = 0 and CPHA = 1 (0x04 == 0100).

    Подключаемое железо, интерфейсы

    Суть и вообще предназначение Ардуино состоит в быстрой и удобной разработке электронных устройств. Это универсальный контроллер, на базе которого можно сделать законченный девайс (от англ. Device – устройство, прибор) абсолютно произвольного назначения, от полезного (часы-будильник, реле времени с кучей настроек и дисплеем, автоматизацию теплицы, умный дом…) до бесполезного, но забавного или интересного (самонаводящийся вентилятор, машинка на радиоуправлении с пушкой, робот с большим количеством функций и так далее). Для достижения этих целей к Ардуино подключаются различные внешние устройства, с которыми она может взаимодействовать.

    Начнем с мира цифрового, в котором устройства общаются друг с другом при помощи цифровых сигналов, так называемых логических, то есть имеющих два простейших состояния: правда и ложь, да и нет, 1 и 0. В большинстве цифровых устройств эти два состояния передаются напряжением 0 и 5 Вольт, но бывает и 0 и 3.3 Вольта. Таким образом микроконтроллер по сути может измерить цифровой сигнал (что подаётся на ногу, 0 или 5 Вольт), или выдать со своей ноги 0 и 5 Вольт соответственно. Закодированный цифровой сигнал выглядит примерно вот так: скачки 0 и 5 (или 3.3) Вольт с разной продолжительностью.

    Совокупность правил и длин участков 5 и 0 Вольт называют интерфейсом связи.

    Распиновка Nano

    • GPIO – базовый порт ввода-вывода. Может читать и выдавать цифровой сигнал (только 0 и 5 Вольт).
    • PWM – может аппаратно генерировать ШИМ сигнал.
    • ANALOG – пин АЦП, аналогово-цифрового преобразователя. Может измерять напряжение.
    • UART – выводы аппаратного UART для подключения модулей с таким же интерфейсом.
    • I2C– выводы аппаратной шины I2C для подключения модулей с таким же интерфейсом.
    • SPI – выводы аппаратной шины SPI для подключения модулей с таким же интерфейсом.

    Простые цифровые датчики

    К простым цифровым можно отнести любые датчики, имеющие пин с логическим выходом, то есть напряжение на этом пине может быть только 0 или 5 Вольт в зависимости от показания датчика. Это например ИК датчик движения, кнопка, датчик линии, энкодер, а также практически все остальные датчики с пинами питания и выходом, помеченным как DO, OUT или S.

    Такие модули подключаются в любые GPIO пины.

    Интерфейсы

    Некоторые датчики имеют цифровой выход, но выдают не просто 0 и 5V, а передают данные по цифровому интерфейсу связи. Сигнальные пины таких датчиков могут быть подписаны как SCK, SDA, SCL, MISO, MOSI, SS и прочими аббревиатурами. Для работы с такими датчиками нужно обязательно смотреть примеры или документацию. По сути любой такой датчик можно подключить на любой GPIO пин и программно эмулировать нужный интерфейс связи, что сложно и будет отбирать лишнее процессорное время. Arduino Nano поддерживает несколько интерфейсов аппаратно, то есть позволяет работать с ними очень быстро и эффективно.

    UART – пины D0 (RX) и D1 (TX). По нему чаще всего подключаются Bluetooth, GPS и GSM модули. В общем случае поддерживает подключение только одного модуля. Пины на модуле называются обычно RX и TX. Подключение к модулю осуществляется “наоборот” – RX->TX и TX->RX, так как RX принимает сигналы (Receiver), а TX – передаёт (Transmitter). Для подключения нескольких UART модулей или одновременной работы модуля и “монитора порта” используют программный UART при помощи встроенной библиотеки SoftwareSerial.

    I2C – пины A4 (SDA) и A5 (SCL). Данный интерфейс является шиной, то есть к нему можно подключить параллельно сразу несколько (до 128) устройств с уникальными адресами.

    Варианты маркировки и подключение к аппаратному I2C:

    • A4SCL (C, SCK) – линия синхронизации, Serial CLock

    SPI – пины D11 (MOSI), D12 (MISO) и D13 (SCLK), иногда добавляется D10 (SS). Данный интерфейс также является шиной, причём высокоскоростной, и поддерживает подключение по сути неограниченного количества модулей: у модуля есть пин CS (Chip Select), который прижимается микроконтроллером к GND для выбора данного модуля в качестве устройства приёма и передачи данных в текущий момент. SPI – очень распространённый и простой интерфейс, очень часто датчики и модули подключают к любым GPIO пинам и используют программную отправку и приём данных через встроенные функции shiftIn() и shiftOut(). “Сложные” датчики и датчики с большим объёмом и высокой скоростью передаваемых данных (карта памяти, NFC модуль) нужно подключать к аппаратной шине SPI микроконтроллера.

    Варианты маркировки и подключение к аппаратному SPI:

    • D11MISO (SDO, DO, DON, SO) – линия данных от модуля к Ардуино
    • D13SCLK (SCK, CLK, SPC) – линия синхронизации
    • D10CS (SS, RCK) – выбор текущего модуля прижатием этого пина к GND

    Другие

    Помимо этих трёх популярных интерфейсов существуют и другие (CAN, 1-wire и прочее), но так как у нас есть сила микроконтроллера, мы можем эмулировать практически любой протокол и интерфейс связи, так называемый software (softwareSerial, softwareI2C…). И тут на помощь приходит комьюнити ардуино, которое уже написало библиотеки для всего что можно, и можно без проблем общаться практически с любой железкой, поддерживающей какой-либо популярный протокол связи. По той же CAN шине можно подключиться к мозгам своего автомобиля и делать с ним всякое. Куча микросхем различного назначения без особых проблем и телодвижений подключаются к ардуино и позволяют собой управлять. Всяческие усилители, драйверы, сдвиговые регистры, ЦАПы, АЦПы, мультиплексоры, цифровые резисторы и сотни других интересных штук.

    Аналоговый сигнал

    Второй тип связи – аналоговый, работает только “на приём”. Микроконтроллер может измерять напряжение, которое подаётся ему на АЦП (аналогово-цифровой преобразователь), диапазон измерения ограничен вплоть до опорного напряжения или напряжения питания микроконтроллера, то есть максимум, что может измерить микроконтроллер без дополнительного железа – от 0 до 5 вольт, или от 0 до 3.3 вольт для 3.3 вольтовых моделей. К этому мы ещё вернёмся.

    Благодаря наличию АЦП (чтение аналогового сигнала) ардуино может считывать показания любых аналоговых датчиков: термисторы, термопары, фоторезисторы, потенциометры, напряжение шунта и прочее прочее из мира аналоговой электроники. По сути можно подключить всё что угодно без особых навыков, было бы желание и готовая библиотека. Ну и умение читать.

    К аналоговым относятся модули и датчики, сигнал с которых выходит в виде напряжения от 0 до 5 Вольт, но меняется “плавно” в зависимости от показания с датчика. Это например микрофон, термистор, фоторезистор, датчик влажности, потенциометр и прочее. Многие аналоговые датчики имеют пины, подписанные так же, как цифровые. Как отличить цифровой датчик от аналогового? Либо по описанию, либо методом “тыка” – подключить в аналоговый пин и вывести сигнал. Некоторые модули имеют цифровой и аналоговый выход одновременно (датчики звука, линии, холла и некоторые другие), пины у них обычно подписаны как DO – цифровой выход и AO – аналоговый. Также аналоговый выход может быть маркирован как OUT или S.

    Такие модули подключаются в любые ANALOG пины.

    Резюмируя

    Теперь по сути дела: датчики, их куча кучная, измерять можно ну просто всё, что вообще измеряется. Электроника: напряжение, ток, сопротивление, работа с переменным током, поля. Параметры микроклимата: температура, влажность, давление, содержание газов, скорость ветра, освещенность, что угодно. Интересных модулей тоже очень много: Bluetooth, сотовая связь, GPS, дисплеи различных типов и размеров, датчики присутствия, как ИК, так и микроволновые, модули для беспроводной связи ардуинок и многое другое.

    Можно управлять абсолютно любой железкой, которая выполняет свою функцию просто при подаче питания: лампочка, светодиодная лента, электронагреватель, мотор или любой электропривод, электромагнит, соленоид-толкатель, и это все с любым напряжением питания. Но тут нужно кое что понять: Ардуино (точнее микроконтроллер) – логическое устройство, то есть по-хорошему она должна только отдавать команды другим устройствам, или принимать их от них. Это я к тому, что напрямую от ардуино не работают ни лампочки, ни моторчики, ни нагреватели, ни- ху че-го. Максимум – светодиод. С пониманием этого идём дальше. Чтобы ардуино включила или выключила (подала питание) на другое устройство, нужно устройство – посредник, например реле или транзистор. Ардуино управляет реле, а реле в свою очередь включает любую нужную нагрузку с любым напряжением питания и все такое, подробнее об этом поговорим отдельно.

    Как суть всего выше написанного – возможности Ардуино по подключению и управлению различными железками практически безграничны, можно воплотить любую идею, даже самую безумную. Датчики что то измеряют, исполнительные устройства что то контролируют, в это же время ведётся отсылка данных куда-нибудь, что-то отображается на дисплее и контролируется при помощи кнопок. Романтика!

    У меня в каталоге ссылок на Ардуино-компоненты можно найти практически все существующие датчики, модули и прочие железки для Ардуино, и практически у каждого есть ссылка на статью с примером и библиотекой. Пользуйтесь!

    Интерфейс SPI и Arduino

    Изучаем интерфейс SPI и подключаем к Arduino сдвиговый регистр, к которому мы будем обращаться по этому протоколу для управления светодиодами.

    Инструкция по работе Arduino с интерфейсом SPI

    • Arduino UNO или иная совместимая плата;
    • сдвиговый регистр 74HC595;
    • 8 светодиодов (к примеру, вот из такого набора);
    • 8 резисторов по 220 Ом (рекомендую приобрести набор резисторов с номиналами от 10 Ом до 1 МОм);
    • соединительные провода (например, вот такой хороший набор);
    • макетная плата;
    • персональный компьютер со средой разработки Arduino IDE.

    1 Описание последовательного интерфейса SPI

    SPI – Serial Peripheral Interface или «Последовательный периферийный интерфейс» – это синхронный протокол передачи данных для сопряжения ведущего устройства (Master) с периферийными устройствами (Slave). Ведущим устройством часто является микроконтроллер. Связь между устройствами осуществляется по четырём проводам, поэтому SPI иногда называют «четырёхпроводной интерфейс». Вот эти шины:

    Название Назначение шины SPI
    MOSI (Master Out Slave In) линия передачи данных от ведущего к ведомым устройствам;
    MISO (Master In Slave Out) линия передачи от ведомого к ведущему устройству;
    SCLK (Serial Clock) тактовые импульсы синхронизации, генерируемые ведущим устройством;
    SS (Slave Select) линия выбора ведомого устройства; когда на линии логический «0», ведомое устройство «понимает», что сейчас обращаются к нему.

    Существует четыре режима передачи данных (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), обусловленные сочетанием полярности тактовых импульсов (работаем по уровню HIGH или LOW), Clock Polarity, CPOL, и фазой тактовых импульсов (синхронизация по переднему или заднему фронту тактового импульса), Clock Phase, CPHA. В последнем столбце таблицы приведены поясняющие иллюстрации. На них Sample обозначены моменты, когда данные на линии должны быть готовы и считываются устройствами. Буквой Z отмечено, что состояние данных на линии неизвестно или не важно.

    Режим Полярность тактовых импульсов (CPOL) Фаза тактовых импульсов (CPHA) Диаграмма режима
    SPI_MODE0
    SPI_MODE1 1
    SPI_MODE2 1
    SPI_MODE3 1 1

    Четыре режима работы интерфейса SPI —>

    Виды подключения устройств для работы по интерфейсу SPI: независимое и каскадное

    2 Реализация интерфейса SPI на платах семейства Arduino

    На рисунке приведено стандартное соответствие выводов шинам SPI для Arduino UNO и Nano.

    Реализация интерфейса SPI на платах Arduino UNO и Arduino Nano

    3 Стандартная библиотека для работы по интерфейсу SPI

    Временная диаграмма работы интерфейса SPI

    Работа с протоколом завершается командой SPI.endTransaction().

    Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.

    Если вы планируете в своём скетче использовать стандартные пины Arduino, можно не описывать их в начале программы, т.к. они уже определены в самой библиотеке и имеют следующие имена:

    Данные пины определены в файле pins_arduino.h , который находится по пути %programfiles%arduino-(версия)hardwarearduinoavrvariants (если вы устанавливали программу в стандартное расположение). То есть, например, чтобы опустить пин выбора ведомого в состояние «0», можно написать:

    4 Подключение сдвигового регистра к Arduino

    Схема подключения сдвигового регистра 74HC595 к Arduino

    5 Скетч для управления сдвиговым регистром по интерфейсу SPI

    Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.

    Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.

    Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.

    Числа, посылаемые в сдвиговый регистр 74HC595

    6 «Бегущая волна» из светодиодов

    Поделиться

    Похожие материалы (по тегу)

    • Как подключить панель со светодиодами WS2812 (WS2812B)
    • Как сделать электронный компас на датчике MPU-9250 и Arduino
    • Как подключить LED-панель 95×8 к Arduino
    • Реализация интерфейса SPI с помощью библиотеки CH341DLL на VB.NET
    • Реализация SPI: библиотека libMPSSE и .NET

    Последнее от .aave.

    • Как провести моделирование с помощью ModelSim — Altera
    • Как прочитать билет на метро и автобус с помощью Arduino
    • Как провести симуляцию сигнала в Simulation Waveform Editor
    • Что такое Arduino и что с ним можно сделать
    • Как подключить к Arduino модуль Bluetooth

    Другие материалы в этой категории:

    8 комментарии

    Даешь статью про каскадное подключение. Мне прямо очень надо! Спасибо!)))

    Алекс, обязательно. Просто сейчас совсем нет времени это.

    По поводу розовых и голубых вертикальных линий: очевидно, что розовый цвет отражает передний фронт тактового импульса, а голубой — задний фронт. Не очевидно то, что они вводят читателя в заблуждение. Блуд в том, что в данном применении они извращают понимание фазы. Считывание (latch) текущего бита всегда происходит по фронту импульса: при фазе 0 — по переднему, а при фазе 1 — по заднему. В каждом цикле обработки текущего бита моменту отсечки (latch) ВСЕГДА ПРЕДШЕСТВУЕТ (на половину тактового сигнала) момент выдачи бита (shift). Передний фронт тактового сигнала (в SPI) не его начало, а его середина. Комплект цветных линий на рисунке разумен для режима передачи (mode) SPI 1 и 3. Для режима 0 и 2 весь этот комплект линий должен быть смещён на пол такта влево.

    Хочу обратить внимание читателей на то, что для прояснения принципа функционирования SPI, автором данной странички представлен рисунок белиберды под названием «Временная диаграмма работы интерфейса SPI».
    Что там не так:
    1. передаются 8 бит — значит и импульсов SCLK должно быть 8, а на рисунке их 9 с гаком;
    2. моментов представления текущих битов (на рисунке «скрещивание» MOSI) должно быть 8, а их 9;
    3. принципиально — SPI СИНХРОННАЯ передача, поскольку начало передачи на рисунке соответствует mode0, то отсечка (latch) каждого передаваемого бита должна происходить по переднему фронту импульса (середина текущего такта), а представление текущего бита (shift) — в момент начала текущего такта SCLK.
    На рисунке синхронность процесса передачи отсутствует.

    Михаил, большое спасибо за замечания! Заменил иллюстрацию, на которой изображена временная диаграмма SPI.

    Если на клетке слона прочтёшь надпись «буйвол», не верь глазам своим. Применительно к SPI, в клетке находится SS, а надпись на клетке — «Slave Select». На самом деле, SS — синхронизация сеанса обмена данными. Синхронизация сеанса об мена данными — это единственная и неотъемлемая роль SS в протоколе интерфейса SPI. Физически SS представляет собой импульс. Передний фронт этого импульса — старт, начало общения Управляющего и Управляемого, а задний фронт — конец общения, начало осмысления. Следует отметить, что импульс SS особенно важен для Управляющего т.к. по переднему фронту импульса SS Управляющий начинает генерировать тактовые сигналы SCLK, каждый из которых синхронизирует обмен одного бита данных.
    Предвидя то, что среди читающих мои строки найдутся непримиримые, укориенелые сторонники «Slave Select», потряхивающие картинкой «Один мастер и три слэйва», хочу их успокоить: — ) В нашей стране извращения не запрещен. Более того, а не пора ли перейти к картинке «Три мастера один слэйв»? Прошу детей к этому не привлекать.

    Поменял «шило на мыло». И в предыдущий рисунок демонстрировал отсутствие синхронизации, и текущий рисунок нагло демонстрирует отсутствие синхронизации. Нарочито моменты смены значения текущего передаваемого бита (shift) не синхронизированы.

    Интерфейс SPI и Arduino

    This library allows you to communicate with SPI devices, with the Arduino as the master device.

    To use this library
    #include

    A Brief Introduction to the Serial Peripheral Interface (SPI)

    Serial Peripheral Interface (SPI) is a synchronous serial data protocol used by microcontrollers for communicating with one or more peripheral devices quickly over short distances. It can also be used for communication between two microcontrollers.

    With an SPI connection there is always one master device (usually a microcontroller) which controls the peripheral devices. Typically there are three lines common to all the devices:

    • MISO (Master In Slave Out) — The Slave line for sending data to the master,
    • MOSI (Master Out Slave In) — The Master line for sending data to the peripherals,
    • SCK (Serial Clock) — The clock pulses which synchronize data transmission generated by the master

    and one line specific for every device:

    • SS (Slave Select) — the pin on each device that the master can use to enable and disable specific devices.

    When a device’s Slave Select pin is low, it communicates with the master. When it’s high, it ignores the master. This allows you to have multiple SPI devices sharing the same MISO, MOSI, and CLK lines.

    To write code for a new SPI device you need to note a few things:

    • What is the maximum SPI speed your device can use? This is controlled by the first parameter in SPISettings . If you are using a chip rated at 15 MHz , use 15000000. Arduino will automatically use the best speed that is equal to or less than the number you use with SPISettings .
    • Is data shifted in Most Significant Bit (MSB) or Least Significant Bit (LSB) first? This is controlled by second SPISettings parameter, either MSBFIRST or LSBFIRST. Most SPI chips use MSB first data order.
    • Is the data clock idle when high or low? Are samples on the rising or falling edge of clock pulses? These modes are controlled by the third parameter in SPISettings .

    The SPI standard is loose and each device implements it a little differently. This means you have to pay special attention to the device’s datasheet when writing your code.

    Generally speaking, there are four modes of transmission. These modes control whether data is shifted in and out on the rising or falling edge of the data clock signal (called the clock phase), and whether the clock is idle when high or low (called the clock polarity). The four modes combine polarity and phase according to this table:

    Mode Clock Polarity (CPOL) Clock Phase (CPHA) Output Edge Data Capture
    SPI_MODE0 Falling Rising
    SPI_MODE1 1 Rising Falling
    SPI_MODE2 1 Rising Falling
    SPI_MODE3 1 1 Falling Rising

    Once you have your SPI parameters, use SPI.beginTransaction() to begin using the SPI port. The SPI port will be configured with your all of your settings. The simplest and most efficient way to use SPISettings is directly inside SPI.beginTransaction(). For example:

    SPI.beginTransaction( SPISettings (14000000, MSBFIRST, SPI_MODE0));

    If other libraries use SPI from interrupts, they will be prevented from accessing SPI until you call SPI.endTransaction() . The SPI settings are applied at the begin of the transaction and SPI.endTransaction() doesn’t change SPI settings. Unless you, or some library, calls beginTransaction a second time, the setting are maintained. You should attempt to minimize the time between before you call SPI.endTransaction() , for best compatibility if your program is used together with other libraries which use SPI.

    With most SPI devices, after SPI.beginTransaction() , you will write the slave select pin LOW, call SPI.transfer() any number of times to transfer data, then write the SS pin HIGH, and finally call SPI.endTransaction() .

    Connections

    The following table display on which pins the SPI lines are broken out on the different Arduino boards:

    Arduino / Genuino Board MOSI MISO SCK SS (slave) SS (master) Level
    Uno or Duemilanove 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10 5V
    Mega1280 or Mega2560 51 or ICSP-4 50 or ICSP-1 52 or ICSP-3 53 5V
    Leonardo ICSP-4 ICSP-1 ICSP-3 5V
    Due SPI-4 SPI-1 SPI-3 4, 10, 52 3,3V
    Zero ICSP-4 ICSP-1 ICSP-3 3,3V
    101 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10 10 3,3V
    MKR1000 8 10 9 3,3V

    Note that MISO, MOSI, and SCK are available in a consistent physical location on the ICSP header; this is useful, for example, in designing a shield that works on every board.

    Note about Slave Select (SS) pin on AVR based boards

    All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

    It is, however, possible to use any pin as the Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card, and pin 10 to control the connection to the Ethernet controller.

    Examples

    • Barometric Pressure Sensor: Read air pressure and temperature from a sensor using the SPI protocol.
    • Digital Pot Control: Control a AD5206 digital potentiometer using the SPI protocol.

    Last revision 2019/12/24 by SM

    Functions

    • SPISettings
    • begin()
    • end()
    • beginTransaction()
    • endTransaction()
    • setBitOrder()
    • setClockDivider()
    • setDataMode()
    • transfer()
    • usingInterrupt()

    See also

    • shiftOut()
    • shiftIn()

    Corrections, suggestions, and new documentation should be posted to the Forum.

    The text of the Arduino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: