Разъем spi. Описание интерфейса SPI. Временная диаграмма сигналов

Введение

SPI (3-wire) - популярный интерфейс для последовательного обмена данными между микросхемами. Интерфейс SPI, наряду с I 2 C, относится к самым широко-используемым интерфейсам для соединения микросхем. Изначально он был придуман компанией Motorola, а в настоящее время используется в продукции многих производителей. Его наименование является аббревиатурой от "Serial Peripheral Bus", что отражает его предназначение - шина для подключения внешних устройств. Шина SPI организована по принципу "ведущий-подчиненный". В качестве ведущего шины обычно выступает микроконтроллер, но им также может быть программируемая логика, DSP-контроллер или специализированная ИС. Подключенные к ведущему шины внешние устройства образуют подчиненных шины. В их роли выступают различного рода микросхемы, в т.ч. запоминающие устройства (EEPROM, Flash-память, SRAM), часы реального времени (RTC), АЦП/ЦАП, цифровые потенциометры, специализированные контроллеры и др.

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

Электрическое подключение

Существует три типа подключения к шине SPI, в каждом из которых участвуют четыре сигнала (их основное и альтернативные обозначения см. в табл. 1). Самое простое подключение, в котором участвуют только две микросхемы, показано на рисунке 1. Здесь, ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных. Представленную схему можно упростить исключением линии MISO, если используемая подчиненная ИС не предусматривает ответную передачу данных или в ней нет потребности. Одностороннюю передачу данных можно встретить у таких микросхем как ЦАП, цифровые потенциометры, программируемые усилители и драйверы. Таким образом, рассматриваемый вариант подключения подчиненной ИС требует 3 или 4 линии связи. Чтобы подчиненная ИС принимала и передавала данные, помимо наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние. В противном случае, подчиненная ИС будет неактивна. Когда используется только одна внешняя ИС, может возникнуть соблазн исключения и линии SS за счет жесткой установки низкого уровня на входе выбора подчиненной микросхемы. Такое решение крайне нежелательно и может привести к сбоям или вообще невозможности передачи данных, т.к. вход выбора микросхемы служит для перевода ИС в её исходное состояние и иногда инициирует вывод первого бита данных.


Рис. 1. Простейшее подключение к шине SPI

При необходимости подключения к шине SPI нескольких микросхем используется либо независимое (параллельное) подключение (рис. 2), либо каскадное (последовательное) (рис. 3). Независимое подключение более распространенное, т.к. достигается при использовании любых SPI-совместимых микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое состояние, задает, с какой подчиненной ИС он будет обмениваться данными. Главным недостатком такого подключения является необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3+n, где n-количество подчиненных микросхем). Каскадное включение избавлено от этого недостатка, т.к. здесь из нескольких микросхем образуется один большой сдвиговый регистр. Для этого выход передачи данных одной ИС соединяется со входом приема данных другой, как показано на рисунке 3. Входы выбора микросхем здесь соединены параллельно и, таким образом, общее число линий связи сохранено равным 4. Однако использование каскадного подключения возможно только в том случае, если его поддержка указана в документации на используемые микросхемы. Чтобы выяснить это, важно знать, что такое подключение по-английски называется "daisy-chaining".


Рис. 2. Независимое подключение к шине SPI


Рис. 3. Каскадное подключение к шине SPI

Протокол передачи

Протокол передачи по интерфейсу SPI предельно прост и, по сути, идентичен логике работы сдвигового регистра, которая заключается в выполнении операции сдвига и, соответственно, побитного ввода и вывода данных по определенным фронтам сигнала синхронизации. Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. Это необходимо для гарантирования выборки данных после надежного их установления. Если к этому учесть, что в качестве первого фронта в цикле передачи может выступать нарастающий или падающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:

  • CPOL - исходный уровень сигнала синхронизации (если CPOL=0, то линия синхронизации до начала цикла передачи и после его окончания имеет низкий уровень (т.е. первый фронт нарастающий, а последний - падающий), иначе, если CPOL=1, - высокий (т.е. первый фронт падающий, а последний - нарастающий));
  • CPHA - фаза синхронизации; от этого параметра зависит, в какой последовательности выполняется установка и выборка данных (если CPHA=0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем, по заднему фронту, - установка данных; если же CPHA=1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка - по заднему). Информация по режимам SPI обобщена в таблице 2.

Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми, поэтому, перед выбором подчиненных микросхем важно уточнить, какие режимы поддерживаются ведущим шины. Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому, к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно.

Cравнение с шиной I 2 C

Как уже упоминалось, для стыковки микросхем не меньшей популярностью пользуется 2-проводная последовательная шина I 2 C . Ниже можно ознакомиться с преимуществами, которая дает та или иная последовательная шина.

Преимущества шины SPI Преимущества шины I2C
Предельная простота протокола передачи на физическом уровне обуславливает высокую надежность и быстродействие передачи. Предельное быстродействие шины SPI измеряется десятками мегагерц и, поэтому, она идеальна для потоковой передачи больших объемов данных и широко используется в высокоскоростных ЦАП/АЦП, драйверах светодиодных дисплеев и микросхемах памяти Шина I 2 C остается двухпроводной, независимо от количества подключенной к ней микросхем.
Все линии шины SPI являются однонаправленными, что существенно упрощает решение задачи преобразования уровней и гальванической изоляции микросхем Возможность мультимастерной работы, когда к шине подключено несколько ведущих микросхем.
Простота программной реализации протокола SPI. Протокол I2C является более стандартизованным, поэтому, пользователь I2C-микросхем более защищен от проблем несовместимости выбранных компонентов.

Производные и совместимые протоколы

  • MICROWIRE.

    Протокол MICROWIRE компании National Semiconductor полностью идентичен протоколу SPI в режиме 0 (CPOL = 0, CPHA = 0).

  • 3-проводной интерфейс компании Maxim

    Отличие этого интерфейса состоит в том, что вместо полнодуплексной передачи по двум однонаправленным линиям здесь выполняется полудуплексная передача по одной двунаправленной линии DQ.

  • QSPI

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

Кроме того, интерфейс SPI является основой для построения ряда специализированных интерфейсов, в т.ч. отладочный интерфейс JTAG и интерфейсы карт Flash-памяти, в т.ч. SD и MMC.

Табл. 1. Электрические сигналы шины SPI

