Jump to content
  • Sign Up
  • Language

Recommended Posts

Последовательный интерфейс периферийных устройств (SPI)

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

Обычный последовательный порт, содержащий лини RX и TX, является асинхронным, потому что отсутствует контроль,  за моментами времени в которые должны передаваться данные, а также нет никакой гарантии, что обе стороны работают с одинаковой скоростью. Поскольку компьютеры обычно опираются на общую линию синхронизации «clock» (это частота основного тактового кристалла установленного в компьютере на основе которой происходит все управление), это может стать проблемой, когда две различные системы попытаются обменяться данными с немного разными частотами тактовых кристаллов.

Чтобы обойти эту проблему, в асинхронные последовательные соединения добавляются дополнительные стартовые и стоповые биты к каждому байту, помогающие приемнику синхронизировать данные, по мере их поступления.  Также, с обеих сторон должна быть согласована скорость передачи данных (например, 9600 бит в секунду) заранее, до момента передачи самих данных. Небольшие различия в скорости передачи данных не являются проблемой, так как приемник повторно синхронизируется в начале каждого байта.

5673cbb94913c_spi_1.png.6bda32ea57f78806

Кстати, если вы заметили, на рисунке выше, комбинация битов «11001010» не равна 0х53. Дело в том, что последовательные протоколы часто посылают младшие биты первыми, таким образом, получается, что наименьший бит, находится слева. Из этого следует, что младший ниббл (полубайт)  фактически – это 0011 = 0х3, а старший ниббл – это 0101 = 0х5

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

Синхронизированное решение

Интерфейс SPI работает в несколько иной манере.  Это синхронизированная шина данных, это означает, что она использует отдельные линии для данных и синхронизации «clock», что позволяет держать обе стороны в идеальной синхронизации. Тактовый синхронизирующий сигнал, позволяет приемнику считывать сигналы линии данных в строго определенное время.  Момент синхронизации может определяться временем роста (от низкого до высокого), или временем спада (от высокого к низкому) тактового импульса. То есть синхронизация выполняется по переднему или заднему фронту тактового импульса. В разных случаях используются оба варианта синхронизирующего момента, и обычно это указывается в техническом описании используемого устройства. Также, синхронизирующий импульс может различаться по полярности. Когда приемник обнаруживает синхронизирующий момент импульса (рост или спад), он тут же считывает бит, установленный на линии данных (этот момент указан стрелками на диаграмме ниже). Так как синхронизирующий тактовый сигнал «clock» отправляется вместе с данными, согласование скорости передачи уже не важно, устройства будут работать на максимально возможной для них скорости.

5673cc0658797_spi_2.png.e96f775db2afc2ff

Одна из причин, по которой интерфейс SPI является настолько популярным, это то, что принимающей стороной может быть простой регистр сдвига. Эта часть оборудования намного проще и дешевле, чем  полная версия оборудования UART (Universal Asynchronous Receiver / Transmitter), на которое рассчитана работа асинхронного последовательного интерфейса.

Прием и передача данных

Все вышеописанное отлично подходит для односторонних коммуникаций, но как отправить данные в обратном направлении? Вот где все становится немного сложнее… 

В интерфейсе SPI, только одна сторона генерирует тактовый сигнал (обычно называемый CLK или SLK для тактовых импульсов). Та сторона, которая его генерирует, называется «master», а которая принимает «slave» (В дальнейшем будут называться ведущее и ведомое устройство). В схеме, всегда может быть только одно устройство «master» (почти всегда это микроконтроллер), и множество устройств «slave» (подробнее об этом позже).

Когда данные передаются от ведущего к ведомому устройству, то они передаются по линии данных, называемой MOSI (Master Out / Slave In). Если ведомое устройство должно отправить ответные данные обратно к ведущему устройству, последнее продолжит генерировать условное количество тактовых импульсов, и ведомое устройство передаст ответные данные по обратной линии данных под названием  MISO (Master In / Slave Out).

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

Обратите внимание, что интерфейс  SPI может работать в режиме «Full duplex» (т.е. он использует отдельные линии для отправки и получения информации), и таким образом, в определенных ситуациях, можно передавать и получать данные одновременно (например, запрос нового показания датчика, при получении данных из предыдущего запроса). Если это возможно, то об этом будет написано в техническом описании устройства.

