Последовательный интерфейс SPI
SPI (Serial Peripheral Interface) – последовательный синхронный стандарт передачи данных в режиме полного дуплекса, разработанный компанией Motorola для обеспечения простого и недорогого сопряжения микроконтроллеров и периферии. SPI также иногда называют четырехпроводным (англ. four-wire) интерфейсом. SPI является синхронным протоколом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая периферия (ведомая) синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участие в передаче по SPI.
В SPI используются четыре цифровых сигнала:
В зависимости от комбинаций полярности и фазы синхроимпульсов возможны четыре режима работы SPI.
| Режим SPI | Временная диаграмма |
| Режим SPI0 Активные уровень импульсов — высокий. Сначала защёлкивание, затем сдвиг. | ![]() |
| Режим SPI1 Активные уровень импульсов — высокий. Сначала сдвиг, затем защёлкивание. | ![]() |
| Режим SPI2 Активные уровень импульсов — низкий. Сначала защёлкивание, затем сдвиг. | ![]() |
| Режим SPI3 Активные уровень импульсов — низкий. Сначала сдвиг, затем защёлкивание. | ![]() |
Мастеру приходится настраиваться на тот режим, который используется ведомым.
При обмене данными по интерфейсу SPI микроконтроллер может работать как ведущий (режим Master) либо как ведомый (режим Slave). При этом пользователь может задавать следующие параметры:
Соединение двух микроконтроллеров по структуре ведущий – ведомый по интерфейсу SPI осуществляется по следующей схеме.
Выводы SCK, CS для ведущего микроконтроллера являются выходами, а ведомого микроконтроллера – входами.
Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI, и данные начинают побитно выдаваться на вывод MOSI и соответственно поступать на вывод MOSI ведомого микроконтроллера. После выдачи последнего бита текущего байта генератор тактового сигнала останавливается с одновременной установкой в «1» флага «Конец передачи». Если поддерживаются и разрешены прерывания от модуля SPI, то генерируется запрос на прерывание. После этого ведущий микроконтроллер может начать передачу следующего байта либо, подав на вход SS ведомого напряжение уровня логической «1», перевести его в состояние ожидания.
Одновременно с передачей данных от ведущего к ведомому происходит передача и в обратном направлении, при условии, что на входе SS ведомого присутствует напряжение низкого уровня. Таким образом, в каждом цикле сдвига происходит обмен данными между устройствами. В конце каждого цикла флаг прерывания устанавливается в «1» как в ведущем микроконтроллере, так и в ведомом. Принятые байты сохраняются в приемных буферах для дальнейшего использования.
При приеме данных принятый байт должен быть прочитан из регистра данных SPI до того, как в сдвиговый регистр поступит последний бит следующего байта. В противном случае первый байт будет потерян.
Вывод SS предназначен для выбора активного ведомого устройства и в режиме Slave всегда является входом. Каждый раз, когда на вывод SS подается напряжение уровня логической «1», происходит сброс модуля SPI. Если изменение состояния этого вывода произойдет во время передачи данных, и прием, и передача немедленно прекратятся, а передаваемый и принимаемый байты будут потеряны.
Если микроконтроллер находится в режиме Master, направление передачи данных через вывод SS определяется пользователем. Если вывод сконфигурирован как выход, он работает как линия вывода общего назначения и не влияет на работу модуля SPI. Как правило, в этом случае он используется для управления выводом SS микроконтроллера, работающего в режиме Slave.
Если вывод сконфигурирован как вход, то для обеспечения нормальной работы модуля SPI на него должно быть подано напряжение высокого уровня. Подача на этот вход напряжения низкого уровня от какой-либо внешней схемы будет воспринята модулем SPI как выбор микроконтроллера в качестве ведомого (при этом ему начинают передаваться данные).
Пример использования интерфейса SPI для микроконтроллеров STM32 хорошо описан в этой статье.
Назад
Mosi miso sck что это
Данная библиотека позволяет Ардуино взаимодействовать с различными SPI-устройствами, выступая при этом в роли ведущего устройства.
Краткое введение в интерфейс SPI (Serial Peripheral Interface)
Согласно протоколу SPI, одно из взаимодействующих устройств (обычно микроконтроллер) всегда является ведущим и контролирует ведомые периферийные устройства. Как правило, все взаимодействющие устройства объединены тремя общими линиями:
Помимо перечисленных, на каждое устройство отводится отдельная линия:
Периферийное устройство (Slave) взаимодействует с ведущим (Master) тогда, когда на выводе SS присутствует низкий уровень сигнала. В противном случае данные от Master-устройства будут игнорироваться. Такая архитектура позволяет взаимодействовать с несколькими SPI-устройствами, подключенными к одной и той же шине: MISO, MOSI и SCK.
Перед тем, как отправлять данные новому SPI-устройству, необходимо выяснить о нем несколько основных моментов:
Поскольку стандарт SPI является открытым, его реализация в разных устройствах может немного отличаться. Поэтому при написании программ, особое внимание необходимо уделять даташиту того или иного устройства.
| Режим | Полярность (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 и предоставляют разработчику расширенные возможности:
В Arduino Due есть три отдельных вывода (4, 10 и 52) для управления линиями SS периферийных устройств.
Данная статья является кратким дискурсом по шине SPI и не должна восприниматься как точная техническая документация. Рассматривается только полнодуплексный вариант применения.
Общие сведения:
Несмотря на то, что интерфейс называется 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:
Подробное описание как это сделать можно посмотреть по ссылке 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
Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) — последовательный стандарт передачи данных. Предназначен для сопряжения микроконтроллеров и периферийных устройств. SPI интерфейс иногда называют четырёхпроводным интерфейсом.
Описание работы интерфейса SPI
Принцип работы SPI заключается в следующем. Данные по SPI передаются последовательно, по 1 биту. Получение и отправка данных осуществляется раздельно и не происходит в один момент времени, а осуществляется при помощи синхронизированного сигнала на специальной шине.
Шина по которой передается синхросигнал зовется шиной тактирования, а сама идея разделения заключается в том, что считывание и установка данных осуществляется по противоположным фронтам генерируемых на шине тактирования.
Такое разделение с течением времени получение и отправки данных, дает возможность использовать только один регистр. Та устройство которое управляет шиной синхроимпульсов является главным и называется «Ведущим» или «Мастером» (Master).
Главное устройство или «Master» осуществляет управление процессами передачи данных. Т.е. он определяет когда начать процесс передачи данных когда его нужно завершить и какой объем данных передать. Другие устройства которые подключаются к мастеру, называются ведомыми или «Slave«.
Наименование выводов интерфейса SPI
При двухстороннем обмене его называют полнодуплексный, в интерфейсе SPI задействованы все 4 линии:
Кодировка уровней происходит логическими «1» и «0» на шине данных (MOSI и MISO). Другими словами «1» это высокий уровень напряжения, а «0» соответственно низкий. То как выставляется уровень напряжения на шине не имеет значения, т. е. выводы передатчиков могут быть как с «открытым коллектором» там и «push-pull». Высокий уровень соответствует равен напряжению питания микросхему. Если у нас схема запитана от 5 В то и высокий уровень — 5 В, если 3.3 то соответственно высокий уровень — 3.3 В.
Линия SS необходима для установки начали и конца передачи сигнала. Этот сигнал инверсный, т.е. когда мы передает данные у нас на этой низкий уровень, когда данные не передаются то высокий. По сигналу SS мастеру можно подключаться к разным «слейвам» и использую одни и те же линии данных. Только вот к каждому «слейву» придется тянуть свою линию SS.
Название линий могу отличаться у разных производителей:
MISO: SOMI, SDO (на устройстве), DO, DON, SO, MRSR;
MOSI: SIMO, SDI (на устройстве), DI, DIN, SI, MTST;
SCLK: SCK, CLK, SPC (SPI serial port clock);
SS: nCS, CS, CSB, CSN, NSS, nSS, STE, SYNC.
Количество линий не всегда четыре, иногда их может быть и три. К примеру если передача данных осуществляется в одном направлении или используется только одна двунаправленная шина вместо двух однонаправленных. Если используется одна двунаправленная шина то одновременно передавать и принимать данные по ней не возможно, можно либо отправлять либо принимать.
Прием и передача и данных в интерфейсе SPI
Передача данных в интерфейсе SPI происходит побитно, а по противоположным уровням сигнала тактирования происходи либо установка либо чтение данных. Момент чтение данных называется latch, а момент установки shift.
Данные обычно не передаются по одному биту, обычно их посылают по 8 бит и более. По этой причине на выходе передатчика делают сдвиговый регистр, куда грузится сразу вся пачка передаваемых данных. Значение старшего или младшего бита сдвивого регистра устанавливается на шине данных в зависимости от точно что передаем вперед. А для того чтобы установить на шине последующий передаваемый бит, нужно лишь сдвинуть этот регистр.
Уровень сигнала в котором находится шина тактирования в неактивном состоянии когда у нас передача данных не происходит, называется полярностью ее обозначают CPOL. Если у нас нет передачи данных то на шине тактирования SCLK логический ноль, т.е. CPOL=0, и наоборот если высокий уровень на шине то CPOL=1.
Последовательность чередования считывания и сдвига называют фазой, обозначается как CPHA. Если по первому фронту на SCLK происходит считывание, то CPHA=0, а если по первому фронту на SCLK происходит сдвиг, то CPHA=1.
Режимы работы интерфейса SPI
Для обозначения режимов работы интерфейса SPI принято следующее соглашение:
Режимы работы SPI демонстрирует картинка ниже.
Важно отметить 1 момент, линия SS это линий которая управляет сеансом обмена, а не только линия для выбора слейва. Поэтому если вы используете только слейв то линию SS подключать нужно подключать.
AVR Урок 24. Знакомство с шиной SPI
Урок 24
Знакомство с шиной SPI
Сегодня мы начинаем знакомство с шиной SPI (Serial Peripheral Interface).
Данная шина очень широко используется в электронике. Она очень удобна, являясь синхронной и полнодуплексной, поэтому, применяется во многих схемах для общения между различными цифровыми усторйствами — датчиками, контроллерами, драйверами и прочими устройствами.
Ещё одним важнейшим фактором необходимости нашего с ней знакомства является то, что данная шина аппаратно организована в контроллерах AVR.
Мало того, хотим мы этого или не хотим, с интерфейсом SPI мы с вами общаемся уже давным-давно, как только начали первый раз прошивать наш контроллер, так как прошивается он именно посредством данного интерфейса.
Поэтому хочется познакомиться с данной шиной поближе.
Давайте откроем техническую документацию на контроллер Atmega8, откроем страницу, где изображена распиновка данного контроллера и посмотрим, что от 16 до 19 ножки и находятся выводы шины SPI
Теперь немного подробнее о данных выводах
SS (chip select) — это ножка выбора устройства. Если на ведомом устройстве на данной ножке установится низкий уровень, то данное устройство будет откликаться и обмениваться информацией по шине SPI, если высокий, то не будет.
MOSI (master output slave input) — это ножка выхода ведущего устройства и входа ведомого устройства.
MISO (master input slave output) — наоборот, выход ведомого, вход ведущего.
SCK — ножка синхронизации. Ко всем устройствам, участвующим в обмене информации по данной шине, подаются синхроимпульсы с определённой частотой.
Вот схема реализации шины SPI в контроллере Atmega8
Как в любой шине, здесь имеется ряд регистров, в которых хранится определённая информация.
Нам интересен SHIFT REGISTER, через него и происходит обмен информации. Как только на ножке синхронизации будет определённый фронт, или нисходящий или восходящий, в зависимости от настройки, данные регистры у ведомого и ведущего устройства обменяются информацией, причем не всей информацией, а только одним битом. Данные регистры сдвинутся влево и старшие биты из каждого регистра уйдут в младшие биты такого же регистра сопряженного устройства. То есть ведомый передаст свой старший бит через ножку MOSI ведущему, который его запишет в освободившийся засчет сдвига влево младший бит, а ведомый свой вытесненный засчет сдвига передаст старший бит через ножку MISO в младший бит ведущего. Вот так и идёт обмен, то есть за 8 полных циклов тактирования они полностью обменяются байтами
Как только все 8 бит одного байта информации передадутся, определённый регистр нам просигнализирует о том, что данный процесс закончен. Вернее, определённый бит определённого регистра.
Также в блок-схеме мы видим делитель, на вход которого поступают тактовые импульсы и уже потом разделённые на определенное значение поступают по цепочке на ножку SCK и уже оттуда подаются на ведомое устройство на одноимённую ножку. Этим и обеспечивается синхронность работы устройств. Частота тактовых импульсов выбирается из наименьшей поддерживаемой всеми устройствами, участвующими в обмене.
Я говорю во множественном числе, так как может быть не только два устройства в данной цепи. Как это обеспечивается при условии, что у устройств нет никаких адресов, я сейчас и расскажу.
Существует несколько способов обмена информацией между несколькими устройствами, то есть когда на одно ведущее устройство приходится несколько ведомых. Мы рассмотрим два самых распространённых из них.
Первый способ — радиальный (нажмите на картинку для увеличения изображения)
Здесь мастер направляет данные к определённому устройству, включая на ножке SS логический 0. При данном способе возможно выбрать только одно устройство, также потребуются несколько свободных ножек портов контроллера.
Есть ещё один интересный способ — кольцевой или каскадный (нажмите на картинку для увеличения изображения)
Здесь мы видим, что ножки выбора все запараллелены и обмен идёт по кругу. Тем самым скорость падает, засчёт того, что увеличивается круг передачи, но зато экономятся лапки портов.
Всё это мы в очередных занятиях изучим подробнее, когда будем использовать определённые устройства в наших проектах.
Ну, вроде со схемотехникой передачи данных по шине SPI мы разобрались.
Теперь разберёмся, как же данным процессом управлять на уровне аппаратных регистров контроллера AVR.
Данные регистры мы видим в блок-схеме выше на странице.
У Atmega8 существуют следующие регистры для обслуживания шины SPI.
SPDR (SPI Data Register) — регистр данных, в блок-схеме это DATA BUFFER. В этот регистр мы будем заносить байт для последующей его передачи на ведомое устройство и из него же будем читать байт информации, пришедший с ведомого устройства. Также не обязательно что у нас контроллер будет ведущим устройством. Впоследствии мы соберём схему из двух контроллеров, один из которых будет ведомым. Так что именно в этом регистре будет находиться байт и для отправки и для приёма.
SPCR (SPI Control Register) — управляющий регистр
Данный регистр включает в себя следующие биты:
SPIE (SPI Interrupt Enable) — бит, который разрешает прерывания.
SPE (SPI Enable) — бит, включающий шину SPI.
DORD (Data Order) — бит, устанавливающий порядок отправки бит, Если он установлен в 1, то первым отправляется младший бит, если в 0 — старший.
MSTR (Master/Slave Select) — бит, который назначает устройство ведущим либо ведомым. При установке данного бита 1 устройство будет ведущим.
CPOL (Clock Polarity) — полярность синхронизации, определяет, при каком фронте синхронизирующего импульса будет инициироваться режим ожидания
Если данный бит в 1, то режим ожидания будет у нас при восходящем фронте, а если в 0, то при нисходящем.
CPHA (Clock Phase) — бит, отвечающий за фазу тактирования, то есть по какому именно фронту будет осуществляться передача бита.
Посмотрим диаграммы передачи данных в зависимости от установки CPOL и CPHA
Вот такая вот интересная зависимость. Порой мы иногда видим в технических характеристиках какого-нибудь устройства, что оно, к примеру, может работать в режиме SPI 0:0 и SPI 1:1, вот это как раз и касается настройки этих битов.
SPR1, SPR0 (SPI Clock Rate Select) — это биты, отвечающие за значение делителя частоты синхронизации, работают совместно с битом SPI2X, находящемся в регистре статуса. Он также управляющий, так как восьми бит в управляющем регистре под все настройки не хватило, а в статусном много свободных.
SPSR (SPI Status Register) — статусный регистр
SPI2X (Double SPI Speed Bit) — бит, удваивающий скорость, работающий совместно с битами SPR1 и SPR0 управляющего регистра.
Посмотрим зависимость частоты от данных трёх битов
SPIF (SPI Interrupt Flag) — Флаг прерывания. Установку данного бита в единицу мы ждём. когда принимаем байт. Как только байт от другого устройства появится полностью у нас в буфере, то данный флаг установится. Данный флаг работает только в случае установки бита, разрешающего прерывания, а также разрешения глобальных прерываний.
WCOL (Write COLlision Flag) — флаг конфликта, или коллизий, установится в том случае, если во время передачи данных будет конфликт битов, если во время передачи данных выполнится попытка записи в регистр данных.
Ну теперь мы, можно сказать, немного познакомились с интерфейсом SPI.
В следующем занятии мы уже попытаемся данную шину использовать на практике, подключив к нашему контроллеру какое-нибдуь ведомое устройство.
Купить программатор можно здесь (продавец надёжный) USBASP USBISP 2.0
Смотреть ВИДЕОУРОК (нажмите на картинку)



