Ведущий шины Подчиненный шины
Основное обозначение Альтернативное обозначение Описание Основное обозначение Альтернативное обозначение Описание
MOSI DO, SDO, DOUT MOSI DI, SDI, DIN
MISO DI, SDI, DIN Вход последовательного приема данных MISO DO, SDO, DOUT Выход последовательной передачи данных
SCLK DCLOCK, CLK, SCK Выход синхронизации передачи данных SCLK DCLOCK, CLK, SCK Вход синхронизации приема данных
SS CS Выход выбора подчиненного (выбор микросхемы) SS CS Вход выбора подчиненного (выбор микросхемы)

Поначалу в данной статье предполагалось описать особенности реализации синхронного последовательного интерфейса SPI в семействе однокристальных микроконтроллеров ADuC70xx фирмы Analog Devices. Автор намеревался не только рассмотреть особенности реализации SPI, но и обсудить, когда эти особенности оказываются полезными, как и для чего их следует использовать. В ходе написания статьи оказалось, что доля текста, посвященного вопросам «когда, как и для чего», превысила 50%.Тогда было принято решение изменить характер изложения в направлении, обозначенном в заглавии. Вследствие выросшего объема материал будет разбит на три отдельные статьи. 1. Принципы интерфейса SPI и организация ведомых устройств. 2. Подсистемы интерфейса SPI в микроконтроллерах: варианты организации и использование. 3. Подсистема интерфейса SPI в микроконтроллерах семейства ADuC70xx.

Все статьи цикла:

  • Синхронный последовательный интерфейс SPI в микроконтроллерах «от А до Я» и его реализация на примере ADuC70xx фирмы Analog Devices. Часть 1
  • Синхронный последовательный интерфейс SPI в микроконтроллерах ≪от А до Я≫ и его реализация в ADuC70xx фирмы Analog Devices. Часть 2
  • Синхронный последовательный интерфейс SPI в микроконтроллерах от «А до Я» и его реализация в ADuC70xx фирмы Analog Devices. Часть 3

В ходе написания статьи оказалось, что доля текста, посвященного вопросам «когда, как и для чего», превысила 50%. Тогда было принято решение изменить характер изложения в направлении, обозначенном в заглавии.

Вследствие выросшего объема материал будет разбит на три отдельные статьи:

  1. Принципы интерфейса SPI и организация ведомых устройств.
  2. Подсистемы SPI в микроконтроллерах: варианты организации и использование.
  3. Подсистема SPI в МК семейства ADuC70xx.

История SPI

Изобретатель интерфейса SPI — фирма Motorola . Однако изобретение было сделано не на «пустом месте». Предшественником послужил интерфейс MicroWire фирмы National Semiconductor . Автор статьи познакомился с интерфейсом SPI, работая с популярным семейством M68HC11 — практически первым, в котором SPI появился в конце 1980-х годов. Основное предназначение этого интерфейса — подключение к МК различных периферийных устройств. Очень быстро SPI стал весьма популярен по следующим причинам:

  1. минимальные требования к аппаратной части подключаемого к МК устройства (сдвиговый регистр);
  2. SPI-ведущего в минимальной конфигурации легко эмулировать программно, если в МК отсутствует аппаратная реализация SPI.

В последние два десятилетия многочисленные фирмы производят огромное количество различных периферийных узлов, подключаемых к МК через SPI (см., например, ). Это датчики физических величин (температуры, давления, ускорения и т. п.), устройства аналого-цифрового преобразования (АЦП, ЦАП, цифровые потенциометры), устройства преобразования интерфейсов (CAN-контроллеры, Ethernet-контроллеры), модули энергонезависимой памяти (Flash-карты MMC и SD, микросхемы EEPROM) и многие другие. В (2005 год) утверждается, что «примерно 85% МК оснащены интерфейсом SPI».

Исторически, однако, сложилось так, что какой-либо официальный общепризнанный стандарт на интерфейс SPI отсутствует. Поэтому свойства подсистемы SPI в микросхемах разных производителей могут различаться как набором возможностей, так и их реализацией, что нередко вызывает затруднения при использовании. Разработчики преодолевают эти затруднения по большей части методом проб и ошибок либо обмениваясь опытом. В свою очередь производители МК нередко, в предположении, что SPI — это общеизвестный стандарт, описывают свойства подсистемы излишне кратко. Этим, в частности, грешит техническое описание МК семейства ADuC70xx фирмы Analog Devices .

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

Автору известно лишь несколько публикаций, в которых сделана попытка описать свойства SPI без привязки к конкретному типу МК [ , , , ], и все они страдают неполнотой. Некоторые фирмы опубликовали свое «видение» того, что представляет собой SPI, например [ , – ], однако упомянутые документы в значительной степени «привязаны» к реализациям МК, выпускаемых этими фирмами.

Минимальная архитектура интерфейса и конфигурации

Минимальная архитектура изображена на рис. 1. Интерфейс SPI содержит четыре линии:

  • MOSI (Master Out Slave In) — выход данных ведущего (она же вход данных ведомого);
  • MISO (Master In Slave Out) — вход данных ведущего (она же выход данных ведомого);
  • SCK (Serial ClocK) — тактирование (синхронизация);
  • SS (Slave Select) — выбор ведомого.

Рис. 1. Структура связей и линии интерфейса SPI

Синхронизация передачи

Частота следования битовых интервалов в линиях данных SPI определяется синхросигналом SCK, который генерирует один из абонентов — ведущий (Master). Прочие абоненты — ведомые (Slave), которых может быть как один, так и несколько, используют синхросигнал для определения моментов изменения битов на линии данных. Ведомые устройства никак не могут влиять на частоту следования битовых интервалов (в отличие, например, от интерфейса I 2 C).

Ведущий в подавляющем большинстве случаев — это приемопередатчик SPI в составе МК (если аппаратный SPI отсутствует, его можно эмулировать программно). Однако автору известны реализации SPI-ведущего устройства в составе микросхем PLD фирмы Xilinx , а также в ИМС преобразователя параллельного интерфейса в интерфейс USB . В обоих этих случаях ведущий ориентирован на подключение определенного типа микросхем: EEPROM с SPI-совместимым интерфейсом.

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

Передача битов осуществляется пакетами. Длина пакета чаще всего составляет 1 байт (8 битов), хотя встречаются реализации SPI с иной длиной пакета [ , , ]. Как в ведущем устройстве, так и в ведомом имеется (обычно программно недоступный) счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик битов сбрасывается в ноль при выключении (деактивации) подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик битов обычно сбрасывается деактивацией интерфейсного сигнала SS. Передача пакета, то есть запуск генератора синхроимпульсов в ведущем, обычно осуществляется автоматически при записи передаваемого байта в регистр сдвига ведущего.

