Последовательный интерфейс spi. SPI Arduino – подключение устройств к ардуино

Синхронный последовательный интерфейс SPI предназначен для ввода- вывода данных в интерфейсах "точка-точка" с одним ведущим (SPI-master) и одним ведомым (SPI-slave) устройством (рис. 1.24). Схема управления SPI- master формирует тактовые импульсы SCK, по которым одновременно производится передача сигналов на выходе MOSI и прием сигналов на входе MISO. Эти же тактовые импульсы SCK, поступая в SPI-slave, управляют приемом сигналов на его входе MOSI и формированием сигналов на его выходе MISO. Раздельные сигнальные цепи MOSI и MISO позволяют легко реализовать полнодуплексный режим обмена данными.

Форматы данных, параметры сигналов, временные характеристики и т.п. в интерфейсе не регламентируются, например, скорость обмена данными определяется только частотой тактовых импульсов SCK, формируемых SPI- master. Максимальное расстояние зависит от уровня искажения сигналов в линиях связи, предполагается, что надежный обмен данными возможен при расстояниях до нескольких метров.

По-существу, полноценным интерфейсом даже для физического уровня не является. Фактически, SPI реализует стандартную процедуру ввода-вывода данных в регистрах сдвига, никаких алгоритмов контроля работы, контроля передаваемых данных не предусмотрено. Все необходимые процедуры контроля должен выполнять SPI-master. Это, с одной стороны, требует применения дополнительных средств контроля, а с другой стороны, максимально упрощает средства реализации самого интерфейса SPI. SPI- slave – это стандартный регистр сдвига с требуемым числом разрядов данных.

Например, микроконтроллеры семейства AVR фирмы ATMEL поддерживают ввод-вывод данных в режиме и SPI-master, и SPI-slave. Стандартный цикл обмена предполагает одновременную передачу в обоих направлениях по одному байту данных (рис. 1.24). При передаче многобайтовых сообщений SPI-slave должен содержать регистр сдвига соответствующей разрядности, а SPI-master должен производить управление обменом требуемой последовательности байтов данных, обрабатывая каждый байт после очередного стандартного цикла работы интерфейса и обеспечивая запуск следующего стандартного цикла обмена.

применяется не только для обмена данными между микроконтроллерами, но и для сопряжения микроконтроллеров с внешними АЦП (ADC) и ЦАП (DAC), микросхемами памяти – SRAM, FRAM, SEERAM и многими другими устройствами. Благодаря последовательному формату данных и простой логической организации интерфейса SPI эти микросхемы производятся в компактных 8 – 16 выводных корпусах. В табл. 1.6 приведены примеры микросхем различного функционального назначения и разных производителей с интерфейсом SPI. Эти примеры показывают, что последовательный формат интерфейса позволяет существенно сократить требуемое число линий ввода-вывода.

Таблица 1.6

Тип микросхемы

Основные параметры

Тип корпуса

Производитель

24-Bit, Delta-Sigma, 15 Гц

24-Bit, Delta-Sigma, 41 кГц

16-Bit, SAR, 100 кГц

16-Bit, PulSAR, 500 кГц

12-Bit, U-out, 2.5 мкс

16-Bit, U-out, 10 мкс

14-Bit, I-out, 0.04 мкс

12-Bit, I-out, 0.6 мкс

16-Bit, U-out, 1 мкс

www.maxim- ic.com

Тип микросхемы

Основные параметры

Тип корпуса

Производитель

16 кБит, 1 трлн

4 кБит, неогр.

64 кБит, неогр.

256K, 32768×8, 0.1млн Cycles

8К, 1024×8, 0.1млн Cycles

16K, 8192×8, 0.1млн Cycles

128K, 16384×8, 0.1млн Cycles

256K, 32768×8, 0.1млн Cycles

Termosensor

13-bit, -40 to +150 C o (±0.5C o)

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

Например, интерфейс SPI может оказаться полезным для считывания информации о состоянии большого числа двухпозиционных датчиков или для ввода многобитовых данных, поступающих в параллельном формате. Для этих целей удобно использовать отдельные регистры с параллельной записью и последовательным считыванием (8-Bit Parallel-In/Serial-Out Shift Register), например CD74HCT166 (рис. 1.25).