Выбор ведомого (slave) устройства (линия SS)

Для выбора ведомого устройства используется линия «SS» (Select Slave). Сигнал,  присутствующий на этой линии говорит ведомому устройству, что оно должно проснуться и получить или передать данные, а также, эта линия используется для выбора конкретного ведомого устройства, если таковых в схеме больше одного.

На линии SS, как правило, постоянно присутствует высокий логический уровень, который отключает ведомое устройство от шины SPI (Этот тип логики известен как «Активный низкий уровень», и он часто используется для включения и перезагрузки устройств). Непосредственно перед тем, как начать передавать данные в ведомое устройство, на линии SS устанавливается низкий уровень, который активирует ведомое устройство. Когда передача данных заканчивается, на этой линии снова устанавливается высокий уровень. При использовании регистра сдвига, переключение логических уровней на этой линии соответствует импульсу затвора его входа, который позволяет передавать полученные данные в выходные линии регистра. 

Использование нескольких Slave устройств

Есть два способа подключения нескольких ведомых устройств к шине SPI:

  • В параллельной схеме (топология «Звезда»), для каждого ведомого устройства понадобится отдельная линия SS, которая включит конкретное ведомое устройство, в то время как остальные будут неактивны. Большое количество ведомых устройств потребует много линий SS. Если используется логика активного низкого сигнала на выходах, то можно использовать бинарные чипы-декодеры (к примеру, микросхема 74HC238), которые позволяют преумножить количество линий SS.

5673cc9622cea_spi_5.png.e7c97c1f97d4a3b3

  • В другом случае, ведомые устройства соединяются последовательно (топология «кольцо»), а данные поступающие на вход MISO первого устройства передаются с его выхода MOSI на вход данных MISO следующего устройства и т.д.  При этом для всех ведомых устройств используется одна линия SS.  После того, как все данные были переданы и записаны в регистры ведомых устройств, на линии SS устанавливается активный низкий уровень, который активирует все ведомые устройства одновременно, но каждое из них считывает данные из своего регистра. Для того чтобы данные достигли определенного ведомого устройства, должно быть передано несколько пакетов данных (согласно количеству ведомых устройств), способных охватить все устройства в цепи. Причем, чтобы данные достигли последнего устройства, они должны быть переданы первыми, то есть в обратном порядке. Эта схема подключения часто используется для последовательной цепи сдвиговых регистров и драйверов адресуемых светодиодов (например, драйвер WS2801 IC)

5673cccbcb540_spi_6.png.02d675819ff0a6a6

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

Посмотреть принцип работы протокола SPI можно в следующем видео:

Преимущества интерфейса SPI:

  • Быстрее, чем асинхронный последовательный интерфейс
  • Более простое приемное оборудование
  • Поддерживает несколько ведомых устройств
  • Полнодуплексная передача данных
  • Ведомым устройствам не требуется уникальный адрес

Недостатки интерфейса SPI:

  • Требует больше сигнальных линий (проводов), чем в других методах коммуникаций
  • Пакеты данных должны быть четко определены заранее (нельзя отправить случайные объемы данных, в произвольное время)
  • Ведущее устройство должно контролировать все коммуникации (ведомые устройства не могут обмениваться данными друг с другом напрямую)
  • Как правило, требуются отдельные SS линии для каждого ведомого устройства, что может быть проблематично, если ведомых устройств очень много.
  • Отсутствует протокол обнаружения ошибок
  • Низкая дальность передачи данных по проводам

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

5673ce6e8d92b_spi_8.png.4c14183705deeb8d5673ce703d12f_spi_9.png.718ebaa5887217d5

В ознакомительных целях, можно посмотреть видео, в которых используется интерфейс SPI для управления светодиодами:

Светодиодный потенциометр напряжения:

Светодиодная семицветная RGB гирлянда под управлением PIC контроллера использующего сдвиговый регистр 74HC164. Управление происходит по SPI интерфейсу, каждый элемент управляется индивидуально.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...