Задание частоты следования битов F SCK осуществляется стандартным для последовательных интерфейсов способом: F SCK =F G /DIV, где F G — постоянная частота задающего генератора SPI, значение которой приведено в техническом описании на микросхему, DIVА-217.(О- делитель, который может быть задан программно. В ряде МК делитель DIV может быть выбран только из набора предопределенных значений. Например, в МК семейства M68HC11 это одно из четырех значений: 2, 4, 16, 32 . При номинальном значении F G , равном 2 МГц, частота сдвига в этих МК может составлять 1000, 500, 125 или 62,5 кГц. В других МК значение DIV разрешается выбирать произвольно в пределах ограниченной разрядности. В семействе микроконтроллеров ADuC70xx эта разрядность составляет один байт, величина делителя может задаваться в пределах от 5 до 255, что позволяет выбрать одно из 251 значения частоты сдвигов в пределах от 3482 до 81,2 кГц.

Поскольку действия на ведущем и ведомом устройствах тактируются одним и тем же сигналом SCK, к стабильности частоты этого сигнала не предъявляется никаких требований (за исключением ограничения сверху на длительности полупериодов, определяемого максимальной рабочей частотой более медленного абонента). Это позволяет использовать SPI в системах с низкостабильной частотой тактирования (тактовый генератор без кварцевой стабилизации, с времязадающей RCцепью), а также существенно облегчает программную эмуляцию ведущего устройства. Более того, при программной эмуляции вполне допустимо приостанавливать передачу «в середине» байта, если это допускает ведомое устройство.

Передача данных

SPI предполагает передачу бит за битом: от ведущего по линии MOSI и от ведомого (в обратную сторону) по линии MISO. Таким образом, возможен полнодуплексный режим, когда данные передаются в обоих направлениях одновременно и синхронно. Порядок следования битов в исходной версии SPI фирмы Motorola можно определить как «начиная со старшего», однако в дальнейшем некоторые производители микроконтроллеров позволяли его задавать программно. Возможны реализации, в которых для передачи данных используется единственная двунаправленная линия; подобная конфигурация описана, в частности, в документе фирмы Freescale, полупроводниковой «дочки» фирмы Motorola .

Выбор ведомого — сигнал SS

Четвертый сигнал интерфейса — SS (Slave Select, выбор ведомого) — имеет основным назначением включение или выключение ведомого устройства сигналом от ведущего (от МК).

При активном (низком) уровне сигнала SS:

  • Схемотехника ведомого устройства находится в активном состоянии.
  • Вывод MISO — в режиме «выход».
  • Тактовый сигнал SCK от ведущего воспринимается ведомым, вызывает считывание на входе MOSI значений передаваемых от ведущего битов и сдвиг регистра ведомого.

При пассивном (высоком) уровне сигнала SS тактовый сигнал SCK и сигнал MOSI не оказывают никакого воздействия на ведомое устройство.

В простейших вариантах использования SPI сигнал SS может не употребляться. В других, более сложных периферийных устройствах сигнал SS не только используется, но выполняет еще и дополнительные функции, и этот вопрос будет обсуждаться далее.

Временная диаграмма сигналов

Возможно несколько вариантов диаграммы. Один из них изображен на рис. 2, а другие будут рассмотрены далее. Опишем диаграмму подробно.


Рис. 2. Диаграмма SPI, режим 0

До начала передачи пакета, левее момента времени А сигнал SS на выходе ведущего в высоком состоянии — рис. 2д), ведомый неактивен, его выход MISO в отключенном состоянии, а входы ведомого MOSI и SCK не воспринимают сигналов, формируемых ведущим. Тактовый сигнал на выходе ведущего в этот период имеет низкий уровень.

Для активации ведомого ведущий переводит в активное (низкое) состояние сигнал SS выбора ведомого (момент времени A). Ведомый включается, его вход тактирования способен воспринимать тактовый сигнал, а вывод MISO переходит в режим выхода. Тактовые импульсы пока еще не начались, выходные сигналы на линях данных MOSI и MISO теперь отражают значения бита, который будет первым передан другому абоненту (интервал времени от A до 1).

Через некоторое время ведущий начинает формирование пакета сдвиговых импульсов — рис. 2а), сигнал SCK. Перепады тактового сигнала вызывают сдвиг содержимого сдвиговых регистров ведущего и ведомого, а также захват новых значений битов после сдвига. Моменты сдвига и захвата должны быть разнесены во времени, поэтому эти действия выполняются в интерфейсе SPI по разным перепадам тактовых импульсов. Диаграмма изображена в предположении, что захват производится по нарастанию тактового сигнала (по нечетным перепадам на рисунке), соответствующие моменты времени отмечены также на рис. 2б), а сдвиг в регистрах — по спаду (четные перепады). Таким образом, порядок событий при действии каждого тактового импульса можно описать как «захват, затем сдвиг» (Latch, then Shift).

После окончания обмена пакетами (правее перепада 16-тактовой последовательности) выходной сигнал на каждой из линий данных MOSI и MISO отражает значение бита, который был передан первым. Передача пакета завершается снятием сигнала SS на выходе ведущего (момент B), что деактивирует ведомого абонента. Через некоторое время возможно начало передачи следующего пакета (момент С).

Сигнал SS может формироваться на выходе ведущего разными способами. В некоторых МК он формируется аппаратно: после того как будет программно выполнена запись передаваемого байта в регистр данных передатчика, выходной сигнал SS автоматически переключается в низкий уровень, а по окончании пакета — возвращается в исходное неактивное значение (высокий). Если в ведущем устройстве отсутствует аппаратно реализованное формирование сигнала SS, его формируют программно, используя для этого выход параллельного порта общего назначения. Однако при работе с некоторыми периферийными устройствами приходится формировать сигнал SS программно даже при наличии аппаратного формирователя. Примеры будут приведены позже.

На этом рассмотрение базовых свойств интерфейса SPI заканчиваем, а более подробное их обсуждение продолжим на примерах использования.

Простейший пример использования SPI

Рассмотрим простой пример использования интерфейса SPI для увеличения количества линий дискретного вывода (параллельных портов) в МК, например, для управления группой светодиодов либо семисегментным ЖК-индикатором. Для этого в качестве ведомого можно взять обычный регистр сдвига, например 74HC164. Такой восьмиразрядный регистр имеет последовательный вход данных, вход тактирования (сдвига) и восемь параллельных выходов. Отдельный последовательный выход данных в этом регистре отсутствует, но для этого можно использовать выход старшего разряда D7. Схема подключения показана на рис. 3. В ней использованы только две из четырех линий интерфейса SPI.


Рис. 3. Подключение к МК сдвигового регистра через SPI