Схема подключения шестнадцати двухпозиционных датчиков (S1 – S16) через SPI-интерфейс микроконтроллера показана на рис. 1.26. Следует отметить, что перед стартом работы SPI-интерфейса необходимо сформировать сигнал записи информации в регистры с параллельных входов D0-D7. Для 38 этого можно использовать один из выходов микроконтроллера, в данном примере PC0.

Рис. 1.25. Функциональная схема регистра CD74HCT166

Рис. 1.26. Подключение двухпозиционных датчиков к SPI-интерфейсу

Рис. 1.27. Подключение шестиразрядного индикатора к SPI-интерфейсу

Применяя регистры с последовательной записью и параллельной выдачей информации (8-Bit Serial-In, Parallel-Out Shift Register) – SN74HC595 , SPI-интерфейс можно использовать и для многобайтовой параллельной выдачи информации. В качестве примера на рис. 1.27 приведена схема подключения шестиразрядного семисегментного индикатора к микроконтроллеру. В отличие от предыдущей схемы, сигнал параллельного вывода (PB1) необходимо сформировать после окончания передачи данных интерфейсом SPI средствами, выходящими за рамки интерфейса. Например, алгоритм взаимодействия с интерфейсом должен предусматривать контроль количества переданных байтов данных, а после завершения передачи последнего байта необходимо дополнительно передать сигнал параллельного вывода.

Введение

SPI (3-wire) - популярный интерфейс для последовательного обмена данными между микросхемами. Интерфейс SPI, наряду с I 2 C, относится к самым широко-используемым интерфейсам для соединения микросхем. Изначально он был придуман компанией Motorola, а в настоящее время используется в продукции многих производителей. Его наименование является аббревиатурой от "Serial Peripheral Bus", что отражает его предназначение - шина для подключения внешних устройств. Шина SPI организована по принципу "ведущий-подчиненный". В качестве ведущего шины обычно выступает микроконтроллер, но им также может быть программируемая логика, DSP-контроллер или специализированная ИС. Подключенные к ведущему шины внешние устройства образуют подчиненных шины. В их роли выступают различного рода микросхемы, в т.ч. запоминающие устройства (EEPROM, Flash-память, SRAM), часы реального времени (RTC), АЦП/ЦАП, цифровые потенциометры, специализированные контроллеры и др.

Главным составным блоком интерфейса SPI является обычный сдвиговый регистр, сигналы синхронизации и ввода/вывода битового потока которого и образуют интерфейсные сигналы. Таким образом, протокол SPI правильнее назвать не протоколом передачи данных, а протоколом обмена данными между двумя сдвиговыми регистрами, каждый из которых одновременно выполняет и функцию приемника, и функцию передатчика. Непременным условием передачи данных по шине SPI является генерация сигнала синхронизации шины. Этот сигнал имеет право генерировать только ведущий шины и от этого сигнала полностью зависит работа подчиненного шины.

Электрическое подключение

Существует три типа подключения к шине SPI, в каждом из которых участвуют четыре сигнала (их основное и альтернативные обозначения см. в табл. 1). Самое простое подключение, в котором участвуют только две микросхемы, показано на рисунке 1. Здесь, ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных. Представленную схему можно упростить исключением линии MISO, если используемая подчиненная ИС не предусматривает ответную передачу данных или в ней нет потребности. Одностороннюю передачу данных можно встретить у таких микросхем как ЦАП, цифровые потенциометры, программируемые усилители и драйверы. Таким образом, рассматриваемый вариант подключения подчиненной ИС требует 3 или 4 линии связи. Чтобы подчиненная ИС принимала и передавала данные, помимо наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние. В противном случае, подчиненная ИС будет неактивна. Когда используется только одна внешняя ИС, может возникнуть соблазн исключения и линии SS за счет жесткой установки низкого уровня на входе выбора подчиненной микросхемы. Такое решение крайне нежелательно и может привести к сбоям или вообще невозможности передачи данных, т.к. вход выбора микросхемы служит для перевода ИС в её исходное состояние и иногда инициирует вывод первого бита данных.


Рис. 1. Простейшее подключение к шине SPI

При необходимости подключения к шине SPI нескольких микросхем используется либо независимое (параллельное) подключение (рис. 2), либо каскадное (последовательное) (рис. 3). Независимое подключение более распространенное, т.к. достигается при использовании любых SPI-совместимых микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое состояние, задает, с какой подчиненной ИС он будет обмениваться данными. Главным недостатком такого подключения является необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3+n, где n-количество подчиненных микросхем). Каскадное включение избавлено от этого недостатка, т.к. здесь из нескольких микросхем образуется один большой сдвиговый регистр. Для этого выход передачи данных одной ИС соединяется со входом приема данных другой, как показано на рисунке 3. Входы выбора микросхем здесь соединены параллельно и, таким образом, общее число линий связи сохранено равным 4. Однако использование каскадного подключения возможно только в том случае, если его поддержка указана в документации на используемые микросхемы. Чтобы выяснить это, важно знать, что такое подключение по-английски называется "daisy-chaining".


