Arduino spi speeds

Arduino.ru

Библиотека SPI

Библиотека 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 за помощь в переводе библиотеки.

Источник

SPI -Serial Peripheral Interface, краткое руководство

Данная статья является кратким дискурсом по шине SPI и не должна восприниматься как точная техническая документация. Рассматривается только полнодуплексный вариант применения.

Общие сведения:

SPI — (Serial Peripheral Interface) эспиай, последовательный периферийный интерфейс иногда называемый 4-х проводным интерфейсом, является последовательным синхронным интерфейсом передачи данных. Изобретён компанией Motorola в середине 1980-x. В отличие от I2C и UART, SPI требует больше сигналов для работы, но может работать на более высоких скоростях. Не поддерживает адресацию, вместо этого используется сигнал SS (slave select — выбор ведомого), который также иногда называется CS (chip select), CE (chip enable) или SE (slave enable). Поддерживает только одного ведущего на шине. Ведущий устанавливает скорость обмена данными и другие параметры, такие как полярность и фаза тактирования. Обмен данными происходит в режиме полного дуплекса, что означает устройства на шине могут одновременно передавать и принимать данные. Интерфейс использует следующие сигналы (в номенклатуре AVR, для получения точного названия сигналов обратитесь к технической документации микросхемы, с которой работаете):

  • MISO (master in slave out) — вход ведущего, выход ведомого
  • MOSI (master out slave in) — выход ведущего, вход ведомого
  • SCK (serial clock) — сигнал тактирования
  • SS (slave select) — сигнал выбор ведомого.

Несмотря на то, что интерфейс называется 4-х проводным, для подключения нескольких ведомых понадобится по одному проводу SS для каждого ведомого (в полнодуплексной реализации). Сигналы MISO, MOSI и SCK являются общими для всех устройств на шине. Ведущий посылает сигнал SS для того ведомого, обмен данными с которым будет осуществляться. Простыми словами, все ведомые, кроме выбранного ведущим будут игнорировать данные на шине. SS является инверсным (active-low), что означает что ведущему необходимо прижать эту линию для выбора ведомого.

Подключение:

SPI на Arduino:

Arduino UNO/Piranha UNO/Arduino ULTRA

На Arduino UNO/Piranha UNO/Arduino ULTRA выводы аппаратного SPI расположены на 10, 11, 12 и 13 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):

Сигнал Вывод
SS 10
MOSI 11
MISO 12
SCK 13

Arduino MEGA

На Arduino MEGA выводы аппаратного SPI расположены на 50, 51, 52 и 53 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):

Сигнал Вывод
SS 53
MOSI 51
MISO 50
SCK 52

Пример для Arduino

В этих примерах мы соединим две Arduino по SPI по следующей схеме:

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

Arduino UNO в качестве ведущего:

Arduino UNO в качестве ведомого:

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

SPI на Raspberry Pi

На Raspberry Pi выводы аппаратного SPI расположены на выводах GPIO7, GPIO8, GPIO9, GPIO10, GPIO11:

Перед работой с SPI необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> SPI

Подробное описание как это сделать можно посмотреть по ссылке Raspberry Pi, включаем I2C, SPI

Пример работы с SPI на Python:

В отличие от Arduino для Raspberry не существует простых решений для работы в режиме ведомого. Подробней ознакомиться с работой чипа BCM Raspberry можно в технической документации на официальном сайте, стр. 160.

Для проверки работы сценария можно подключить Raspberry по SPI к Arduino со скетчем из примера выше через преобразователь уровней или Trema+Expander Hat:

Подробнее о SPI

Параметры

Существуют четыре режима работы SPI, зависящие от полярности (CPOL) и фазы (CPHA) тактирования:

Режим Полярность Фаза Фронт тактирования Фронт установки бита данных
SPI_MODE0 0 0 Спадающий Нарастающий
SPI_MODE1 0 1 Нарастающий Спадающий
SPI_MODE2 1 0 Нарастающий Спадающий
SPI_MODE3 1 1 Спадающий Нарастающий

В Arduino IDE для установки режима необходимо передать функции, возвращающей объект настроек параметр режима работы SPI_MODE, например:

Для выбора режима работы SPI на Raspberry Pi необходимо вызвать дескриптор объекта SpiDev().mode и присвоить ему битовые значения CPOL и CPHA, например:

Скорость передачи данных

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

Источник

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

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

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

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

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

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

