Теория программирования — интерфейс SPI. Spi интерфейс arduino


Библиотека SPI | Аппаратная платформа Arduino

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

Коротко о Serial Peripheral Interface (SPI).

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

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

  • Master In Slave Out (MISO), переводится как  "вход ведущего выход ведомого", используется для передачи данных от ведомого к ведущему.
  • Master Out Slave In (MOSI) — выход ведущего вход ведомого, для передачи данных от ведущего к периферийным устройствам.
  • Serial Clock (SCK) — синхронизирующая линия, синхросигнал генерируется ведущим устройством.
  • Slave Select pin — вход на ведомых устройствах с помощью которого ведущий может инициировать обмен данными с периферийным устройством. Если на этом входе LOW, то ведомый взаимодействует с ведущим, если HIGH, то ведомый игнорирует сигналы от ведущего.

 При работе с SPI устройствами надо учитывать следующие моменты:

  • Какой порядок вывода данных используется:  Most Significant Bit (MSB - старший бит (разряд)) or Least Significant Bit (LSB - младший бит) первый. Порядок может быть изменен функцией SPI.setBitOrder().
  • Уровень сигнала синхронизации — по какому синхронизирующему сигналу (HIGH или LOW) передаются данные.
  • Фаза синхронизации — влияет на последовательность установки и выборки данных. Фаза синхронизации SPI и уровень сигнала задается функцией SPI.setDataMode().
  • Скорость на которой работает SPI устанавливается функцией SPI.setClockDivider().

Производители SPI устройств несколько по разному реализуют протокол, поэтому необходимо внимательно ознакомиться с техническим описанием к устройству. Комбинация фазы синхронизиции (CPHA) и уровня сигнала синхронизации (CPOL) задают режим логики работы интерфейса SPI. Режим устанавливается функцией SPI.setDataMode().

Режим Уровень сигнала (CPOL) Фаза (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1
 Подключение

На контроллерах Arduino Duemilanove и других на базе ATmega168 /328, шина SPI использует выходы 10 (SS), 11 (MOSI), 12 (MISO), и 13 (SCK). На Arduino Mega — 50 (MISO), 51 (MOSI), 52 (SCK), и 53 (SS). Обратите внимание, что даже если вы не используете выход SS, он должен быть установлен как выход, в противном случае интерфейс может оказаться в режиме ведомого и библиотека не будет работать как надо.

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

Функции

Выражаем благодарность Modular за помощь в переводе библиотеки.

arduino.ru

Теория программирования — интерфейс SPI

Доброго времени суток! Сегодняшняя статья – небольшое теоретическое отступление, которое поможет нам при освоении курса «Программирование Ардуино». Речь пойдёт об интерфейсе SPI. Что это такое и с чём его едят, мы постараемся разобраться в данной статье.

Для начала определение. SPI (Serial Peripheral Interface — последовательный периферийный интерфейс) – это последовательный синхронный стандарт передачи данных, который предназначен для связи контроллера с различной периферией. Этот интерфейс простой и удобный. Под Аrduino написана специальная библиотека для работы с SPI.

Связь строится по принципу «ведущий-ведомый». В качестве ведущего устройства обычно выступает контроллер. Все остальные устройства, что подключаются в систему — ведомыми. Данные от ведущего устройства по шине данных передаются к одному из выбранных ведомых или наоборот от ведомого устройства к ведущему синхронно, по тактирующему сигналу ведущего.

Распиновка шины данных SPI состоит из 4-х линий: MOSI, MISO, CS и SCLK:

  • MOSI (Master Out Slave In — Ведущий-выход, Ведомый-вход) или просто SI – передача данных происходит от ведущего устройства к ведомому.
  • MISO (Master In Slave Out — Ведущий-вход, Ведомый-выход) или просто SO – передача данных происходит от ведомого устройства к ведущему.
  • CS (Chip Select — Выбор чипа) или SS (Slave Select — Выбор ведомого) – выбор ведомого устройства.
  • SCLK (Serial CLocK) или просто SCK – передача тактового сигнала от ведущего устройства к ведомому.

Для того, чтобы передать данные от ведущего устройства к ведомому необходимо, чтобы ведущий выставил низкий уровень сигнала на линии CS ведомого, с которым собирается настроить связь. После этого биты передаются по линии MOSI. Для прекращения передачи данных ведущий как бы «отпускает» линию CS – выставляя на ней высокий уровень сигнала.

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

Параллельное подключение ведомых устройств по шине данных SPI

Особенность параллельного подключения нескольких ведомых устройств заключается в том, что для создания связи используются общие линии SCLK, MOSI и MISO. При этом каждое ведомое устройство имеет свою линию SS(CS).  Ведущее устройство определяет с каким «текущим ведомым» наладить обмен данными, путем формирования низкого уровня сигнала на соответствующей линии SSn (где n – 1,2…).

Для подключения к контроллеру n-числа ведомых устройств по интерфейсу SPI нужно выделить для данной цели n+3 выводов микроконтроллера.

Последовательное подключение ведомых устройств к шине SPI

Что же касается последовательного подключения ведомых устройств, то они используют общие линии SCLK и SS, а выход одного подключается ко вход другого. Линия MOSI ведущего устройству подключается к первому ведомому, а линия MISO — к последнему. Если смотреть на это подключение с точки зрения ведущего устройства, то по шине данных SPI, как бы подключено одно ведомое устройство.

Следует отметить преимущество такого типа подключения: можно подключать n-ое число устройств задействовав для этой цели всего 4 вывода микроконтроллере.

На этом пока всё, продолжение следует…

ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ!

About alexlevchenko
Ценю в людях честность и открытость. Люблю мастерить разные самоделки. Нравится переводить статьи, ведь кроме того, что узнаешь что-то новое - ещё и даришь другим возможность окунуться в мир самоделок.

mozgochiny.ru

Поддержка протоколов Modbus, SPI, One Wire, I2C и др. – FLProg

Данная библиотека позволяет Ардуино взаимодействовать с различными 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 0 0
SPI_MODE1 0 1
SPI_MODE2 1 0
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 Due.

flprog.ru