Режимы работы шины spi

Интерфейс SPI — это один из самых популярных на сегодняшний день последовательных интерфейсов. Он был придуман фирмой Motorola и очень быстро завоевал популярность благодаря своей исключительной простоте и высокой скорости. При этом, SPI, наверное, нельзя назвать в полной мере интерфейсом, скорее это просто принцип связи, поскольку всё, что подразумевается под SPI, — это логика передачи данных между двумя устройствами («Ведущий»-«Ведомый»), физике же уделяется гораздо меньшее внимание, она реализуется, можно сказать, «по обстоятельствам», а никакого протокола нижнего уровня вообще нет, тут каждый производитель придумывает что-то своё.

Ну что ж, — с главного и начнём. Итак, в чём же тут логика? Логика в том, что данные передаются последовательно, побитно, при этом считывание и установка данных разделены во времени с помощью специального синхросигнала на специальной шине. Эта шина называется шиной тактирования (или шиной синхронизации), а суть разделения заключается в том, что считывание и установка данных происходят по противоположным фронтам генерируемых на шине синхроимпульсов. Такое, чётко разделённое во времени, чередование установок и считываний даёт возможность использовать один и тот же регистр и для приёма, и для передачи данных. Ранее (когда память была маленькой и дорогой, операционки хранились на дискетах, а по полям бегали мамонты ) это было серьёзным преимуществом, более того, именно под это на самом деле изначально и затачивался SPI, однако сейчас никаких проблем с обьёмом памяти нет и большинство устройств спокойно могут позволить себе иметь отдельные входной и выходной регистры.

Устройство, управляющее шиной тактирования (то есть генерирующее на ней синхроимпульсы), является «Ведущим» или «Мастером». Собственно, «Master» управляет всем обменом данными, — он решает: когда начинать обмен, когда заканчивать, сколько бит передать и т.д. Второе устройство, участвующее в обмене, является «Ведомым» или «Slave». В SPI, в отличии от, например, того же I2C, «Slave» совсем бесправен, он вообще никак не может влиять на шину тактирования и никак не может сообщить мастеру, что не успевает или, наоборот, что уже готов к обмену. То есть «Мастер» сам должен знать: когда, что и на какой скорости спросить у «Слэйва», чтобы тот смог ему ответить.

Всего, для полнодуплексного обмена (в обе стороны одновременно), в интерфейсе SPI используются 4 линии (смотрим рисунок): SCLK, MOSI, MISO и SS.

  1. SCLK — шина тактирования (на этой линии мастер генерирует синхроимпульсы)
  2. MOSI (Master Out, Slave In) — выход ведущего, вход ведомого (по этой линии мастер передаёт данные слэйву)
  3. MISO (Master In, Slave Out) — вход ведущего, выход ведомого (по этой линии мастер принимает данные от слэйва)
  4. SS (Slave Select) — выбор ведомого (с помощью этой линии мастер управляет сеансами обмена)

«1» и «0» кодируются уровнем напряжения на шинах данных (MOSI, MISO) в обычной положительной логике, то есть высокий уровень напряжения на шине соответствует «единице», а низкий уровень соответствует «нулю». При этом, то, каким образом организуется установка на шинах этих уровней, — нигде не оговаривается, то есть выходы передатчиков могут быть как «push-pull», так и «с открытым коллектором». Высокий уровень обычно соответствует напряжению питания микросхемы (то есть если мы имеем дело с пятивольтовыми микрухами, то высокий уровень — это напряжение, близкое к пяти вольтам, если речь идёт о микрухах, питающихся от 3,3В, то высокий уровень — это напряжение, близкое к 3,3В).

Сигнал SS отмечает начало и конец сеанса обмена. Этот сигнал обычно инверсный, то есть во время сеанса обмена данными мастер должен устанавливать на линии SS низкий уровень, а при отсутствии обмена — высокий. Наличие сигнала SS позволяет мастеру организовать подключение к нескольким слэйвам, используя один и тот же синхросигнал и одни и те же шины данных, без каких-либо дополнительных протоколов (вариант такого подключения показан на рисунке слева). Правда тут есть один минус: в этом случае мастеру придётся к каждому слэйву подключаться по отдельной линии SS (чтобы управлять сеансами обмена с каждым слэйвом независимо друг от друга), что увеличивает общее количество используемых проводов.