Схемотехника микросхемы 74HC164 такова, что как восприятие нового значения входного сигнала MOSI, так и сдвиг (в результате которого изменяются состояния параллельных выходов D7, …, D0) происходит по нарастанию тактового сигнала SCK. Таким образом, использовав два вывода (MOSI и SCK) можно получить дополнительно восемь цифровых выходов в системе.

Почти во всех микроконтроллерах с интерфейсом SPI линии этого интерфейса мультиплексированы с выводами параллельных портов общего назначения. Данный факт позволяет использовать незадействованные выводы микроконтроллера MISO и SS для других целей. Но этот же факт требует от программиста не забыть переконфигурировать соответствующие выводы параллельных портов для их использования в SPI.

Последовательное включение ведомых

При необходимости увеличения количества выходов можно соединить n регистров 74HC164 последовательно в цепочку, которая образует 8× n -разрядный сдвиговый регистр и предоставит 8× n выходов. На рис. 4 показано, как это выглядит для n = 2.


Рис. 4. Последовательное подключение к МК простых сдвиговых регистров как ведомых

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

Аналогично можно подключить к МК через интерфейс SPI одну или несколько ИМС регистров сдвига типа 74HC299, имеющих двунаправленные параллельные выводы, что даст дополнительное количество двунаправленных линий ввода/вывода.

Периферийные микросхемы с интерфейсом SPI могут быть устроены сложнее, нежели рассмотренные сдвиговые регистры, и требовать определенной последовательности сигналов SCK и MOSI на своих входах. Это относится:

  • к полярности тактовых импульсов (или иначе, к уровню сигнала, которого требует на входе SCK периферийная микросхема в промежутках между передачами пакетов),
  • а также к порядку событий «захват и сдвиг».

По этой причине в спецификациях интерфейса SPI различают четыре режима работы , диаграммы для этих режимов изображены на рис. 5.


Рис. 5. Четыре режима работы интерфейса SPI

Буквы S и L над графиками обозначают соответственно Shift (сдвиг) и Latch (захват). Рассмотренная ранее диаграмма соответствует Mode 0. Считается, что наиболее употребительны Mode 0 и Mode 3.

Для выбора в ведущем устройстве (в МК) одного из режимов, различающихся полярностью тактовых импульсов и их «фазой» (порядком действий), в одном из периферийных регистров подсистемы SPI обычно есть два управляющих бита: CPOL (полярность) и CPHA (фаза) — приведенные обозначения битов и обозначения режимов являются широко употребительными. Периферийные устройства (ведомые) чаще всего поддерживают единственный режим, и перед началом обмена ведущий (МК) должен быть настроен на этот режим.

Обратим внимание читателя на то, что в рассмотренном выше примере работы с обычным регистром сдвига одинаково пригоден любой из этих четырех режимов.

Возможные топологии систем связи на базе интерфейса SPI

Простейший случай: к ведущему подключен единственный ведомый, и необходим двусторонний обмен. В этом случае структура межсоединений может использовать трехпроводную схему (рис. 6).


Рис. 6. Двунаправленный обмен с одним ведомым без использования сигнала SS

На вход выбора SS на ведомом может быть постоянно подан активный (низкий) уровень, в то время как выход SS ведущего не используется вовсе и может быть задействован как вывод параллельного порта.

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

Рис. 7. Радиальная структура связи
с несколькими ведомыми через SPI

Как видно на рисунке, для обмена более чем с одним ведомым ведущий должен формировать соответствующее количество сигналов выбора ведомого SS. Это как раз тот случай, когда сигналы SS приходится формировать программно, поскольку аппаратно в ведущем формируется не более одного сигнала SS. Если требуется обеспечивать обмен всегда только между ведущим и лишь одним из ведомых, программа на ведущем должна в промежутках между передачами данных держать все сигналы SS в неактивном (высоком) состоянии, а для обмена с одним из ведомых переводить в активный (низкий) уровень соответствующий сигнал SS (отсюда и название «выбор ведомого» — Slave Select). Выводы данных ведомых MISO соединены параллельно, но не «мешают» друг другу, поскольку находятся в отключенном состоянии, а перед началом обмена лишь один из этих выходов (на выбранном ведомом) переходит в активный режим. Обеспечение такого положения дел требует от программиста внимательности.

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

Если в качестве ведомых в рассматриваемой структуре используются тоже МК, в которых имеется возможность программно управлять режимом выходов MISO, то можно организовать широковещ ательную передачу и при наличии обратного канала (линии MISO). Для этого программы, работающие на микроконтроллерах — ведомых, должны постоянно держать выводы MISO в отключенном состоянии, при этом возможен режим широковещательной передачи от ведущего. Если же требуется получение данных от одного из ведомых, ведущий может сообщить ему об этом в широковещательном режиме, послав пакет с командным кодом-идентификатором, распознав который, один из ведомых должен перевести свой вывод MISO в активное состояние, после чего возможен двусторонний обмен данными между ведущим и выбранным ведомым. По окончании двустороннего обмена ведущий должен вернуть выбранного ведомого в исходное состояние. Иными словами, для получения такой возможности разработчику придется сконструировать некий протокол обмена, надстроенный над диаграммами SPI, в котором некоторые значения байтов (или их последовательностей) играют роль команд для ведомых МК. Этот вопрос будет рассмотрен более подробно в следующей статье цикла при обсуждении организации симметричной магистрали с несколькими ведущими на базе SPI.

Второй способ, позволяющий соединить одного ведущего абонента с несколькими ведомыми, — это структура «кольцо» (иногда эту структуру называют «цепочкой» или каскадным включением, в английской терминологии используется название Daisy-Chain) . Эта структура изображена на рис. 8 (заимствован из ).

Рис. 8. Кольцевая топология связи через SPI

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

Некоторые периферийные микросхемы с интерфейсом SPI проектируются специально для использования в цепочечных конфигурациях. Пример таких микросхем — цифро-аналоговые преобразователи AD5444 и AD5446 фирмы Analog Devices . Их структура изображена на рис. 9.


Рис. 9. Структура ЦАП AD5444/AD5446, приспособленная для SPI-цепочки

