Spi интерфейс что это
Spi интерфейс что это
Данная библиотека позволяет Ардуино взаимодействовать с различными 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 периферийных устройств.
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
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 и Arduino
Изучаем интерфейс SPI и подключаем к Arduino сдвиговый регистр, к которому мы будем обращаться по этому протоколу для управления светодиодами.
Инструкция по работе Arduino с интерфейсом SPI
1 Описание последовательного интерфейса SPI
SPI – Serial Peripheral Interface или «Последовательный периферийный интерфейс» – это синхронный протокол передачи данных для сопряжения ведущего устройства (Master) с периферийными устройствами (Slave). Ведущим устройством часто является микроконтроллер. Связь между устройствами осуществляется по четырём проводам, поэтому SPI иногда называют «четырёхпроводной интерфейс». Вот эти шины:
Название | Назначение шины 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. В последнем столбце таблицы приведены поясняющие иллюстрации. На них Sample обозначены моменты, когда данные на линии должны быть готовы и считываются устройствами. Буквой Z отмечено, что состояние данных на линии неизвестно или не важно.
Виды подключения устройств для работы по интерфейсу SPI: независимое и каскадное
2 Реализация интерфейса SPI на платах семейства Arduino
На рисунке приведено стандартное соответствие выводов шинам SPI для Arduino UNO и Nano.
Реализация интерфейса SPI на платах Arduino UNO и Arduino Nano
3 Стандартная библиотека для работы по интерфейсу SPI
Временная диаграмма работы интерфейса SPI
Работа с протоколом завершается командой SPI.endTransaction().
Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.
Если вы планируете в своём скетче использовать стандартные пины Arduino, можно не описывать их в начале программы, т.к. они уже определены в самой библиотеке и имеют следующие имена:
4 Подключение сдвигового регистра к Arduino
Схема подключения сдвигового регистра 74HC595 к Arduino
5 Скетч для управления сдвиговым регистром по интерфейсу SPI
Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.
Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.
Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.
Числа, посылаемые в сдвиговый регистр 74HC595
6 «Бегущая волна» из светодиодов
Поделиться
Похожие материалы (по тегу)
Другие материалы в этой категории:
8 комментарии
Даешь статью про каскадное подключение. Мне прямо очень надо! Спасибо!)))
Алекс, обязательно. Просто сейчас совсем нет времени это.
Михаил, большое спасибо за замечания! Заменил иллюстрацию, на которой изображена временная диаграмма SPI.
Поменял «шило на мыло». И в предыдущий рисунок демонстрировал отсутствие синхронизации, и текущий рисунок нагло демонстрирует отсутствие синхронизации. Нарочито моменты смены значения текущего передаваемого бита (shift) не синхронизированы.