Arduino:Библиотеки/SPI

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

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


Библиотека SPI[1]

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

Краткое введение в SPI

SPI (от «Serial Peripheral Interface», что значит «последовательный периферийный интерфейс») – это последовательный синхронный протокол передачи данных, который используется микроконтроллерами для коммуникации с одним или более периферийными устройствами (быстро и на короткие дистанции). Кроме того, его можно использовать для коммуникации с другими микроконтроллерами.

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

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

И у каждого ведомого устройства должна быть следующая линия:

  • SS (от «Slave Select», т.е. «выбор ведомого устройства») – контакт, который имеется у каждого ведомого устройства, чтобы ведущее устройство могло выбирать, кому из них в текущий момент передавать данные

Если контакт SS у ведомого устройства выставлен в положение LOW, это значит, что именно оно в данный момент «общается» с ведущим устройством. Если в положение HIGH, то оно будет игнорировать сигналы от ведущего устройства. Это позволяет сразу нескольким ведомым SPI-устройствам использовать одни и те же линии для MOSI, MISO и SCK.

Перед тем, как начать писать код для нового SPI-устройства, вам нужно иметь в виду следующее:

  • Какова максимальная скорость передачи данных, которую может использовать это SPI-устройство? Это самый первый параметр в SPISettings. Если вы используете чип, рассчитанный на 15 МГц, используйте значение «15000000». Arduino автоматически воспользуется скоростью, которая равна или меньше числа, указанного в SPISettings.
  • Какой бит отсылается первым – самый старший или самый младший? Это управляется вторым параметром в SPISettings. У большинства SPI-чипов первым отсылается самый старший бит.
  • Когда начинается сигнал синхронизации – с низкого или высокого уровня (это называется полярностью тактового сигнала)? Когда происходит захват данных – на фазе нарастания или убывания (это называется фазой тактового сигнала)? Все эти режимы управляются третьим параметром SPISettings.

SPI – это свободный стандарт, поэтому разные устройства могут пользоваться им по-разному. Это значит, что перед написанием кода для определенного устройства следует внимательно изучить «даташит» к нему.

Есть четыре режима передачи данных. Ими управляется, когда выполняется захват и выпуск данных – на фазе нарастания («0») или фазе убывания («1») тактового сигнала, а также то, с какого уровня начинается синхронизация сигнала – с низкого («0») или высокого («1»). В таблице ниже показаны все четыре режима:

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

Как только у вас будут все необходимые SPI-параметры, начните использовать SPI-порт при помощи функции SPI.beginTransaction(). Порт будет настроен в соответствии с заданными вами настройками. Самый простой и эффективный способ использования SPISettings – прямо внутри функции SPI.beginTransaction(). Например:

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

Если другие библиотеки используют SPI из прерываний, то они не смогут получить доступ к SPI, пока вы не вызовите функцию SPI.endTransaction(). Настройки SPI устанавливаются при выполнении SPI.beginTransaction()(то есть в самом начале SPI-соединения), и вызов SPI.endTransaction() эти настройки не меняет. До тех пор, пока вы или какая-нибудь библиотека не вызовет второй раз функцию SPI.beginTransaction(), эти настройки будут сохранены. Если в вашем скетче работают другие библиотеки, использующие SPI, то для наилучшей совместимости с ними время до вызова SPI.endTransaction() имеет смысл сделать как можно меньше.

Для большинства SPI-девайсов код строится по следующей схеме: сначала вызывается функция SPI.beginTransaction(), затем SS-контакту присваивается значение LOW, далее нужное количество раз вызывается функция SPI.transfer(), после этого SS-контакту присваивается значение HIGH и, наконец, вызывается функция SPI.endTransaction().

Более подробно об SPI читайте на Википедии.

Подключение

Таблица ниже показывает, какие контакты используются разными моделями Arduino для шины SPI:

Модель Arduino MOSI MISO SCK SS (ведомое) SS (ведущее) Ток
Uno или Duemilanove 11 или ISCP-4 12 или ISCP-1 13 или ISCP-3 10 - 5V
Mega1280 или Mega2560 51 или ISCP-4 50 или ISCP-1 52 или ISCP-3 53 - 5V
Leonardo ISCP-4 ISCP-1 ISCP-3 - - 5V
Due ISCP-4 ISCP-1 ISCP-3 - 4, 10, 52 3,3V
Zero ISCP-4 ISCP-1 ISCP-3 - - 3,3V
101 11 или ISCP-4 12 или ISCP-1 13 или ISCP-3 10 10 3,3V
MKR1000 8 10 9 - - 3,3V

Обратите внимание, что MISO, MOSI и SCK находятся, как правило, на одном и том же месте ISCP-гребешка. Это полезно, к примеру, при создании модулей, совместимых со всеми моделями Arduino.

Примечание насчет SS-контакта на AVR-платах

У всех AVR-плат есть SS-контакт, который полезен, если эти платы используются в качестве ведомого устройства, управляемого внешним ведущим устройством. Поскольку эта библиотека поддерживает только режим ведущего устройства, SS-контакт должен быть всегда выставлен на OUTPUT. В противном случае SPI-шина будет автоматически переключена в режим ведомого устройства самим оборудованием, а библиотека, следовательно, перестанет работать.

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

Функции

Примеры

  • BarometricPressureSensor - Считываем с датчика данные об атмосферном давлении и температуре при помощи протокола SPI.
  • SPIDigitalPot - Управление цифровым потенциометром AD5206 при помощи протокола SPI.

См.также

  1. shiftOut()
  2. shiftIn()

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