Интерфейс этих приборов, совместимый с SPI, содержит 16-разрядный сдвиговый регистр с последовательным входом данных SDIN (MOSI), последовательным выходом данных SDO (MISO), входом тактирования сдвига SCLK (SCK) и входом управления SYNC. Три первых вывода по своим функциям полностью аналогичны выводам SPI (они указаны в скобках). Наличие выхода сдвигового регистра SDO позволяет подключить к МК (ведущему) несколько микросхем ЦАП по цепочечной структуре. Захват значения на входе регистра ведомого AD5444/6 происходит по спаду сигнала SCLK, изменение сигнала на этом входе (сдвиг выходного регистра ведущего) должен происходить по нарастанию SCLK. Такая последова тельность действий соответствует Mode 1 (рис. 5). Длина передаваемого в микросхему ЦАП пакета составляет 16 битов, из них два старших выполняют управляющие функции, а последующие 14 битов (в AD5446) или 12 битов (в AD5444) представляют значение отсчета, преобразуемое в напряжение. У программиста есть возможность переключить режим работы SPI в ведомом AD544x, задав значение старших двух битов пакета равным 11, в результате чего ведомый AD544x переключится в Mode 2, захват входного сигнала будет происходить по нарастанию сигнала SCLK.

А вот вход SYNC (SS) выполняет одновременно несколько функций. Во-первых, он низким уровнем активирует в микросхеме ЦАП функцию восприятия сигналов входной линии данных SDIN (MOSI) и линии тактирования SCLK (SCK). Кроме того, по окончании передачи пакета в микросхемы ЦАП переход в высокий уровень сигнала SYNC инициирует передачу полученного 16-битового пакета во входной буфер схемотехники ЦАП (что приведет к появлению нового значения напряжения на аналоговом выходе ЦАП синхронно во всех ведомых), а кроме того, отключает питание от интерфейсных цепей для уменьшения мощности, потребляемой микросхемой ЦАП.

Таким образом, штатный режим работы с цепочкой микросхем ЦАП предполагает установку активного уровня сигнала SYNC (SS), по которому включается питание интерфейсной схемотехники в ЦАП, затем последовательную передачу нужного количества 16-разрядных посылок с учетом порядка включенных в цепочку ведомых (при этом изменения выходных напряжений ЦАП не происходит) и, наконец, выключение активного сигнала SYNC, по которому изменятся одновременно выходные напряжения всех ЦАП в цепочке. Сигнал SYNC должен сохраняться активным (низким) без переключений до окончания передачи всех посылок.

Еще ряд примеров использования SPI

И в случае радиальной схемы с широковещанием, и в последнем примере с цепочечным подключением ЦАП дополнительные возможности были получены в результате наличия и использования высокоуровневого протокола, предполагающего передачу многобайтовых посылок. В примере с широковещанием разработка такого протокола должна выполняться прикладным программистом, в то время как при использовании ИМС AD5444/AD5446 этот протокол специфицирован в их техническом описании.

Широко распространенный отладочный интерфейс JTAG также представляет собой пример реализации высокоуровневого протокола поверх SPI. JTAG предполагает соединение нескольких контролируемых устройств (ведомых) в кольцо и наличие в этом кольце единственного ведущего (JTAG-хоста) [ , , ]. Длины посылок, используемые в JTAG, могут быть достаточно большими, однако их размер кратен 8 битам.

Рассмотрим еще один пример, в котором передача данных осуществляется только в обратном направлении — от ведомого к ведущему, а сигнал SS выполняет дополнительную функцию — запуск операции в периферийном устройстве.


Рис. 11. Диаграмма работы АЦП MAX1240/1241 с интерфейсом SPI и с запуском от сигнала SS

Исходно при неактивном (высоком) уровне сигнала CS выход данных DOUT находится в отключенном (высокоимпедансном) состоянии.

По спаду сигнала CS из ведущего МК в ведомом MAX1240/1241 происходит:

  1. захват входного аналогового сигнала на встроенном устройстве выборки/хранения УВХ;
  2. запуск процесса аналого-цифрового преобразования с одновременным переходом сигнала DOUT в низкий уровень.

По окончании (через 7,5 мкс) процесса АЦ преобразования УВХ переходит из состояния «хранение» (HOLD) в состояние «выборка» (TRACK), а сигнал DOUT — в высокий уровень: последнее сигнализирует микроконтроллеру о готовом результате.

После этого ведущий МК может начать (немедленно или через некоторое время) считывание результата АЦ преобразования путем подачи последовательности тактовых импульсов на линию SCLK. Для его получения ведущий должен инициировать передачу двух байтов из ведомого. В них будет передано 16 битов, из которых первые 12 представляют результат, а последние четыре (нуля) должны быть просто отброшены. На диаграмме показано, что для повторения измерения ведущий должен снять активный уровень сигнала SS на предопределенное время (не менее 0,24 мкс), после чего процесс вновь можно запустить переключением сигнала SS в активный (низкий) уровень.

В этом примере сигнал CS (SS) выполняет в ведомом MAX1240/1 несколько функций:

  1. активирует внутреннюю схемотехнику SPI и выводит из отключенного состояния выход сигнала DOUT (MISO);
  2. запускает процесс аналого-цифрового преобразования в АЦП. Следует обратить внимание на то, что в течение времени, пока происходит АЦ-преобразование, сигнал SS должен иметь активное значение (низкий уровень), но сдвиговые такты должны отсутствовать. Это возможно лишь при программном управлении сигналом SS в ведущем устройстве.

Отдельно нужно сказать о сигнале SHDN в микросхемах MAX1240/MAX1241. Он предназначен для перевода периферийной микросхемы в режим энергосбережения. Для этой цели можно было бы использовать SS, однако внутренней схемотехнике преобразователей напряжения (для АЦП) требуется некоторое время для выхода на режим (около 4 мкс). Разработчики микросхемы могли бы реализовать внутреннюю задержку, но они предпочли использовать дополнительный управляющий сигнал. Это оправдано тем, что при необходимости непрерывного преобразования SHDN нужно включить лишь единожды, а запуск АЦП производить многократно. Для управления сигналом SHDN можно использовать выход порта общего назначения.

Что должна делать программа в ведущем (в МК)?

Вот какой может быть последовательность действий, выполняемая микроконтроллером в последнем примере, если его подсистема SPI имеет стандартную длину пакета 8 битов:

  1. Установить высокий уровень сигнала SHDN (программно).
  2. Подождать не менее 4 мкс (выход на режим преобразователей напряжения для АЦП).
  3. Установить низкий уровень сигнала SS (программно).
  4. Убедиться, что сигнал DOUT принял значение лог. 0 (программно или по прерыванию).
  5. Проверять состояние сигнала DOUT (признак окончания АЦ-преобразования) до тех пор, пока этот сигнал не переключится в лог. 1 (программно или по прерыванию).
  6. Инициировать передачу байта из периферийной микросхемы. Частота следования тактовых импульсов не должна превышать 2,1 МГц.
  7. Дождаться окончания приема первого байта (программно или по прерыванию).
  8. Прочитать и сохранить принятый первый байт.
  9. Инициировать передачу второго байта.
  10. Дождаться окончания приема второго байта (программно или по прерыванию).
  11. Прочитать и сохранить второй байт.
  12. Установить высокий уровень сигнала SS для того, чтобы в будущем можно было без задержек запустить следующее измерение.
  13. При необходимости немедленно выполнить еще одно измерение, установить низкий уровень сигнала SS (время нахождения сигнала SS в высоком уровне между двумя циклами измерения должно быть не меньше 0,24 мкс).
  14. Из полученных двух байтов взять первые 12 битов и записать их в переменную, предназначенную для результата.

