Arduino:Библиотеки/SPI: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 116: | Строка 116: | ||
<references /> | <references /> | ||
[[Категория:Стандартные библиотеки]] | [[Категория:Стандартные библиотеки]] |
Версия от 11:15, 8 июля 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Библиотека 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-контроллером.
Функции
- Класс SPISettings
- begin()
- end()
- beginTransaction()
- endTransaction()
- setBitOrder()
- setClockDivider()
- setDataMode()
- transfer()
- usingInterrupt()
- Расширенное использование шины SPI на Due
Примеры
- BarometricPressureSensor - Считываем с датчика данные об атмосферном давлении и температуре при помощи протокола SPI.
- SPIDigitalPot - Управление цифровым потенциометром AD5206 при помощи протокола SPI.
См.также
- shiftOut()
- shiftIn()