Рис. 2. Независимое подключение к шине SPI


Рис. 3. Каскадное подключение к шине SPI

Протокол передачи

Протокол передачи по интерфейсу SPI предельно прост и, по сути, идентичен логике работы сдвигового регистра, которая заключается в выполнении операции сдвига и, соответственно, побитного ввода и вывода данных по определенным фронтам сигнала синхронизации. Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. Это необходимо для гарантирования выборки данных после надежного их установления. Если к этому учесть, что в качестве первого фронта в цикле передачи может выступать нарастающий или падающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:

  • CPOL - исходный уровень сигнала синхронизации (если CPOL=0, то линия синхронизации до начала цикла передачи и после его окончания имеет низкий уровень (т.е. первый фронт нарастающий, а последний - падающий), иначе, если CPOL=1, - высокий (т.е. первый фронт падающий, а последний - нарастающий));
  • CPHA - фаза синхронизации; от этого параметра зависит, в какой последовательности выполняется установка и выборка данных (если CPHA=0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем, по заднему фронту, - установка данных; если же CPHA=1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка - по заднему). Информация по режимам SPI обобщена в таблице 2.

Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми, поэтому, перед выбором подчиненных микросхем важно уточнить, какие режимы поддерживаются ведущим шины. Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому, к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно.

Cравнение с шиной I 2 C

Как уже упоминалось, для стыковки микросхем не меньшей популярностью пользуется 2-проводная последовательная шина I 2 C . Ниже можно ознакомиться с преимуществами, которая дает та или иная последовательная шина.

Преимущества шины SPI Преимущества шины I2C
Предельная простота протокола передачи на физическом уровне обуславливает высокую надежность и быстродействие передачи. Предельное быстродействие шины SPI измеряется десятками мегагерц и, поэтому, она идеальна для потоковой передачи больших объемов данных и широко используется в высокоскоростных ЦАП/АЦП, драйверах светодиодных дисплеев и микросхемах памяти Шина I 2 C остается двухпроводной, независимо от количества подключенной к ней микросхем.
Все линии шины SPI являются однонаправленными, что существенно упрощает решение задачи преобразования уровней и гальванической изоляции микросхем Возможность мультимастерной работы, когда к шине подключено несколько ведущих микросхем.
Простота программной реализации протокола SPI. Протокол I2C является более стандартизованным, поэтому, пользователь I2C-микросхем более защищен от проблем несовместимости выбранных компонентов.

Производные и совместимые протоколы

  • MICROWIRE.

    Протокол MICROWIRE компании National Semiconductor полностью идентичен протоколу SPI в режиме 0 (CPOL = 0, CPHA = 0).

  • 3-проводной интерфейс компании Maxim

    Отличие этого интерфейса состоит в том, что вместо полнодуплексной передачи по двум однонаправленным линиям здесь выполняется полудуплексная передача по одной двунаправленной линии DQ.

  • QSPI

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

Кроме того, интерфейс SPI является основой для построения ряда специализированных интерфейсов, в т.ч. отладочный интерфейс JTAG и интерфейсы карт Flash-памяти, в т.ч. SD и MMC.

Табл. 1. Электрические сигналы шины SPI

Ведущий шины Подчиненный шины
Основное обозначение Альтернативное обозначение Описание Основное обозначение Альтернативное обозначение Описание
MOSI DO, SDO, DOUT MOSI DI, SDI, DIN
MISO DI, SDI, DIN Вход последовательного приема данных MISO DO, SDO, DOUT Выход последовательной передачи данных
SCLK DCLOCK, CLK, SCK Выход синхронизации передачи данных SCLK DCLOCK, CLK, SCK Вход синхронизации приема данных
SS CS Выход выбора подчиненного (выбор микросхемы) SS CS Вход выбора подчиненного (выбор микросхемы)