Как видим, последовательность достаточно длинная, и нагрузка на МК оказывается значительной, если хочется выполнять измерения с частотой, близкой к максимальной.

И под конец еще более сложный пример ведомого устройства. Фирма Atmel производит микросхемы Flash-памяти с интерфейсом SPI . Рассмотрим особенности подключения микросхемы AT45DB161B с организацией 2M×8 бит. На рис. 12 изображена структурная схема устройства с указанием всех внешних выходов.


Рис. 12. Структура и выводы ИМС Flash-памяти AT45DB161B с интерфейсом SPI

Сигналы SI (MOSI), SO (MISO), SCK (SCK), CS (SS) образуют интерфейс, совместимый с SPI. Обмен с внутренним массивом Flash осуществляется через два буфера размером (512+16) байт. Внутреннее состояние «микросхема занята выполнением операции» либо «операция закончена, микросхема свободна» отражается состоянием сигнала RDY/BUSY. При выполнении длительных операций состояние этого сигнала можно анализировать программно, либо использовать механизм аппаратных прерываний.

Особенностью микросхемы Flash-памяти является то, что при обмене используются многобайтовые пакеты переменной длины. Первый байт каждого пакета является командой, а последующие байты содержат параметры или записываемые данные. Переход сигнала CS в активный (низкий) уровень отмечает начало пакета, а возврат сигнала CS в высокий уровень — конец пакета. Часть пакетов, предназначенных для чтения данных из Flashпамяти, имеют переменную длину. Структура заголовка команд чтения/записи изображена на рис. 13.


Рис. 13. Структура заголовка пакета, содержащего команду и адресную информацию

Как видно на рис. 13, первый байт содержит команду (код операции), а следующие три байта — два параметра: адрес страницы в Flash-массиве и адрес байта в странице, с которого требуется осуществить запись либо чтение. Параметры не выровнены по границам байтов, следовательно, заголовок должен быть сформирован программистом заранее, до начала передачи пакета.

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

SPI-интерфейс: описание

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

Описание работы устройства

Прибор, генерирующий синхроимпульсы (управляющий) на шину тактирования, является «ведущим» (мастер). Такое устройство осуществляет управление всем процессом обмена данными, то есть определяет, когда начать обмен, когда закончить, сколько бит информации передать и т. д. Второй прибор, участвующий в обмене, называется «ведомым». Это устройство никаким образом не влияет на шину тактирования. Для полнодуплексного обмена (передача в обе стороны одновременно) SP- интерфейс использует четыре линии:

- MOSI - выход ведущего и вход ведомого. По этой линии происходит от главного устройства к приемному.

MISO - вход ведущего и выход «ведомого». По этому проводу мастер принимает данные от вспомогательного прибора.

SCLK - шина тактирования. По этой линии «ведущее» устройство генерирует синхроимпульсы.

SS - выбор «ведомого». С помощью этого провода мастер управляет сеансом обмена.

Уровни логического нуля и единицы кодируются величиной напряжения на шине данных (MISO и MOSI). Сигнал SS обозначает конец и начало сеанса обмена информацией. Чаще всего он инверсный. Это значит, что во время обмена данными «ведущее» устройство должно установить на линии SS сигнал низкого уровня, а по окончании обмена - высокого. Наличие уровня SS позволяет организовать передачу по нескольким «ведомым» приборам, используя один синхронизирующий сигнал и одну шину данных без дополнительных протоколов. Правда, при таком подключении необходимо подводить от каждого приемного устройства отдельную линию SS.

SPI (Serial Peripheral Bus ) - последовательный периферийный протокол обмена. Этот прокол был разработан компанией Motorola , но в настоящее время используется многими производителями. Он предназначен для связи микроконтроллеров между собой, а также со всевозможной периферией: датчиками, AЦП, микросхемами памяти, часами. Но все же наиболее частое применение SPI – это запись программы в память микроконтроллера. В микроконтроллерах AVR c помощью SPI можно прошить микроконтроллер не выпаивая из платы, такой способ прошивки называется ISP(In System Programming) . Хотя названия SPI и ISP очень созвучны, это не одно и то же, в AVR SPI используется как физический уровень ISP , то есть используются линии SPI для передачи данных, но сам протокол(программный уровень) отличается.

Для передачи данных в SPI используется три линии:

MISO(Master Input Slave Output) – по этой линии Master(ведущий) принимает данные от Slave(ведомого).

MOSI(Master Output Slave Input) – по этой линии Master отправляет данные Slave.

SCK(Serial Clock) – служит для передачи тактового сигнала ведомому устройству.

Также используется линия SS(Slave Select) , которая определяет устройство с которым Master будет обмениваться данными.

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


SPI бывает двух видов аппаратный и программный. При реализации программного SPI , мы вручную должны устанавливать сигнал на ножках соответствующих MISO, MOSI, SS при этом дёргать за SCK . При аппаратной реализации SPI мы передаём данные в специальный регистр, а микроконтроллер сам проделывает вышеописанные манипуляции, по предварительным настройкам.

Физическая реализацию SPI , представляет собой два соединённых вместе сдвиговых регистра.


В зависимости от того по какому логическому уровню сигнала SCK , происходит синхронизация Master и Slave и по какому фронту происходит захват и сдвиг данных, возможны 4 режима SPI .

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


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

SPI - синхронный интерфейс, то есть для того чтобы получить какие-нибудь данные от Slave , Master должен что-нибудь отправить. Вроде всё понятно, но что если Master отправляет один байт, а Slave должен вернуть ему два? В таком случае Master должен отправить ему что-нибудь 2 раза, например 0х00.
//отправляем команду, в ответ должно прийти два байта Spi_Master_Transmit(chx); //отправляем что-нибудь для того чтобы принять первый байт Spi_Master_Transmit(0X00); touch_x = SPDR; touch_x <<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
На этом всё, выше пример кода взятый из рабочего проекта.

Serial Peripheral Interface или SPI - последовательный периферийный интерфейс, служит для связи периферии и микроконтроллера. Например, в качестве периферии может быть: дисплей, различные датчики, FLASH память, SD карта (да, да, SD карта или «флешка» которую вы используете в телефонах и фотоаппаратах общается с внешним миром с помощью интерфейса SPI) и т.д.