и одна линия, отдельная для каждого устройства:

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

Когда на выводе выбора ведомого SS установлен низкий логический уровень, это ведомое устройство взаимодействует с мастером. Когда на выводе SS установлен высокий логический уровень, ведомое устройство игнорирует мастера. Это позволяет вам иметь несколько SPI устройств, использующих одни и те же линии MISO, MOSI и CLK.

Для написания кода для нового SPI устройства вам необходимо обратить внимание на несколько моментов:

  • Какова максимальная скорость SPI, которую может использовать ваше устройство? Она управляется первым параметром в SPISettings . Если вы используете чип с тактовой частотой 15 МГц, используйте значение 15000000. Arduino будет автоматически использовать лучшую скорость, равную или меньшую, чем значение, которое вы использовали в SPISettings .
  • В каком порядке передаются данные: сначала идет старший значащий бит (MSB, Most Significant Bit) или младший значащий бит (LSB, Least Significant Bit)? Он управляется вторым параметром в SPISettings : либо MSBFIRST , либо LSBFIRST . Большинство SPI чипов используют порядок с идущим первым MSB.
  • На линии данных во время ожидания должен быть установлен высокий или низкий логический уровень? Выборка данных происходит по нарастающему или по спадающему фронту тактовых импульсов? Эти режимы контролируются третьим параметром в SPISettings .

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

Вообще говоря, существует четыре режима передачи. Эти режимы управляют тем, выбираются ли данные при нарастающем или при спадающем фронте сигнала тактовой синхронизации (так называемая фаза сигнала синхронизации), находится ли линия синхронизации в режиме ожидания при высоком или при низком логическом уровне (так называемая полярность сигнала синхронизации). Четыре режима объединяют полярность и фазу в соответствии с данной таблицей:

Режимы SPI

Режим Полярность сигнала синхронизации
(CPOL, Clock Polarity)
Фаза сигнала синхронизации
(CPHA, Clock Phase)
Сдвиг данных Выборка данных
SPI_MODE0 0 0 спад нарастание
SPI_MODE1 0 1 нарастание спад
SPI_MODE2 1 0 нарастание спад
SPI_MODE3 1 1 спад нарастание

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

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

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

Для более подробной информации об интерфейсе SPI смотрите статью «Назад к основам: SPI (последовательный периферийный интерфейс)».

Подключение

Следующая таблица показывает, на какие выводы плат Arduino выведены выводы шины SPI:

Выводы шины SPI на платах Arduino

Плата Arduino / Genuino MOSI MISO SCK SS (ведомый) SS (мастер) Уровень
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 3,3В
Zero ICSP-4 ICSP-1 ICSP-3 3,3В
101 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 10 10 3,3В
MKR1000 8 10 9 3,3В

Обратите внимание, что MISO, MOSI и SCK доступны все вместе в одном постоянном месте на плате на разъеме ICSP; это полезно, например, при разработке платы, которая работает на всех платах Arduino.

Назначение выводов разъема ICSP на платах Arduino

Примечание о выводе выбора ведомого (SS) на платах на базе микроконтроллеров AVR

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

Тем не менее, в режиме мастера для выбора устройств, в качестве вывода выбора ведомого (SS) можно использовать любой вывод на плате. Например, плата расширения Arduino Ethernet использует вывод 4 для управления SPI соединением со встроенной SD картой и вывод 10 для управления SPI соединением с контроллером Ethernet.

Описание методов библиотеки SPI

Описание

Объект SPISettings используется для настройки SPI порта вашего устройства. Все три параметра объединяются в один объект SPISettings , который передается методу SPI.beginTransaction() .

Когда все ваши параметры являются константами, SPISettings следует использовать непосредственно в SPI.beginTransaction() . Синтаксис смотрите ниже. При константах этот синтаксис приводит к меньшему и более быстрому коду.

Если какие-либо из ваших параметров являются переменными, мы можете создать объект SPISettings для хранения трех параметров. Затем вы можете передать методу SPI.beginTransaction() имя этого объекта. Создание именованного объекта SPISettings может быть более эффективным, если ваши параметры не являются константами, особенно если максимальная скорость – это переменная, вычисленная или настроенная, а не число, которое вы водите непосредственно в коде скетча.

Синтаксис

Примечание: лучше всего подходит, если все 3 параметра – константы.

Примечание: лучше всего подходит, если все 3 параметра – переменные.