SPI (Serial Peripheral Bus ) - последовательный периферийный протокол обмена. Этот прокол был разработан компанией Motorola , но в настоящее время используется многими производителями. Он предназначен для связи микроконтроллеров между собой, а также со всевозможной периферией: датчиками, AЦП, микросхемами памяти, часами. Но все же наиболее частое применение SPI – это запись программы в память микроконтроллера. В микроконтроллерах AVR c помощью SPI можно прошить микроконтроллер не выпаивая из платы, такой способ прошивки называется ISP(In System Programming) . Хотя названия SPI и ISP очень созвучны, это не одно и то же, в AVR SPI используется как физический уровень ISP , то есть используются линии SPI для передачи данных, но сам протокол(программный уровень) отличается.

Для передачи данных в SPI используется три линии:

MISO(Master Input Slave Output) – по этой линии Master(ведущий) принимает данные от Slave(ведомого).

MOSI(Master Output Slave Input) – по этой линии Master отправляет данные Slave.

SCK(Serial Clock) – служит для передачи тактового сигнала ведомому устройству.

Также используется линия SS(Slave Select) , которая определяет устройство с которым Master будет обмениваться данными.

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


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

Физическая реализацию SPI , представляет собой два соединённых вместе сдвиговых регистра.


В зависимости от того по какому логическому уровню сигнала SCK , происходит синхронизация Master и Slave и по какому фронту происходит захват и сдвиг данных, возможны 4 режима SPI .

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


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

SPI - синхронный интерфейс, то есть для того чтобы получить какие-нибудь данные от Slave , Master должен что-нибудь отправить. Вроде всё понятно, но что если Master отправляет один байт, а Slave должен вернуть ему два? В таком случае Master должен отправить ему что-нибудь 2 раза, например 0х00.
//отправляем команду, в ответ должно прийти два байта Spi_Master_Transmit(chx); //отправляем что-нибудь для того чтобы принять первый байт Spi_Master_Transmit(0X00); touch_x = SPDR; touch_x <<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
На этом всё, выше пример кода взятый из рабочего проекта.

SPI - Serial Peripheral Interface - последовательный

периферийный интерфейс

SPI - последовательный синхронный стандарт передачи данных между микросхемами в режиме полного дуплекса.

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

Интерфейс SPI, наряду с I2C, относится к самым широкоиспользуемым интерфейсам для соединения микросхем. Его наименование является аббревиатурой от “Serial Peripheral Interface” (англ. , SPI bus -

шина SPI), что отражает его предназначение - шина для подключения внешних устройств. Шина SPI организована по принципу "ведущийподчиненный". В качестве ведущего шины обычно выступает микроконтроллер, но им также может быть программируемая логика, DSPконтроллер или специализированная ИС. Подключенные к ведущему шины внешние устройства образуют подчиненных шины. В их роли выступают различного рода микросхемы, в т.ч. запоминающие устройства (EEPROM, Flash-память, SRAM), часы реального времени (RTC), АЦП/ЦАП, цифровые потенциометры, специализированные контроллеры и др.

Главным составным блоком интерфейса SPI является обычный сдвиговый регистр, сигналы синхронизации и ввода/вывода битового потока которого и образуют интерфейсные сигналы. Таким образом, протокол SPI правильнее назвать не протоколом передачи данных, а протоколом обмена данными между двумя сдвиговыми регистрами, каждый из которых одновременно выполняет и функцию приемника, и функцию передатчика.

1. Электрическое подключение

В отличие от стандартного последовательного порта (англ. standard serial port ), SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая периферия (ведомая) синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (англ.chip select ) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участие

в передаче по SPI.

В SPI используются четыре цифровых сигнала:

MOSI (англ. Master Out Slave In )- выход ведущего устройства (альтернативное обозначение DO, SDO, DOUT) , вход ведомого устройства последовательного приема данных (альтернативное обозначение DI, SDI, DIN). Служит для передачи данных от ведущего устройства ведомому.

MISO (англ. Master In Slave Out ) - вход ведущего устройства последовательного приема данных (альтернативное обозначение DI, SDI, DIN), выход ведомого устройства последовательной передачи данных (альтернативное обозначение DO, SDO, DOUT). Служит для передачи данных от ведомого устройства ведущему.

SCLK (англ. Serial Clock ) - последовательный тактовый сигнал (альтернативное обозначение DCLOCK, CLK, SCK). Служит для передачи тактового сигнала для ведомых устройств.

CS или SS - выбор микросхемы, выбор ведомого устройства

(англ. Chip Select, Slave Select).

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