К сожалению официальной документации на интерфейс SPI нет, поэтому данный пост основывается на различных статьях в Интернете, собственного опыта и документации на микроконтроллеры.

О том что такое SPI читайте в статьях википедии

В SPI всегда есть один ведущий и один/несколько ведомых.

Передачу данных всегда инициализирует ведущий.

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

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

P.S. Для обеспечения односторонней связи с одним устройством, достаточно использовать SCLK , MOSI (в случае если ведомое устройство только принимает) или SCLK , MISO (в случае если ведомое устройство ничего не принимает, а только передает информацию). На входе CS ведомого устройства должен быть установлен логический ноль , иначе ведомый не будет работать.

P.S. Если ведомое устройство и передает и принимает, то можно ограничиться тремя проводами – MISO , MOSI , SCLK , на вход CS ведомого устройства также необходимо установить логический ноль .

SPI может быть реализован в микроконтроллере аппаратно , тогда задача по управлению интерфейсом решается для каждого микроконтроллера отдельно, т.к. реализации могут быть разными. Например, для ATmega328Р (микроконтроллер компании Atmel) при работе с SPI нам нужно самим программным путем установить на SS логический ноль при начале приема/передачи и установить логическую единицу обратно при окончание передачи .

Для передачи данных к ведомому устройству, нужно в сдвигающий регистр MASTER-а (на изображение сдвигающий регистр мастера — «8 BIT SHIFT REGISTER ») записать байт передаваемой информации . При этом автоматически на SCK начнет генерироваться синхросигнал . Это и есть аппаратная реализация.

Если аппаратной поддержки SPI в микроконтроллере нет, то интерфейс SPI можно всегда реализовать программно , т.е. создать программу управляющая ножками контролера согласно протоколу обмена SP.

Различия в реализациях интерфейса SPI

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

  • в размере передающих данных или размер пакета , обычно это 8 бит , но бывает и больше
  • в порядке следования бит , сначала старший бит или сначала младший бит
  • по какому уровню синхросигнала передаются данные (по логической единицы (HIGH) или логическому нулю (LOW))
  • по какому фронту импульса происходит синхронизация (по подъему или спуску), кратко это называют «фазой синхронизации»

Комбинация «уровня синхронизирующего сигнала » и «фазы синхронизации » определяется в спецификациях как режимы работы SPI . Их всего 4-е :