Параметры

  • speedMaximum : максимальная скорость связи. Для SPI чипа с тактовой частотой 20 МГц используйте 20000000.
  • dataOrder : MSBFIRST или LSBFIRST .
  • dataMode : SPI_MODE0 , SPI_MODE1 , SPI_MODE2 или SPI_MODE3 .

Возвращаемое значение

Описание

Инициализирует шину SPI установкой SCK, MOSI и SS в режим выхода, установкой на SCK и MOSI низкого логического уровня, а на SS – высокого логического уровня.

Синтаксис

Параметры

Возвращаемое значение

Описание

Отключает шину SPI (режимы работы выводов не меняются).

Синтаксис

Параметры

Возвращаемое значение

Описание

Инициализирует шину SPI, используя переданный объект SPISettings .

Синтаксис

Параметры

mySettings : выбранные настройки в соответствии с SPISettings (смотрите выше).

Возвращаемое значение

Описание

Останавливает использование шины SPI. Обычно вызывается после отмены выбора ведомого чипа, чтобы позволить использовать шину SPI другим библиотекам.

Синтаксис

Параметры

Возвращаемое значение

Описание

Эта функция не должна использоваться в новых проектах. Для настройки параметров используйте SPISettings с SPI.beginTransaction() .

Устанавливает порядок передачи битов на шину SPI: либо MSBFIRST (сначала старший значащий бит), либо LSBFIRST (сначала младший значащий бит).

Синтаксис

Параметры

order : LSBFIRST или MSBFIRST .

Возвращаемое значение

Описание

Эта функция не должна использоваться в новых проектах. Для настройки параметров используйте SPISettings с SPI.beginTransaction() .

Устанавливает делитель частоты тактового сигнала SPI отностительно тактовой частоты системы. На платах на базе AVR доступны следующие значения делителя: 2, 4, 8, 16, 32, 64 или 128. Параметр по умолчанию – это SPI_CLOCK_DIV4 , который устанавливает частоту тактового сигнала SPI, равной четверти от частоты опорного генератора микроконтроллера (4 МГц для плат 16 МГц).

На плате Due частота опорного генератора может быть поделена на значения от 1 до 255. Значение по умолчанию – 21, что устанавливает частоту тактового сигнала на 4 МГц, как и на других платах Arduino.

Синтаксис

Параметры

  • divider : SPI_CLOCK_DIV2 , SPI_CLOCK_DIV4 , SPI_CLOCK_DIV8 , SPI_CLOCK_DIV16 , SPI_CLOCK_DIV32 , SPI_CLOCK_DIV64 или SPI_CLOCK_DIV128 (только на платах AVR);
  • slaveSelectPin : вывод ведомого устройства SS (только на Arduino Due);
  • divider : число от 1 до 255 (только на Arduino Due).

Возвращаемое значение

Описание

Эта функция не должна использоваться в новых проектах. Для настройки параметров используйте SPISettings с SPI.beginTransaction() .

Устанавливает режим данных SPI: полярность и фазу тактового сигнала. Для более подробной информации об интерфейсе SPI смотрите статью «Назад к основам: SPI (последовательный периферийный интерфейс)».

Синтаксис

Параметры

  • mode : SPI_MODE0 , SPI_MODE1 , SPI_MODE2 или SPI_MODE3 ;
  • slaveSelectPin : вывод ведомого устройства SS (только на Arduino Due).

Возвращаемое значение

Описание

Передача SPI основана на одновременных отправке и приеме: принятые данные возвращаются в receivedVal (или receivedVal16 ). В случае передачи буфера, полученные данные сохраняются в этом же месте (старые данные заменяются принятыми данными).

Синтаксис

Параметры

  • val : байт, который необходимо передать по шине;
  • val16 : переменная из двух байтов, которую необходимо передать по шине;
  • buffer : массив данных для передачи.

Возвращаемое значение

Описание

Если ваша программа осуществляет передачи SPI внутри обработчика прерывания, вывовите данную функцию, чтобы зарегистрировать номер или имя прерывания в библиотеке SPI. Это позволит SPI.beginTransaction() предотвратить конфликты использования. Обратите внимание, что прерывание, указанное при вызове usingInterrupt() будет отключено при вызове beginTransaction() и снова включено в endTransaction() .

Синтаксис

Параметры

interruptNumber : соответствующий номер прерывания.

Источник

Adblock
detector