Рис. 1. Простейшее подключение к шине SPI

Здесь, ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных. Представленную схему можно упростить исключением линии MISO, если используемая подчиненная ИС не предусматривает ответную передачу данных или в ней нет потребности. Одностороннюю передачу данных можно встретить у таких микросхем как ЦАП, цифровые потенциометры, программируемые усилители и драйверы. Таким образом, рассматриваемый вариант подключения подчиненной ИС требует 3 или 4 линии связи. Чтобы подчиненная ИС принимала и передавала данные, помимо наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние. В противном случае, подчиненная ИС будет неактивна. Когда используется только одна внешняя ИС, может возникнуть соблазн исключения и линии SS за счет жесткой установки низкого уровня на входе выбора подчиненной микросхемы. Такое решение крайне нежелательно и может привести к сбоям или вообще невозможности передачи данных, т.к. вход выбора микросхемы служит для перевода ИС в её исходное состояние и иногда инициирует вывод первого бита данных.

При необходимости подключения к шине SPI нескольких микросхем используется либо независимое (параллельное) подключение (рис. 2), либо каскадное (последовательное) (рис. 3).

Рис. 2. Независимое подключение к шине SPI

Рис. 3. Каскадное подключение к шине SPI

Независимое подключение более распространенное, т.к. достигается при использовании любых SPI-совместимых микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое состояние, задает, с какой подчиненной ИС он будет обмениваться данными. Главным недостатком такого подключения является необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3+n, где n-количество подчиненных микросхем). Каскадное включение избавлено от этого недостатка, т.к. здесь из

нескольких микросхем образуется один большой сдвиговый регистр. Для этого выход передачи данных одной ИС соединяется со входом приема данных другой, как показано на рисунке 3. Входы выбора микросхем здесь соединены параллельно и, таким образом, общее число линий связи сохранено равным 4. Однако использование каскадного подключения возможно только в том случае, если его поддержка указана в документации на используемые микросхемы. Чтобы выяснить это, важно знать, что такое подключение по-английски называется "daisy-chaining".

2. Протокол передачи

Протокол передачи по интерфейсу SPI предельно прост и, по сути, идентичен логике работы сдвигового регистра, которая заключается в выполнении операции сдвига и, соответственно, побитного ввода и вывода данных по определенным фронтам сигнала синхронизации. Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. Это необходимо для гарантирования выборки данных после надежного их установления. Если к этому учесть, что в качестве первого фронта в цикле передачи может выступать нарастающий или падающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:

CPOL - исходный уровень сигнала синхронизации (если CPOL=0, то линия синхронизации до начала цикла передачи и после его окончания имеет низкий уровень (т.е. первый фронт нарастающий, а последний - падающий), иначе, если CPOL=1, - высокий (т.е. первый фронт падающий, а последний - нарастающий));

CPHA - фаза синхронизации; от этого параметра зависит, в какой последовательности выполняется установка и выборка данных (если CPHA=0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем, по заднему фронту, - установка

данных; если же CPHA=1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка - по заднему).

Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми, поэтому, перед выбором подчиненных микросхем важно уточнить, какие режимы поддерживаются ведущим шины. Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому, к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно.

Табл. 1. Режимы SPI

Временная

диаграмма

синхрониза

3. Cравнение с шиной I2 C

Как уже упоминалось, для стыковки микросхем не меньшей популярностью пользуется 2-проводная последовательная шина I2 C. Ниже можно ознакомиться с преимуществами, которая дает та или иная последовательная шина.

Преимущества шины SPI

Преимущества шины I2C

Предельная простота протокола

передачи на физическом уровне

обуславливает высокую надежность и

быстродействие передачи. Предельное

быстродействие шины SPI измеряется

Шина I2 C остается двухпроводной,

десятками мегагерц и, поэтому, она

независимо от количества

идеальна для потоковой передачи

подключенной к ней микросхем.

больших объемов данных и широко

используется в высокоскоростных

ЦАП/АЦП, драйверах светодиодных

дисплеев и микросхемах памяти

Все линии шины SPI являются

однонаправленными, что существенно

Возможность мультимастерной

упрощает решение задачи

работы, когда к шине подключено

преобразования уровней и

несколько ведущих микросхем.

гальванической изоляции микросхем

Протокол I2C является более

стандартизованным, поэтому,

Простота программной реализации

пользователь I2C-микросхем более

протокола SPI.

защищен от проблем