Режим Уровень сигнала (CPOL) Фаза (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

В столбце «Уровень сигнала » 1-ца , означает, что бит данных , принимаются ведомым устройством, когда по линии синхронизации передается ноль , другими словами — ведомое устройство ожидает и не принимает данные, когда на SCK установлена логическая 1-ца .

В столбце «Фаза » 1-ца , означает, что сигнал синхронизации определяется по спадающему фронту синхроимпульса , а логический 0-ль по нарастающему фронту синхроимпульса .

P.S. Причем если в столбце «Уровень сигнала » установлена 1-ца , то спадающий и нарастающий фронт если изобразить на диаграмме будет «вверх ногами ».

На диаграммах, данные 4-е режима можно изобразить следующим образом:

Более подробно о принципах работы SPI вы можете прочесть в статье

http://www.kit-e.ru/articles/interface/2009_03_53.php

Реализация SPI на микроконтроллерах ATmega серии AVR (ATmega328P) и «ранних» МК фирмы Motorola

В микроконтроллере ATmega328P (микроконтроллер фирмы Atmel серии AVR) можно управлять следующими параметрами SPI :

Для настройки и управлением SPI интерфейсом используют три регистра:

  • Регистр управления — SPCR
  • Регистр состояния — SPSR
  • Регистр данных — SPDR

Подробнее о каждом из них …

Регистр управления – « SPCR » 0x2C , адрес для записи 0x4C

— Логическая единица в 7-ом бите (имя бита SPIE ) – разрешить прерывания от SPI (прерывание будет в том случае если установлен бит глобального разрешения прерываний регистра SREG (7-й бит)). После окончания передачи байта будет сгенерировано прерывание.

— Логическая единица в 6-ом бите (имя бита — SPE ) — подключить SS, MOSI, MISO и SCK к портам микроконтроллера ATmega328P — PB2,PB3,PB4,PB5 .

— Логическая единица в 5-ом бите (имя бита DORD ) – определит, что по SPI сначала передается младший разряд , а потом старший – режим «LSB». Логический ноль, наоборот, что сначала передается старший разряд, а далее младший – режим «MSB».

— Логическая единица в 4-ом бите (имя бита — MSTR ) — режим ведущий включить , ноль – включить режим ведомого

— Логическая единица в 3-ем бите (имя бита CPOL ) (полярность сигнала синхронизации или уровень синхронизации) – синхронизация ведется по отсутствию импульса (по логическому нулю) или тактовый сигнал в состоянии ожидания равен 1-цы. Логический ноль — синхронизация ведется по присутствию импульса (по логической единицы) или тактовый сигнал в состоянии ожидания равен 0-лю. По какому фронту (спад или подъем) ведется синхронизация определяется в 2-ом бите (CPHA ).

— Логическая единица в 2-ом бите (имя бита CPHA ) (фаза синхронизации) – определяет, что сигнал синхронизации определяется по спадающему фронту SCK , а логический ноль по нарастающему фронту SCK . Причем если в CPOL установлена 1-ца, то спадающий и нарастающий фронт если изобразить на диаграмме «вверхногами».

1-ый и 0-ой бит совместно с битом SPI2x в регистре SPSR определяют скорость передачи данных по SPI (или скорость тактовый сигналов по SCK). Данные биты имеют смысл только для ведущего, для ведомого они бессмысленны, т.к. скорость приема зависит от частоты SCK ведущего.

Где fosc тактовая частота задающего генератора SPI (обычно она равна частоте тактирования процессора).

Регистр состояния – «SPSR» (адрес в ATmega328P для чтения 0x2D , адрес для записи 0x4D , если у вас другой МК, то найти адреса вы можете в документации)

7-ой бит регистра «SPIF »: SPI Interrupt Flag

В бит устанавливается единица , когда передача байта данных по MOSI закончена . Если установлен бит разрешения прерывания SPI (бит SPIE) в регистре SPCR, то установка флага SPIF приводит к генерации запроса на прерывание.

6-ой бит регистра «WCOL »: Write COLlision Flag

Бит конфликта записи в регистр SPDR . В бит устанавливается единица , если во время передачи данных выполняется попытка записи в регистр данных SPDR .

— с 5-ого по 1-ый бит – зарезервированные биты, их значение всегда равняется 0-лю

0-ой бит «SPI2X »: Double SPI Speed Bit

Бит «двойная скорость передачи данных ». Если в бит записана единица , то скорость передачи данных удвоенная . С помощью сочетания данного бита и 1-ого и 0-ого бита (SPR1 , SPR0 ) регистра SPCR , определяют скорость передачи данных по SPI. .

Регистр данных – «SPDR» (адрес в ATmega328P для чтения 0x2E , адрес для записи 0x4E , если у вас другой МК, то найти адреса вы можете в документации)

Размер регистра, как и выше указанных — 8 бит . Данный регистр используется для передачи и чтения данных по SPI . Помещая данные в него, вы запускаете процесс передачи.

Рассмотрим 3-и примера работы с интерфейсом SPI на ATmega328P в средах:

— Arduino

#include byte x=B11000000; //передаваемый бит byte y= B00000000; //в переменную y будет записываться принимающий бит void setup() { SPI.begin(); /* инициализация SPI */ /* инициализация в Arduino это значит - установить единицу в SS - настроить на выход SS (Slave Select или выбор ведомого) - 10 пин - установить 1-цу в следующие битах регистра управления SPCR: в 4-ый бит (имя бита - MSTR) - режим ведущий включить в 6-ой бит (имя бита - SPE) - подключить SS, MOSI, MISO и SCK к портам PB4,PB5,PB6,PB7 (10,11,12,13 пин в ардуино) - настроить следующие пины на выход: SCK (Serial Clock или тактовый сигнал) - 13 пин MOSI (Master Out Slave In или данные от ведущего) - 11 пин В резульлтате иницилизации через SPI.begin() конфигурация интерфейса SPI у нас выходит следующая: - очередность битов "MSB", т.е. сначала передается старший разряд, а далее младший - синхронизация ведется по присутствию импульса или тактовый сигнал в состоянии ожидания равен 0-лю - сигнал синхронизации определяется по нарастающему фронту SCK (два пункта выше указывают, что режим SPI в данном случае - 0) - скорость передачи fosc/4 */ // МЫ МОЖЕМ ДОИНИЦИЛИЗИРОВАТЬ НЕКОТОРЫЕ ПАРАМЕТРЫ СВЯЗИ по SPI сами // порядок следования бит //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - сначала младший, далее старший MSBFIRST - сначала старший, далее младший (стоит по умолчанию от SPI.begin) */ // частота обмена данными //SPI.setClockDivider(SPI_CLOCK_DIV4); /* определяется как отношение fosc к коэфициенту, возможные значения которого: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //режим работы SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - нулевой режим SPI_MODE1 - первый режим SPI_MODE2 - второй режим SPI_MODE3 - третий режим */ } void loop() { /* РЕАЛИЗАЦИЯ ПЕРЕДАЧИ ДАННЫХ ПО SPI */ digitalWrite(10, HIGH); /* от нас треубется, самому установить в SS 1-цу */ y=SPI.transfer(x); /* передача по битно аргумента (байта) и прием ответа от ведомого уст-ва передача осуществляется присваиванием регистру SPDR значение байта причем в это время автоматрически на SCK (13 пин) формируется тактовый сигнал */ digitalWrite(10, LOW); /* от нас треубется, самому установить в SS 0-ль */ SPI.end(); /* отключает шину SPI от 10,11,12,13 пинов */ /* Т.е. устанавливает 0-оль в 6-ой бит (SPE) регистра SPCR */ }

#include

byte x = B11000000 ; //передаваемый бит

byte y = B00000000 ; //в переменную y будет записываться принимающий бит

void setup () {

SPI . begin () ; /* инициализация SPI */

/* инициализация в Arduino это значит

Установить единицу в SS

Настроить на выход SS (Slave Select или выбор ведомого) - 10 пин

Установить 1-цу в следующие битах регистра управления SPCR:

В 4-ый бит (имя бита - MSTR) - режим ведущий включить

В 6-ой бит (имя бита - SPE) - подключить

SS, MOSI, MISO и SCK

К портам PB4,PB5,PB6,PB7

(10,11,12,13 пин в ардуино)

Настроить следующие пины на выход:

SCK (Serial Clock или тактовый сигнал) - 13 пин

MOSI (Master Out Slave In или данные от ведущего) - 11 пин

В резульлтате иницилизации через SPI.begin()

Конфигурация интерфейса SPI у нас выходит следующая:

Очередность битов "MSB", т.е. сначала передается старший разряд, а далее младший

Синхронизация ведется по присутствию импульса

Или тактовый сигнал в состоянии ожидания равен 0-лю

Сигнал синхронизации определяется по нарастающему фронту SCK

(два пункта выше указывают, что режим SPI в данном случае - 0)

Скорость передачи fosc/4

// МЫ МОЖЕМ ДОИНИЦИЛИЗИРОВАТЬ НЕКОТОРЫЕ ПАРАМЕТРЫ СВЯЗИ по SPI сами

// порядок следования бит

//SPI.setBitOrder(MSBFIRST);

// частота обмена данными

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* определяется как отношение

Fosc к коэфициенту, возможные значения которого:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//режим работы SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - нулевой режим

SPI_MODE1 - первый режим

SPI_MODE2 - второй режим

SPI_MODE3 - третий режим

void loop ()

/* РЕАЛИЗАЦИЯ ПЕРЕДАЧИ ДАННЫХ ПО SPI */

digitalWrite (10 , HIGH ) ; /* от нас треубется, самому установить в SS 1-цу */

y = SPI . transfer (x ) ; /* передача по битно аргумента (байта) и прием ответа от ведомого уст-ва

Передача осуществляется присваиванием регистру SPDR значение байта

Причем в это время автоматрически на SCK (13 пин)

Формируется тактовый сигнал */

digitalWrite (10 , LOW ) ; /* от нас треубется, самому установить в SS 0-ль */

SPI . end () ; /* отключает шину SPI от 10,11,12,13 пинов */

/* Т.е. устанавливает 0-оль в 6-ой бит (SPE) регистра SPCR */

— Atmel Studio (AVR GCC)

#include #include void init_spi() { DDRB=(1<

#include

#include

void init_spi () {

DDRB = (1 << PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//конфигурируем выводы для SPI (SS, SCK, MOSI - выход, MOSI вход)

// SPI initialization

// SPI Type: Master

// SPI Clock Rate: 2000,000 kHz

// SPI Clock Phase: Cycle Start

// SPI Clock Polarity: Low

// SPI Data Order: MSB First

SPCR = (0 << SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;