Названия линий, в общем-то, не являются каким-то стандартом и могут отличаться в зависимости от производителя (например, вместо MOSI, MISO и SCLK линии могут называться DI, DO и SC, или SI, SO и CLK, линия SS может называться CS или RESET).

Читайте также: Пониженное давление воздуха в шинах приведет

Более того, линий не обязательно должно быть четыре, — иногда их может быть только три, например, если данные передаются только в одном направлении или вместо двух однонаправленных шин данных используется одна двунаправленная. Очевидно, что в последнем случае возможен только полудуплексный обмен, то есть в один момент времени можно только передавать или только принимать данные (а передавать и принимать одновременно — нельзя).
То есть, ни по названию линий, ни по уровням напряжения на них, ни даже по их количеству, однозначно идентифицировать SPI нельзя, зато это отлично можно сделать по самому методу передачи данных, по тому как происходит их установка на шину и считывание.

Как я уже упоминал, — данные передаются побитно, а установка и чтение данных происходит по противоположным фронтам сигнала тактирования. Момент чтения данных в англоязычной литературе называется latch (фиксация, защёлкивание), а момент установки данных на шину — shift (сдвиг). Сдвигом момент установки называется в силу особенностей большинства последовательных интерфейсов. Обычно никто не передаёт данные по одному биту, как правило, их посылают пачками по 8 и более бит (размер пачки чаще всего всё же кратен восьми). В связи с этим, на выходе передатчика делают сдвиговый регистр, куда загружают сразу всю пачку передаваемых бит, при этом значение младшего или старшего бита этого сдвигового регистра устанавливается на шине данных (смотря как передаём — младшим или старшим битом вперёд), а для установки на шине следующего передаваемого бита — достаточно «сдвинуть» этот регистр. Так устроены передатчики и в SPI, и в I2C, и в привычном RS232, и много где ещё (так просто аппаратно удобнее). Ну, ладно, — вернёмся к нашему SPI.

Логический уровень сигнала на шине тактирования в неактивном состоянии (когда нет передачи данных) называют полярностью и обозначают CPOL (то есть, если при отсутствии передачи на шине SCLK низкий уровень, то CPOL=0, а если в это время на шине SCLK высокий уровень, то CPOL=1). Порядок чередования считываний и сдвигов называют фазой и обозначают CPHA (если по первому фронту на SCLK происходит считывание, то CPHA=0, а если по первому фронту на SCLK происходит сдвиг, то CPHA=1).

В зависимости от сочетания значений CPOL и CPHA различают 4 режима работы интерфейса SPI, которые так и обозначают Mode0, Mode1, Mode2 и Mode3. Ниже приведена картинка, иллюстрирующая как происходит установка и чтение данных, в зависимости от выбранного режима.

Хотелось бы подчеркнуть, что SS — это именно линия управления сеансом обмена, а не просто линия выбора слэйва. Разница тут в том, что если считать SS просто линией выбора слэйва, то при подключении мастера к одному единственному слэйву возникает соблазн этой линией не управлять, а жёстко закоротить её на общий провод (типа чтоб слэйв всегда был выбран). Однако, логика слэйва обычно такова, что начало сеанса сопровождается различными подготовительными процедурами, такими как загрузка данных в выходной сдвиговый регистр и сброс счётчика импульсов, а выполнять какие-то действия (в соответствии с принятыми по SPI командами от мастера) слэйв начинает только после завершения сеанса обмена. Кроме того, вам ведь вполне может понадобиться несколько сеансов общения (например, если в первом сеансе вы посылаете команды, а в следующем хотите получить отчёт о результате их выполнения). Думаю понятно, что если жёстко притянуть линию SS к общему проводу, то ни о каком распознавании начала и конца сеанса обмена (начало распознаётся по спаду на линии SS, а конец — по подъёму) не может быть и речи, соответственно весь обмен данными будет нарушен. Так что важность сигнала SS не стоит недооценивать.

