что такое mosi и miso
Последовательный интерфейс 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 хорошо описан в этой статье.
Назад
Последовательный периферийный интерфейс 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
Смотреть ВИДЕОУРОК (нажмите на картинку)
Использование интерфейса SPI в Arduino – полное руководство
Современные микроконтроллеры используют много различных протоколов для взаимодействия с различными датчиками и периферийными устройствами. Одними из часто используемых протоколов проводной и беспроводной связи являются протоколы последовательной связи (Serial Communication). Последовательная связь – это процесс передачи одного бита за другим с течением времени, последовательно, по каналу связи или шине. Наиболее известными протоколами последовательной связи в настоящее время являются UART, CAN, USB, I2C и SPI.
В этой статье мы рассмотрим протокол (интерфейс) SPI и как его использовать в плате Arduino. Мы будем использовать протокол SPI для связи между двумя платами Arduino. Одна из плат Arduino будет выступать в качестве ведущей (Master), а другая – в качестве ведомой (Slave). К обоим платам Arduino будут кнопки и светодиоды. Чтобы продемонстрировать возможности связи по протоколу SPI между двумя платами Arduino мы будем управлять светодиодом на ведущей стороне при помощи нажатия кнопки на ведомой стороне и наоборот – все это мы будем осуществлять с помощью протокола последовательной связи SPI.
Что такое SPI
SPI расшифровывается как Serial Peripheral Interface и переводится как последовательный интерфейс (периферийных устройств), а по своей сути он является протоколом последовательной связи. Интерфейс SPI был разработан в компании Motorola в 1970 г. Интерфейс SPI имеет полное дуплексное соединение, что означает что данные передаются и принимаются одновременно. То есть ведущий (master) может передавать данные ведомому (slave), а ведомый одновременно с этим может передавать данные ведущему. SPI является протоколом синхронной последовательной связи, то есть ему для работы необходима синхронизация всех устройств. Ранее использование данного интерфейса на нашем сайте мы рассматривали при подключении графического ЖК дисплея Nokia 5110 к плате Arduino.
Принципы работы интерфейса SPI
Для работы по принципу ведущий/ведомый (master/Slave) протокол SPI использует 4 линии (провода). В этом протоколе ведущий всегда один, а ведомых может быть несколько. В качестве ведущего устройства обычно выступает микроконтроллер, а в качестве ведомых устройств могут выступать микроконтроллеры, датчики, АЦП, ЦАП, ЖК дисплеи и т.д.
На следующем рисунке показан принцип работы протокола SPI с одним ведущим (Master) и одним ведомым (Slave).
SPI интерфейс для своей работы использует 4 линии – MISO, MOSI, SS, and CLK. Их назначение следующее:
На следующем рисунке показан принцип работы протокола SPI с одним ведущим (Master) и несколькими ведомыми (Slave).
Чтобы начать связь (взаимодействие) между ведущим и ведомым нам необходимо установить на контакте ведомого Slave Select (SS) напряжение низкого уровня чтобы он мог взаимодействовать с ведущим. Когда на этом контакте напряжение высокого уровня (high) ведомый игнорирует ведущего. Это позволяет иметь множество ведомых устройств, работающих по протоколу SPI, использующих одни и те же (общие) линии MISO, MOSI и CLK ведущего устройства. Как вы можете видеть из представленного рисунка для 4-х ведомых устройств линии SCLK, MISO, MOSI общие для соединения с ведущим, а линии (контакты) SS каждого ведомого устройства подключены к отдельным контактам SS (SS1, SS2, SS3, SS4) ведущего устройства. При помощи установки на требуемом контакте SS напряжения низкого уровня (LOW) ведущий (master) может взаимодействовать с нужным ему ведомым (slave).
Контакты SPI в плате Arduino Uno
На следующем рисунке красным прямоугольником отмечены контакты, которые могут быть использованы в плате Arduino Uno для связи по протоколу SPI.
| Линия интерфейса SPI | Контакт Arduino Uno |
| MOSI | 11 или ICSP-4 |
| MISO | 12 или ICSP-1 |
| SCK | 13 или ICSP-3 |
| SS | 10 |
С контактами разобрались, двигаемся дальше.
Использование интерфейса SPI в Arduino
Перед тем как начать обмен данными между двумя платами Arduino по протоколу SPI давайте рассмотрим основные принципы работы с библиотекой SPI (SPI library) в Arduino IDE.
1. SPI.begin()
Инициализирует шину SPI при помощи установки режимов работы контактов SCK, MOSI и SS на вывод данных, подачи на контакты SCK и MOSI напряжения низкого уровня (low), а на контакт SS – напряжения высокого уровня (high).
2. SPI.setClockDivider(divider)
Используется для установки делителя (коэффициента деления) для сигнала синхронизации SPI по отношению к тактовой частоте микроконтроллера в плате Arduino. Можно использовать делители 2, 4, 8, 16, 32, 64 или 128.
• SPI_CLOCK_DIV2
• SPI_CLOCK_DIV4
• SPI_CLOCK_DIV8
• SPI_CLOCK_DIV16
• SPI_CLOCK_DIV32
• SPI_CLOCK_DIV64
• SPI_CLOCK_DIV128
3. SPI.attachInterrupt(handler)
Включает режим прерываний в ведомом (slave) устройстве. Прерывание будет возникать каждый раз, когда ведомое устройство будет принимать данные от ведущего (master) устройства.
4. SPI.transfer(val)
Эта функция используется для одновременного приема и передачи данных между ведущим и ведомым.
Необходимые компоненты
Схема проекта
Схема проекта для последовательной связи между двумя платами Arduino по протоколу SPI представлена на следующем рисунке.

Объяснение программы для Arduino
Нам будут необходимы две программы: одна – для ведущей платы Arduino, а другая – для ведомой платы Arduino. Коды обоих программ приведены в конце статьи, здесь же мы кратко рассмотрим их основные фрагменты.
Программа для ведущей (Master) платы Arduino
1. Первым делом в программе нам необходимо подключить библиотеку SPI чтобы получить возможность использования функций этого протокола.























