Приветствую Вас ГостьПятница, 03.05.2024, 07:22

AVR & ARDUINO




Каталог статей

Главная » Статьи » Справочник

Библиотека SPI

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

Описание SPI (Serial Peripheral Interface)

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

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

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

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

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

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

Типичный алгоритм работы SPI

  • Master устанавливает низкий уровень на той линии SS, к которой подключен нужный Slave.
  • Master задаёт такт, генерируя импульсы синхронизации, на SCLK, и одновременно с каждым импульсом SCLK выставляет нужный уровень на MOSI, передавая Slave по биту за такт.
  • Slave на каждый импульс SCLK выставляет нужный уровень на MISO, передавая Master по биту за такт.
  • Для завершения передачи Master устанавливает высокий уровень на SS.

Регистры SPI:

Регистр управления

Ниже описаны значения восьми бит регистра управления интерфейса SPI.

  • Биты 0 и 1: SPR0 и SPR1 (SPI Clock Rate Select) — выбор частоты тактового сигнала. Биты предназначены для управления тактовой частотой, что актуально только для ведущего устройства.
  • Бит 2: CPHA (Clock Phase) — фаза тактового сигнала.
  • Бит 3: CPOL ( Clock Polarity) — полярность тактового сигнала.
  • Бит 4: MSTR (Master/Slave Select) — выбор режима «ведущий/ведомый». Установка бита в 1 переводит устройство в режим ведущего, установка бита в 0 — в режим ведомого.
  • Бит 5: DORD (Data Order) — порядок данных. Бит управляет порядком передачи данных (с бита 0 или с бита 7).
  • Бит 6: SPE (SPI Enable) — разрешение работы SPI. Установка бита в 1 разрешает работу интерфейса, сигналы от порта подключаются к внешним линиям связи интерфейса.
  • Бит 7: SPIE (SPI Interrupt Enable) — разрешение прерывания от SPI.

Регистр статуса

Ниже описаны значения восьми бит регистра статуса интерфейса SPI.

  • Биты 0…5 — зарезервированы, всегда установлены в 0.
  • Бит 6: WCOL ( Write Collision Flag) — флаг ошибки при записи. Бит устанавливается в 1 при записи в регистр в ходе обмена последовательными данными. Бит сбрасывается в 0 при чтении регистра статуса.
  • Бит 7: SPIF (SPI Interrupt Flag) — флаг прерывания SPI. Бит устанавливается в 1 при завершении обмена данными. Бит сбрасывается в 0 при считывании данных из буфера регистра данных.

Режимы работы интерфейса SPI

Возможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL:

  • CPOL = 0 — сигнал синхронизации начинается с низкого уровня;
  • CPOL = 1 — сигнал синхронизации начинается с высокого уровня;
  • CPHA = 0 — выборка данных производится по переднему фронту сигнала синхронизации;
  • CPHA = 1 — выборка данных производится по заднему фронту сигнала синхронизации.

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

  • Какой порядок вывода данных используется: сдвиг данных должен осуществляться, начиная со старшего бита (MSB) или с младшего бита (LSB)? Порядок следования данных контролируется функцией SPI.setBitOrder().
  • При отсутствии тактовых импульсов линия SCK должна находиться в высоком (HIGH) или низком (LOW) уровне?
  • Считывание данных происходит по фронту или по спаду тактового импульса? Эти режимы работы контролируются функцией 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, останется только выяснить, какие регистры периферийного устройства отвечают за те или иные его функции. Как правило, это описано в техническом описании (datasheet) устройства.

Подключение

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

Плата 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. Такое расположение может быть удобно при создании универсальных плат расширения, работающих на всех моделях плат Arduino.

Замечание о работе контакта SS в платах на базе AVR

У всех моделей Arduino на основе микроконтроллеров AVR есть вывод SS, который используется в режиме работы Slave (т,е, если  Ардуино управляется внешним Мастером). Однако, в данной библиотеке реализован только режим работы Master, поэтому в этом режиме вывод SS должен быть сконфигурирован как выход (OUTPUT). В противном случае 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 периферийных устройств.

Методы

begin()

end()

setBitOrder()

setClockDivider()

setDataMode()

transfer()

Примеры

  • BarometricPressureSensor: Считывание показаний датчика об атмосферном давлении и температуре через SPI
  • SPIDigitalPot: Управление цифровым потенциометром через SPI

 

Смотрите также

Использование расширенных возможностей SPI на Arduino Due

shiftOut()

shiftIn()

Статья: SPI и Arduino

 



Источник: http://arduino.cc/en/Reference/SPI
Категория: Справочник | Добавил: magi (20.02.2015)
Просмотров: 7441 | Теги: Serial Peripheral Interface, SPI, Последовательный периферийный интер, arduino | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Поиск
Вход на сайт
На правах рекламы

Мы переезжаем на сайт Arduino по-русски