Ну и напоследок скажу, что наиболее популярными являются режимы Mode0 и Mode3.

Более подробно о том, как происходит обмен, что должен уметь SPI-мастер и как это программно реализовать на микроконтроллере (на примере контроллеров PIC и AVR) можно почитать в статье «Программная реализация ведущего шины SPI»

Читайте также: Несчастные случаи при накачивании шин

Видео:Лекция 307. Интерфейс SPIСкачать

Лекция 307. Интерфейс SPI

Шина SPI и связь через неё по NRF24L01+

Режимы работы шины spi

К нам для тестов попали разные переходники для передатчиков NRF24L01+. В этой статье мы рассказывали про сами передатчики, а в этой — про переходник SPI-I2C.

По методу исключения остался переходник SPI-UART:

Но во время тестирования выяснили, что предоставленные нам переходники предназначены только для передатчиков NRF24L01+, поэтому зашитая в их микроконтроллерах программа предназначена именно для коммуникации между передатчиком и другим устройством.

Видео:Передача данных - шина SPIСкачать

Передача данных - шина SPI

Шина SPI

Рассказывая про переходник SPI-I2C, узнали про устройство самой шины I2C: как она работает, сколько устройств поддерживает и т. д. Поэтому в этой статье мы решили рассмотреть шину SPI.

Видео:MCP2515, контроллер CAN шины с интерфейсом SPIСкачать

MCP2515, контроллер CAN шины с интерфейсом SPI

Описание шины SPI

SPI, или Ser i al Peripheral Interface, представляет собой интерфейс, работающий в полном дуплексе. С его помощью можно управлять несколькими устройствами. Эта шина очень похожа на I2C, но для её подключения требуется больше проводов: четыре вместо двух у IIC. Однако, это всё же меньше, чем для параллельных интерфейсов. Кроме этого, пропускная способность SPI выше, чем у I2C.

Видео:Видеоуроки по Arduino. Интерфейсы SPI (8-я серия, ч1)Скачать

Видеоуроки по Arduino. Интерфейсы SPI (8-я серия, ч1)

Описание линий шины SPI