несовместимости выбранных

компонентов.

4. Производные и совместимые протоколы

MICROWIRE.

Протокол MICROWIRE компании National Semiconductor полностью идентичен протоколу SPI в режиме 0 (CPOL = 0, CPHA = 0).

3-проводной интерфейс компании Maxim

Отличие этого интерфейса состоит в том, что вместо полнодуплексной передачи по двум однонаправленным линиям здесь выполняется полудуплексная передача по одной двунаправленной линии DQ.

QSPI

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

Кроме того, интерфейс SPI является основой для построения ряда специализированных интерфейсов, в т.ч. отладочный интерфейс JTAG и интерфейсы карт Flash-памяти, в т.ч. SD и MMC.

Инструкция

SPI - Serial Peripheral Interface или "Последовательный периферийный интерфейс" - это синхронный протокол передачи для сопряжения ведущего устройства (Master) с периферийными устройствами (Slave). Ведущим устройством часто является . Связь между устройствами осуществляется по четырём проводам, поэтому SPI иногда называют "четырёхпроводной интерфейс". Вот эти шины:
MOSI (Master Out Slave In) - линия передачи данных от ведущего к ведомым устройствам;
MISO (Master In Slave Out) - линия передачи от ведомого к ведущему устройству;
SCLK (Serial Clock) - тактовые импульсы синхронизации, генерируемые ведущим устройством;
SS (Slave Select) - линия выбора ведомого устройства; когда на линии "0", ведомое устройство "понимает", что сейчас обращаются к нему.
Существует четыре режима передачи данных (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), обусловленные сочетанием полярности тактовых импульсов (работаем по уровню HIGH или LOW), Clock Polarity, CPOL , и фазой тактовых импульсов (синхронизация по переднему или заднему фронту тактового импульса), Clock Phase, CPHA .
На рисунке показаны два варианта подключения устройств по протоколу SPI: независимое и каскадное. При независимом подключении к шине SPI ведущее устройство обращается к каждому ведомому устройству индивидуально. При каскадном - устройства срабатывают поочерёдно, каскадом.

В Arduino шины интерфейса SPI находятся на определённых портах. У каждой платы своё соответствие выводов. Для удобства выводы продублированы и вынесены также на отдельный разъём ICSP (In Circuit Serial Programming, устройства, включённого в цепь, по последовательному протоколу). Обратите внимание, что на разъёме ICSP отсутствует пин выбора ведомого - SS, т.к. подразумевается, что Arduino будет использоваться как ведущее устройство в сети. Но при необходимости вы можете назначить любой вывод Ардуино в качестве SS.
На рисунке приведено стандартное соответствие выводов шинам SPI для Arduino UNO и Nano.

Для Arduino написана специальная , которая реализует протокол SPI. Подключается она так: в начале программы добавляем #include SPI.h
Чтобы начать работу по протоколу SPI, нужно задать настройки и затем инициализировать протокол с помощью процедуры SPI.beginTransaction(). Можно выполнить это одной инструкцией: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)) .
Это значит, что мы инициализируем протокол SPI на частоте 14 МГц, передача данных идёт, начиная с MSB (наиболее значимого бита), в режиме "0".
После инициализации выбираем ведомое устройство, переводя соответствующий пин SS в состояние LOW.
Затем передаём ведомому устройству данные командой SPI.transfer().
После передачи возвращаем SS в состояние HIGH.
Работа с протоколом завершается командой SPI.endTransaction(). Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.

Рассмотрим практическое применение интерфейса SPI. Будем зажигать светодиоды, управляя 8-битным сдвиговым регистром по шине SPI. Подключим к Arduino регистр 74HC595. К каждому из 8-ми выходов подключим по светодиоду (через ограничительный резистор). Схема приводится на рисунке.

Напишем такой скетч.
Сначала подключим библиотеку SPI и инициализируем интерфейс SPI. Определим пин 8 как пин выбора ведомого устройства. Очистим сдвиговый регистр, послав в него значение "0". Инициализируем последовательный порт.
Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод - подаём двоичное число 00000001, чтобы второй - 00000010, чтобы третий - 00000100, и т.д. Эти двоичные числа в переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями от 0 до 7.
Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа "double", поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в мониторе последовательного порта выводятся значения, которые получаются при этой операции: единичка бежит по разрядам - светодиоды загораются волной.



 

Пожалуйста, поделитесь этим материалом в социальных сетях, если он оказался полезен!