В SPI используются четыре линии:

  • MOSI — выход ведущего, вход ведомого (Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
  • MISO — вход ведущего, выход ведомого (Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCLK — последовательный тактовый сигнал (Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS — выбор микросхемы, выбор ведомого (Chip Select, Slave Select).

Но имена могут быть разными на разных устройствах:

  • MOSI: SIMO, SDO, DO, DOUT, SI, MTSR;
  • MISO: SOMI, SDI, DI, DIN, SO, MRST;
  • SCLK: SCK, CLK;
  • SS: nCS, CS, CSB, CSN, nSS, STE, SYNC.

На Arduino используются такие названия: MOSI, MISO, SCK, SS.

Видео:Лекция "Интерфейсы (часть I). RS-232/422/485. SPI"Скачать

Лекция "Интерфейсы (часть I). RS-232/422/485. SPI"

Режимы работы шины SPI

Всего может быть четыре вида режимов работы. Они определяются комбинацией определенных бит (CPHA и CPOL):

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

Обозначать режимы работы интерфейса SPI принято так:

  • режим 1 (CPOL = 0, CPHA = 0);
  • режим 2 (CPOL = 0, CPHA = 1);
  • режим 3 (CPOL = 1, CPHA = 0);
  • режим 4 (CPOL = 1, CPHA = 1).

На Arduino можно настраивать режимы для работы шины. Это можно сделать так:

Видео:Цифровые интерфейсы: 04. SPI (Периферийный последовательный интерфейс)Скачать

Цифровые интерфейсы: 04. SPI (Периферийный последовательный интерфейс)

Master and Slave

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

Также стоит отметить, что при добавлении дополнительного ведомого устройства, необходимо добавить ещё одну линию SS, что усложняет работу с интерфейсом.

Видео:AVR 38# Последовательный интерфейс SPIСкачать

AVR 38# Последовательный интерфейс SPI

Описание связи

Чтобы несколько устройств могли общаться друг с другом, ведущий посылает сигнал синхронизации SCK ведомым. Причем ведомые устройства не могут никак повлиять на частоту посылаемых сигналов. А счетчик импульсов синхронизации позволяет slave-устройству определить, когда передача пакета от master-устройства заканчивается.

Изначально все линии SS установлены в высокий уровень (в единицу). Чтобы выбрать ведомое устройство, которому нужно передавать данные, ведущий должен «зажать» линию (перевести в низкий уровень — в ноль).

Все данные передаются пакетами. Обычно пакеты составляются по 8 бит, но есть вариант и по 4 бита. Передача данных осуществляется от master по линии MOSI и от slave по линии MISO и как правило начинается со старших битов.

Видео:STM 32F0... Настройки шины SPI на 9 бит на примере работы с дисплеем, LCD1202Скачать

STM 32F0... Настройки шины SPI на 9 бит на примере работы с дисплеем, LCD1202

Пример работы шины SPI

Чтобы разобраться с шиной на практике, мы решили собрать такую схему:

Видео:Программирование МК PIC. Урок 15. Модуль MSSP. Режим SPI. Часть 1Скачать

Программирование МК PIC. Урок 15. Модуль MSSP. Режим SPI. Часть 1

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

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

Видео:STM32. CMSIS. Урок#07: SPI. Теория. Мастер режим. Отправка и прием данных.Скачать

STM32. CMSIS. Урок#07: SPI. Теория. Мастер режим. Отправка и прием данных.

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

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

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

Читайте также: Переработка шин в кыргызстане

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

Видео:Введение в шину I2CСкачать

Введение в шину I2C

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

Видео:Программирование МК AVR. УРОК 24. Знакомство с шиной SPIСкачать

Программирование МК AVR. УРОК 24. Знакомство с шиной SPI

SPI на Arduino:

Arduino UNO/Piranha UNO/Arduino ULTRA

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

Режимы работы шины spi

СигналВывод
SS10
MOSI11
MISO12
SCK13

Arduino MEGA

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

Режимы работы шины spi

СигналВывод
SS53
MOSI51
MISO50
SCK52

Пример для Arduino

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

Режимы работы шины spi

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

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

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

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

Видео:Программирование МК PIC. Урок 15. Модуль MSSP. Режим SPI. Часть 2Скачать

Программирование МК PIC. Урок 15. Модуль MSSP. Режим SPI. Часть 2

SPI на Raspberry Pi

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

Режимы работы шины spi

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

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

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

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

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

Режимы работы шины spi

Видео:Интерфейс SPIСкачать

Интерфейс SPI

Подробнее о SPI

Параметры

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

РежимПолярностьФазаФронт тактированияФронт установки бита данных
SPI_MODE000СпадающийНарастающий
SPI_MODE101НарастающийСпадающий
SPI_MODE210НарастающийСпадающий
SPI_MODE311СпадающийНарастающий

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

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

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

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

  • Свежие записи
    • Нужно ли менять пружины при замене амортизаторов
    • Скрипят амортизаторы на машине что делать
    • Из чего состоит стойка амортизатора передняя
    • Чем стянуть пружину амортизатора без стяжек
    • Для чего нужны амортизаторы в автомобиле
    • Правообладателям
    • Политика конфиденциальности

    Автоподбор © 2023
    Информация, опубликованная на сайте, носит исключительно ознакомительный характер

    🌟 Видео

    SPI интерфейсСкачать

    SPI интерфейс

    Микросхемы и программаторы, Шины I2C и SPIСкачать

    Микросхемы и программаторы, Шины I2C и SPI

    Лекция 308. Шина I2CСкачать

    Лекция 308.  Шина I2C

    STM32. SPI. Create library. Пишем библиотеку для SPI. Тонкости работы с SPI. Тестируем на NRF24L01.Скачать

    STM32. SPI. Create library. Пишем библиотеку для SPI. Тонкости работы с SPI. Тестируем на NRF24L01.

    лекция 349 Atmega8 интерфейс SPIСкачать

    лекция 349 Atmega8 интерфейс SPI

    Работа с логическим анализатором цифровой шины данныхСкачать

    Работа с логическим анализатором цифровой шины данных
Поделиться или сохранить к себе:
Технарь знаток