Что такое spi. Последовательный интерфейс SPI (3-wire). Обзор SPI подсистемы в Linux

Интерфейсы передачи.

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

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

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

Рассмотрим несколько наиболее популярных интерфейсов поближе.

Интерфейс USART.

Интерфейс USART - последовательный универсальный синхронно-асинхронный приемо-передатчик. Передача данных в USART осуществляется через равные промежутки времени. Этот временной промежуток определяется заданной скоростью USART и указывается в бодах (Для символов, которые могут принимать значения, равные только нулю или единице бод эквивалентен битам в секунду). Существует общепринятый ряд стандартных скоростей: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бод.

Помимо бит данных USART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются. Обычно стартовый и стоповый биты отделяют один байт информации (8 бит), однако встречаются реализации USART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Биты, отделённые стартовым и стоповым сигналами, являются минимальной посылкой. USART позволяет вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии.

Принято соглашение, что пассивным (в отсутствие данных) состоянием входа и выхода USART является логическая «1». Стартовый бит всегда логический «0», поэтому приёмник USART ждёт перепада из «1» в «0» и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё «0», то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-бит данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит). Значение стоп-бита всегда «1», если реально принятое значение иное, USART фиксирует ошибку.

Для формирования временных интервалов передающий и приёмный USART имеют источник точного времени (тактирования). Точность этого источника должна быть такой, чтобы сумма погрешностей (приёмника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половины (а лучше хотя бы четверти) битового интервала. Для 8-бит посылки 0,5/9,5 = 5 % (в реальности не более 3 %). Поскольку эта сумма ошибок приёмника и передатчика плюс возможные искажения сигнала в линии, то рекомендуемый допуск на точность тактирования USART не более 1,5 %.

Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1 синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92160 бит/с или 11 520 байт/с.

Контроль чётности

В протоколе USART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных («бит чётности») всегда принимает значение 1 или 0, так чтобы количество единиц в байте всегда было четным.

Управление потоком

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

Физическая реализация.

USART это протокол обмена, т.е. он определяет способ формирования бита, параметры передачи байта, скорость передачи и прочее.

А вот физическая реализация у USART-a может быть различная. Например, для передачи данных внутри одной платы сигналы передаются уровнями +5В и 0В. Для передачи данных на длинные расстояния и между устройствами применяются другие физические уровни напряжений и стандарты такие как: токовая петля (4-20 мА), RS-232 (COM-порт), RS-485 и тому подобные.

Для преобразования «контроллерных» уровней 0-5В в «стандартные» существует огромное количество специализированных микросхем, например ADM202 для RS-232.

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

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

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

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

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

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

Чтобы подчиненная ИС принимала и передавала данные, помимо наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние. В противном случае, подчиненная ИС будет неактивна. Когда используется только одна внешняя ИС, может возникнуть соблазн исключения и линии SS за счет жесткой установки низкого уровня на входе выбора подчиненной микросхемы. Такое решение крайне нежелательно и может привести к сбоям или вообще невозможности передачи данных, т.к. вход выбора микросхемы служит для перевода ИС в её исходное состояние и иногда инициирует вывод первого бита данных.

При необходимости подключения к шине SPI нескольких микросхем используется либо независимое (параллельное) подключение (рис. 7.3), либо каскадное (последовательное) (рис. 7.4). Независимое подключение более распространенное, т.к. достигается при использовании любых SPI-совместимых микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое состояние, задает, с какой подчиненной ИС он будет обмениваться данными. Главным недостатком такого подключения является необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3+n, где n-количество подчиненных микросхем).

В случае нехватки ножек микроконтроллера можно использовать микросхему демультиплексора. Демультиплексор подключает единственный входной сигнал к одному из выходных сигналов, в зависимости от кода на управляющих ножках. На рис 7.4 представлена схема подключения демультиплексора. На его вход подаётся сигнал SS, который принимает значение, равное 0, если необходимо выбрать одну из микросхем. Номер нужной микросхемы в двоичном коде подаётся на ножки Am-A0. Это позволяет уменьшить количество используемых в микроконтроллере ножек до m=log 2 n. Где n – количество подчинённых микросхем. Т.е. для подключения 128-ми устройств требуется 8 выводов микроконтроллера. Один для установки разрешающего сигнала и 7 для установки номера включаемой микросхемы. Необходимо отметить, что на неподключенных ножках демультиплексора должна быть логическая единица. В противном случае используется инвертер сигнала, преобразующий логический ноль в логическую единицу.

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

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

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

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

· CPHA - фаза синхронизации; от этого параметра зависит, в какой последовательности выполняется установка и выборка данных. Если CPHA=0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем, по заднему фронту, - установка данных. Если же CPHA=1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка - по заднему.

Информация по режимам SPI представлена на рис 7.7 и 7.8.

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

Интерфейс RS-485

Интерфейс RS-485 (другое название - EIA/TIA-485) - один из наиболее распространенных стандартов физического уровня связи. Физический уровень - это канал связи и способ передачи сигнала (1 уровень модели взаимосвязи открытых систем OSI).

Сеть, построенная на интерфейсе RS-485, представляет собой приемопередатчики, соединенные при помощи витой пары - двух скрученных проводов. В основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных. Суть его заключается в передаче одного сигнала по двум проводам. Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) - его инверсная копия. Другими словами, если на одном проводе "1", то на другом "0" и наоборот. Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при "1" она положительна, при "0" – отрицательна (рис 7.9).

Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе. Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал. Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего ("земли"). Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель - дополнительный источник искажений. А при дифференциальной передаче искажения не происходит. В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова. Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.

Аппаратная реализация интерфейса RS485.

Аппаратная реализация интерфейса - микросхемы приемопередатчиков с дифференциальными входами/выходами (к линии) и цифровыми портами (к портам UART контроллера). Существуют два варианта такого интерфейса: RS-422 и RS-485.

RS-422 - полнодуплексный интерфейс. Прием и передача идут по двум отдельным парам проводов. На каждой паре проводов может быть только по одному передатчику.

RS-485 - полудуплексный интерфейс. Прием и передача идут по одной паре проводов с разделением по времени. В сети может быть много передатчиков, так как они могут отключаются в режиме приема (рис 7.10).

Расшифровка обозначений на рис 7.10

D (driver) - передатчик;
R (receiver) - приемник;
DI (driver input) - цифровой вход передатчика;
RO (receiver output) - цифровой выход приемника;
DE (driver enable) - разрешение работы передатчика;
RE (receiver enable) - разрешение работы приемника;
A - прямой дифференциальный вход/выход;
B - инверсный дифференциальный вход/выход;
Y - прямой дифференциальный выход (RS-422);
Z - инверсный дифференциальный выход (RS-422).

Подробнее остановимся на приемопередатчике RS-485. Цифровой выход приемника (RO) подключается к порту приемника UART (RX). Цифровой вход передатчика (DI) к порту передатчика UART (TX). Поскольку на дифференциальной стороне приемник и передатчик соединены, то во время приема нужно отключать передатчик, а во время передачи - приемник. Для этого служат управляющие входы - разрешение приемника (RE) и разрешения передатчика (DE). Так как вход RE инверсный, то его можно соединить с DE и переключать приемник и передатчик одним сигналом с любого порта контроллера. При уровне "0" - работа на прием, при "1" - на передачу (рис 7.11).

Приемник, получая на дифференциальных входах (AB) разность потенциалов (UAB) переводит их в цифровой сигнал на выходе RO. Чувствительность приемника может быть разной, но гарантированный пороговый диапазон распознавания сигнала производители микросхем приемопередатчиков пишут в документации. Обычно эти пороги составляют ± 200 мВ. То есть, когда UAB > +200 мВ - приемник определяет "1", когда UAB < -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Все устройства подключаются к одной витой паре одинаково: прямые выходы (A) к одному проводу, инверсные (B) - к другому.

Входное сопротивление приемника со стороны линии (RAB) обычно составляет 12 КОм. Так как мощность передатчика не беспредельна, это создает ограничение на количество приемников, подключенных к линии. Согласно спецификации RS-485 c учетом согласующих резисторов передатчик может вести до 32 приемников. Однако есть ряд микросхем с повышенным входным сопротивлением, что позволяет подключить к линии значительно больше 32 устройств.

Максимальная скорость связи по спецификации RS-485 может достигать 10Мбод/сек. Максимальное расстояние – 1200 метров. Если необходимо организовать связь на расстоянии большем 1200 метров или подключить больше устройств, чем допускает нагрузочная способность передатчика - применяют специальные повторители (репитеры).

Интерфейс I2C.

Этот интерфейс был предложен фирмой Philips, которая применила его для организации связи между микросхемами в своих телевизорах. I 2 C (аббревиатура слов Inter-Integrated Circuit) представляет собой двунаправленную асинхронную шину с последовательной передачей данных. Физически шина I 2 C представляет собой две сигнальные линии, одна из которых (SCL) предназначена для передачи тактового сигнала, а вторая (SDA) для обмена данными. Для управления линиями применяются выходные каскады с открытым коллектором, поэтому линии шины должны быть подтянуты к источнику питания +5 В через резисторы сопротивлением 1...10 кОм, в зависимости от физической длины линий и скорости передачи данных. Длина соединительных линий в стандартном режиме может достигать 2-х метров, скорость передачи данных – 100 кбит/с.

Все абоненты шины делятся на два класса – «Ведущий» и «Ведомый». Ведущее устройство генерирует тактовый сигнал (SCL). Оно может самостоятельно выходить на шину и адресовать любое ведомое устройство с целью передачи или приёма информации. Все ведомые устройства "слушают" шину на предмет обнаружения собственного адреса и, распознав его, выполняют предписываемую операцию. Кроме того, возможен так называемый "MultiMaster"-режим, когда на шине установлено несколько ведущих устройств, которые либо совместно разделяют общие ведомые устройства, либо попеременно являются то ведущими, когда сами инициируют обмен информацией, то ведомыми, когда находятся в режиме ожидания обращения от другого ведущего устройства. Режим "MultiMaster" требует постоянного слежения и распознавания конфликтов. В связи с этим, данный режим сложнее в реализации (имеется ввиду программная реализация) и, как следствие, реже используется в реальных изделиях.

В начальный момент времени – в режиме ожидания – обе лини SCL и SDA находятся в состоянии логической единицы (транзистор выходного каскада с открытым коллектором закрыт). В режиме передачи (рис 7.12) бит данных SDA тактируется восходящим фронтом SCL. Смена информации на линии SDA производится при нулевом состоянии линии SCL. Ведомое устройство может "придерживать" линию SCL в нулевом состоянии, например, на время обработки очередного принятого байта, при этом ведущее устройство обязано дождаться освобождения линии SCL, прежде чем продолжать передачу информации.

Для синхронизации пакетов шины I 2 C различают два условия – "START" и "STOP", ограничивающие начало и конец информационного пакета (рис 7.13). Для кодирования этих условий используется изменение состояния линии SDA при единичном состоянии линии SCL, что недопустимо при передаче данных. "START"-условие образуется при появлении нисходящего фронта на линии SDA, когда линия SCL находится в единичном состоянии, и наоборот, "STOP"-условие образуется при появлении восходящего фронта линии SDA при единичном состоянии линии SCL.

Передача данных начинается по первому восходящему фронту на линии SCL, которым тактируется старший бит первого информационного байта. Каждый информационный байт (8 битов) содержит 9 тактовых периодов линии SCL. В девятом такте устройство-получатель выдаёт подтверждение (ACK) – нисходящий фронт, свидетельствующий о приёме данных. Следует отметить, что любой абонент шины, как ведущий, так и ведомый может в разные моменты времени быть как передатчиком, так и получателем и в соответствии с режимом обязан либо принимать, либо выдавать сигнал ACK, отсутствие которого интерпретируется как ошибка.

Чтобы начать операцию обмена данными, ведущее устройство выдаёт на шину "START"-условие. За "START"-условием следует байт с адресом ведомого устройства (рис 7.14), состоящий из семибитового адреса устройства (биты 1...7) и однобитового флага операции чтения-записи - "R/W" (бит 0). Бит R/W определяет направление обмена, причём 0 означает передачу данных от ведущего к ведомому (рис 7.14а), а 1 – чтение из ведомого (рис 7.14б). Все биты по шине I 2 C передаются в порядке от старшего к младшему, то есть первым передаётся 7-ой бит, последним 0-ой. За адресом могут следовать один или более информационных байтов (в направлении, определённом флагом R/W), биты которых тактируются ведущим устройством по шине SCL.

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

Допускается многократное возобновление адреса ведомого устройства в одном цикле передачи, то есть передача повторного "START"-условия без предварительного "STOP"-условия (рисунок 7.14в).

Необходимо отметить некоторые особенности микросхем памяти, работающих по интерфейсу I 2 C, и процедур обмена данными с ними. Во-первых, энергонезависимая память данных этих микросхем разбита на страницы памяти, поэтому при записи байта вначале происходит копирование всей страницы во внутреннюю оперативную память микросхемы, где производится изменение нужной ячейки. После этого, производится стирание старой страницы и запись на её место новой. Ещё одной особенностью является то, что старшие четыре бита адреса ведомого устройства всегда должны быть равны 1010. Это требование регламентировано самой фирмой Philips.

Шина 1-Wire использует только один проводник для связи и питания. Режим связи – асинхронный и полудуплексный, который строго следует схеме ведущий-подчиненный. К одной и той же шине могут быть одновременно подключено одно или несколько подчиненных устройств. К одной шине может быть подключено только одно ведущее устройство.

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

Передача сигналов по шине 1-Wire разделена на временные слоты длительностью 60 мкс. Одним временным слотом передается только один бит данных. Подчиненным устройствам допускается иметь существенные отличия от номинальных выдержек времени. Однако это требует более точного отсчета времени ведущим, чтобы гарантировать корректность связи с подчиненными, у которых различаются временные базисы.

Основные сигналы шины.

Ведущий инициирует каждую связь на битном уровне. Это означает, что передача каждого бита, независимо от направления, должна быть инициирована ведущим. Это достигается установкой низкого уровня на шине, который синхронизирует логику всех остальных устройств. Существует 5 основных команд для связи по шине 1-Wire: “Запись лог. 1”, “Запись лог. 0”, “Чтение”, “Сброс” и “Присутствие”.

Сигнал “Запись лог. 1”

Сигнал “Запись лог. 1” показан на рис. 7.15. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого, в течение оставшейся части временного слота он освобождает шину.

Рис. 7.15 – Сигнал «Запись лог. 1»

Сигнал “Запись лог. 0”

Сигнал “Запись лог. 0” показан на рис 7.16. Ведущий формирует низкий уровень в течение не менее 60 мкс, но не дольше 120 мкс.

Рис 7.16 – Сигнал «Запись лог. 0»

Сигнал “Чтение”

Сигнал “Чтение” показан на рис. 7.17. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого подчиненный удерживает шину в низком состоянии, если желает передать лог. 0. Если необходимо передать лог. 1, то он просто освобождает линию. Сканирование шины необходимо выполнять по истечении 15 мкс после установки низкого уровня на шине. Если смотреть со стороны ведущего, сигнал “Чтение” является, в сущности, сигналом «Запись лог. 1». Собственно внутреннее состояние подчиненного будет определять это сигнал «Запись лог. 1» или «Чтение».

Рис 7.17 – Сигнал «Чтение»

Сигнал “Сброс/присутствие”

Сигналы “Сброс” и “Присутствие” показаны на рис 7.18. Обратите внимание, что временные интервалы импульсов отличаются. Ведущий устанавливает низкий уровень в течение 8 временных слотов (480 мкс), а затем освобождает шину. Данный длительный период низкого состояния называется сигнал «Сброс».

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

USB (Universal serial bus) разрабатывался для оперативного подключения внешних устройств к персональному компьютеру с последующим нахождением и установкой нужного программного обеспечения. Питание маломощных устройств производится непосредственно через интерфейс.

Стандарт USB подразумевает в сети наличие только одного ведущего (Host) устройства. При этом стандарт поддерживает до 127 ведомых устройств в сети. Для различения ведущих и ведомых устройств были разработаны разные виды разъёмов (рис 7.19): Тип А – для ведущего и Тип В для ведомого. Принято, что напряжение 5В присутствует только на разъёме типа А, являющего ведущим. Остальные же устройства питаются непосредственно от него.

В стандарте USB используется 4 экранированных провода, из которых два передают питание (+5v & GND) (рис 7.19 и таблица 7.2). Остальные два представляют витую пару (twisted pair) дифференциальных сигналов данных. Используется схема кодирования NRZI (Non Return to Zero Invert, без возврата к нулю с инверсией) для передачи данных с полем синхронизации для синхронизации тактов ведущего и ведомых устройств.

В стандарте USB 2.0 появился стандарт On-The-Go (OTG), в котором введен протокол Host Negotiation Protocol, позволяющий двум устройствам USB договориться, кто будет выполнять роль ведущего. Это предназначено и ограничено одиночными подключениями точка-точка, например мобильный телефон – персональный компьютер.

USB поддерживает «горячее» (plug’n’play) соединение с динамически загружаемыми и выгружаемыми драйверами. Пользователь просто втыкает устройство, подключая его тем самым к шине. Хост детектирует присоединение, опрашивает свежевставленное устройство и загружает подходящий драйвер, индицируя песочными часами на экране момент загрузки (если драйвер для устройства USB уже установлен в системе). Конечный пользователь не заботится ни о терминировании, ни об IRQ (прерываниях) и адресах портов, ни о перезагрузке компьютера (перезагрузка не требуется). Когда пользователь закончил работу с USB-устройством, он просто вынимает его (или отсоединяет кабель), хост обнаружит отсутствие устройства и автоматически выгрузит драйвер.

SB версии 1.1 поддерживает две скорости – режим full speed со скоростью 12 Mbits/s и режим low speed со скоростью 1.5 Mbits/s. Режим 1.5 Mbits/s медленнее, и менее чуствителен к EMI (помехам), чем уменьшает стоимость ферритовых колец и снижает требования к качеству компонентов.

Кабель для поддержки полной скорости шины (full-speed) выполняется как витая пара, защищается экраном и может также использоваться для работы в режиме минимальной скорости (low-speed). Кабель для работы только на минимальной скорости (например, для подключения мыши) может быть любым и неэкранированным.

В стандарте USB 2.0 вводится режим High Speed со скоростью передачи данных 480Mbits/s.

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

Все передачи данных по интерфейсу инициируются хостом. Данные передаются в виде пакетов. В интерфейсе USB используется несколько разновидностей пакетов:

А) пакет-признак (token paket ) описывает тип и направление передачи данных, адрес устройства и порядковый номер конечной точки (КТ - адресуемая часть USB-устройства); пакет-признаки бывают нескольких типов: IN , OUT , SOF , SETUP ;

Б) пакет с данными (data packet ) содержит передаваемые данные;

В) пакет согласования (handshake packet ) предназначен для сообщения о результатах пересылки данных; пакеты согласования бывают нескольких типов: ACK , NAK , STALL .

Передача данных по USB производится следующим образом:

Первый пакет, так называемый token, генерируется ведущим устройством для описания типа передаваемых данных, операции передачи (чтение или запись), адрес устройства и конечной точки (endpoint). Следующим обычно передаётся пакет данных, несущий полезную информацию, за которым идет пакет согласования (handshaking packet), сообщающий о том, что данные или token были приняты успешно, или конечная точка (endpoint) остановлена (stalled) или недоступна для принятия данных.

Конечными точками в стандарте USB называются источники и приёмники данных. Все устройства должны поддерживать конечную точку 0. Это конечная точка, которая принимает все управляющие запросы и запросы статуса во время энумерации (запрос дескриптора для определения типа подключенного устройства) и в течение всего времени, когда устройство остается работоспособным на шине.

Конечные точки с номерами от 1 используются для передачи пользовательской информации. Рассмотрим пару примеров.

Драйвер устройства передаёт на конечную точку ЕР1 ведущего устройства. Т.к. данное устройство является ведущим, то данные попадают в OUT буфер ЕР1. При этом посылается токен OUT, говорящий о готовности данных к отправке. Получив этот токен, ведомое устройство может считать данные из буфера OUT.

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

Передача данных от одной конечной точки к другой производится через потоки. Поток – логическое соединение между хостом и конечной точкой (точками).

Потоки также имеют набор параметров, таких как тип передачи (Control, Bulk, Iso или Interrupt), направление потока данных и максимальные размеры пакета/буфера.

Например, поток по умолчанию – это двунаправленный поток, составленный из IN конечной точки 0 и OUT конечной точки 0 с типом передачи control.

USB определяет два типа потоков (pipes)

А) Stream Pipes не имеют предопределенного USB формата, поэтому Вы можете послать данные любого типа через stream pipe и восстановить данные на другом конце. Потоки данных последовательны и имеют предопределенную направленность – IN или OUT. Stream pipes поддерживают типы передач bulk, isochronous и interrupt. Stream pipes могут управляться либо от хоста, либо от устройства.

Б) Message Pipes имеют предопределенный USB формат. Они управляются хостом, инициируются запросом, отправляемым от хоста. Данные пересылаются в нужном направлении, заданном в запросе. Таким образом, message pipes позволяют передавать данные в обоих направлениях, но поддерживают только передачи control.

Стандарт USB описывает четыре типа передачи данных:

А) Управляющая пересылка (control transfer ) используется для конфигурации устройства, а также для других специфических для конкретного устройства целей.

Б) Потоковая пересылка (bulk transfer ) используется для передачи относительно большого объема информации.

В) Пересылка с прерыванием (iterrupt transfer ) испольуется для передачи относительно небольшого объема информации, для которого важна своевременная его пересылка. Имеет ограниченную длительность и повышенный приоритет относительно других типов пересылок.

Г) Изохронная пересылка (isochronous transfer ) также называется потоковой пересылкой реального времени. Информация, передаваемая в такой пересылке, требует реального масштаба времени при ее создании, пересылке и приеме.

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


Микроконтроллеры AVR имеют в своем составе модули, реализующие стандартные интерфейсы. Эти модули используются для обмена данными с различными периферийными устройствами, например, цифровыми датчиками, микросхемами памяти, ЦАП, АЦП, другими микроконтроллерами и так далее. В этой статье, на примере микроконтроллера atmega16, мы разберемся, как работать с модулем последовательного периферийного интерфейса или модулем SPI (serial peripheral interface).

Введение

SPI представляет собой четырехпроводную синхронную шину, предназначенную для последовательного обмена данными между микросхемами. Интерфейс был разработан компанией Motorola, но в настоящий момент используется всеми производителями. Данный интерфейс отличают простота использования и реализации, высокая скорость обмена и малая дальность действия.
При любом обмене данными по SPI одно из устройств является ведущим (Master"ом), а другое ведомым (Slave"ом). Обычно (но не всегда) в роли ведущего выступает микроконтроллер. Ведущий переводит периферийное устройство в активное состояние и формирует тактовый сигнал и данные. В ответ ведомое устройство передает ведущему свои данные. Передача данных в обе стороны происходит синхронно с тактовым сигналом.
Физически SPI реализуется на основе сдвигового регистра, который выполняет и функцию передатчика, и функцию приемника.
Принцип обмена данными по SPI проиллюстрирован на следующих картинках.

Сигналы, используемые данным интерфейсом, имеют следующее назначение:

MOSI - Master Output / Slave Input. Выход ведущего / вход ведомого. Служит для передачи данных от ведущего устройства к ведомому.
MISO
– Master Input / Slave Output. Вход ведущего / выход ведомого. Служит для передачи данных от ведомого устройства к ведущему.
SLK - Serial Clock. Сигнал синхронизации. Служит для передачи тактового сигнала всем ведомым устройствам.
SS - Slave Select. Выбор ведомого. Служит для выбора ведомого устройства.

Производители микросхем часто используют другие названия для этих сигналов. Альтернативные варианты могут быть такими:

MOSI – DO, SDO, DOUT.
MISO – DI, SDI, DIN.
SCK – CLK, SCLK.
SS – CS, SYNC.

Схемы соединений по SPI

Типовая схема соединения двух устройств по SPI выглядит так.

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

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

Также возможен сокращенный вариант схемы подключения, когда линия MOSI или MISO не используется. То есть передача данных осуществляется только в одну сторону. Такие схема, например, используются при подключении к микроконтроллеру внешних микросхем ЦАП и АЦП.

Протокол обмена по SPI

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

CPOL – clock polarity. Полярность тактового сигнала - определяет исходный уровень сигнала синхронизации
CPHA – clock phase. Фаза тактового сигнала - определяет последовательность установки и выборки данных.

Рисунки ниже иллюстрируют все четыре режима обмена SPI.

SPI mode 0: CPOL = 0, CPHA=0. Тактовый сигнал начинается с уровня логического нуля. Защелкивание данных выполняется по нарастающему фронту. Смена данных происходит по падающему фронту. Моменты защелкивание данных показаны на рисунках стрелочками

SPI mode 1: CPOL = 0, CPHA=1. Тактовый сигнал начинается с уровня логического нуля. Смена данных происходит по нарастающему фронту. Защелкивание данных выполняется по падающему фронту.

SPI mode 2: CPOL = 1, CPHA=0. Тактовый сигнал начинается с уровня логической единицы. Защелкивание данных выполняется по падающему фронту. Смена данных выполняется по нарастающему фронту тактового сигнала.

SPI mode 3: CPOL = 1, CPHA=1. Тактовый сигнал начинается с уровня логической единицы. Смена данных выполняется по падающему фронту тактового сигнала. Защелкивание данных выполняется по нарастающему фронту.

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

Теперь вы имеете общее представление о последовательном периферийном интерфейсе и можно перейти к рассмотрению SPI модуля.
SPI модуль микроконтроллера AVR atmega16 использует для своей работы 4 вывода - MOSI, MISO, SCK и SS. Когда модуль не задействован, эти выводы являются линиями портов ввода/вывода общего назначения. Когда модуль включен, режим работы этих выводов переопределяются согласно следующей таблице.

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

Регистры SPI модуля

В микроконтроллере atmega16 для работы с модулем SPI используются три регистра:

Управляющий регистр SPCR,
- статусный регистр SPSR,
- регистр данных SPDR.

Все три регистра восьмиразрядные.

Кофигурация модуля SPI устанавливается с помощью регистра SPCR (SPI Control Register).

SPIE – разрешает /запрещает прерывания от модуля SPI. Если бит установлен в 1, прерывания от SPI разрешены.

SPE – включает/выключает модуль SPI. Если бит установлен в 1, модуль SPI включен.

DORD – определяет порядок передачи данных. Когда бит установлен в 1, содержимое регистра данных передается младшим битом вперед. Когда бит сброшен, то старшим битом вперед.

MSTR – определяет режим работы микроконтроллера. Если бит установлен в 1, микроконтроллер работает в режиме Master (ведущий). Если бит сброшен – в режиме Slave (ведомый). Обычно микроконтроллер работает в режиме master.

CPOL и CPHA – определяют в каком режиме работает SPI модуль. Требуемый режим работы зависит от используемого периферийного устройства.


SPR1
и SPR0 – определяют частоту тактового сигнала SPI модуля, то есть скорость обмена. Максимально возможная скорость обмена всегда указывается в спецификации периферийного устройства.


Статусный регистр SPSR (SPI Status Register) предназначен для контроля состояния SPI модуля
, кроме того он содержит дополнительный бит управления скоростью обмена.


SPIF
– флаг прерывания от SPI. Он устанавливается в 1 по окончании передачи байта данных. Если разрешены прерывания модуля, одновременно с установкой этого флага генерируется прерывание от SPI. Также этот флаг устанавливается в 1 при переводе микроконтроллера из режима master в режим slave с помощью вывода SS.
Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR.

WCOL - флаг конфликта записи. Флаг устанавливается в 1, если во время передачи данных выполняется попытка записи в регистр данных SPDR. Флаг сбрасывается аппаратно после чтения регистра SPSR с последующим обращением к регистру данных SPDR.

SPI2X - бит удвоения скорости обмена. Установка этого разряда в 1 удваивает частоту тактового сигнала SCK. Микроконтроллер при этом должен работать в режиме master.

Взаимосвязь между битами SPR0, SPR1, SPI2X и частотой тактового сигнала SCK показана в таблице.

Где Fosc - тактовая частота микроконтроллера AVR.


Для передачи и приема данных предназначен регистр SPDR (SPI Data Register)
. Запись данных в этот регистр инициирует передачу данных SPI модулем. При чтении этого регистра, считывается содержимое буфера сдвигового регистра SPI модуля.

Программный код

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

Функции инициализации.
- функции передачи/приема байта данных

Инициализация SPI модуля

Инициализация включает в себя конфигурирование выводов SPI модуля и управляющего регистра SPCR.


#define SPI_PORTX PORTB
#define SPI_DDRX DDRB

#define SPI_MISO 6
#define SPI_MOSI 5
#define SPI_SCK 7
#define SPI_SS 4

/*инициализация SPI модуля в режиме master*/
void SPI_Init(void)
{

/*настройка портов ввода-вывода
все выводы, кроме MISO выходы*/
SPI_DDRX |= (1< SPI_PORTX |= (1<

/*разрешение spi,старший бит вперед,мастер, режим 0*/
SPCR = (1< SPSR = (0<}

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

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

1. установка низкого логического уровня на линии SS
2. загрузка данных в регистр SPDR
3. ожидание окончания передачи (проверка флага SPIF)
4. сохранение принятых данных (чтение SPDR), если требуется
5. возврат на 2-ой шаг, если переданы не все данные
6. установка высокого логического уровня на линии SS

Ниже приведено несколько вариантов функции передачи/приема данных.

Передача одного байта данных по SPI


void SPI_WriteByte(uint8_t data)
{
SPI_PORTX &= ~(1< SPDR = data;
while(!(SPSR & (1< SPI_PORTX |= (1<}

Передача и прием одного байта данных по SPI

uint8_t SPI_ReadByte(uint8_t data)
{
uint8_t report;
SPI_PORTX &= ~(1< SPDR = data;
while(!(SPSR & (1< report = SPDR;
SPI_PORTX |= (1< return report;
}

Передача нескольких байтов данных по SPI
*data – указатель на массив передаваемых данных, а num – размерность массива


void SPI_WriteArray(uint8_t num, uint8_t *data)
{
SPI_PORTX &= ~(1< while(num--){
SPDR = *data++;
while(!(SPSR & (1< }
SPI_PORTX |= (1<}

//Пример использования:
uint8_t buf = {12, 43, 98};


SPI_WriteArray(3, buf);

Передачи и прием нескольких байтов данных по SPI
*data – указатель на массив передаваемых данных, а num – размерность массива.
Принятые данные будут сохраняться в том же массиве.


void SPI_ReadArray(uint8_t num, uint8_t *data)
{
SPI_PORTX &= ~(1< while(num--){
SPDR = *data;
while(!(SPSR & (1< *data++ = SPDR;
}
SPI_PORTX |= (1<}

Файлы

Простой SPI драйвер, в котором сведены все описанные выше функции -

Синхронный последовательный интерфейс SPI предназначен для ввода- вывода данных в интерфейсах "точка-точка" с одним ведущим (SPI-master) и одним ведомым (SPI-slave) устройством (рис. 1.24). Схема управления SPI- master формирует тактовые импульсы SCK, по которым одновременно производится передача сигналов на выходе MOSI и прием сигналов на входе MISO. Эти же тактовые импульсы SCK, поступая в SPI-slave, управляют приемом сигналов на его входе MOSI и формированием сигналов на его выходе MISO. Раздельные сигнальные цепи MOSI и MISO позволяют легко реализовать полнодуплексный режим обмена данными.

Форматы данных, параметры сигналов, временные характеристики и т.п. в интерфейсе не регламентируются, например, скорость обмена данными определяется только частотой тактовых импульсов SCK, формируемых SPI- master. Максимальное расстояние зависит от уровня искажения сигналов в линиях связи, предполагается, что надежный обмен данными возможен при расстояниях до нескольких метров.

По-существу, полноценным интерфейсом даже для физического уровня не является. Фактически, SPI реализует стандартную процедуру ввода-вывода данных в регистрах сдвига, никаких алгоритмов контроля работы, контроля передаваемых данных не предусмотрено. Все необходимые процедуры контроля должен выполнять SPI-master. Это, с одной стороны, требует применения дополнительных средств контроля, а с другой стороны, максимально упрощает средства реализации самого интерфейса SPI. SPI- slave – это стандартный регистр сдвига с требуемым числом разрядов данных.

Например, микроконтроллеры семейства AVR фирмы ATMEL поддерживают ввод-вывод данных в режиме и SPI-master, и SPI-slave. Стандартный цикл обмена предполагает одновременную передачу в обоих направлениях по одному байту данных (рис. 1.24). При передаче многобайтовых сообщений SPI-slave должен содержать регистр сдвига соответствующей разрядности, а SPI-master должен производить управление обменом требуемой последовательности байтов данных, обрабатывая каждый байт после очередного стандартного цикла работы интерфейса и обеспечивая запуск следующего стандартного цикла обмена.

применяется не только для обмена данными между микроконтроллерами, но и для сопряжения микроконтроллеров с внешними АЦП (ADC) и ЦАП (DAC), микросхемами памяти – SRAM, FRAM, SEERAM и многими другими устройствами. Благодаря последовательному формату данных и простой логической организации интерфейса SPI эти микросхемы производятся в компактных 8 – 16 выводных корпусах. В табл. 1.6 приведены примеры микросхем различного функционального назначения и разных производителей с интерфейсом SPI. Эти примеры показывают, что последовательный формат интерфейса позволяет существенно сократить требуемое число линий ввода-вывода.

Таблица 1.6

Тип микросхемы

Основные параметры

Тип корпуса

Производитель

24-Bit, Delta-Sigma, 15 Гц

24-Bit, Delta-Sigma, 41 кГц

16-Bit, SAR, 100 кГц

16-Bit, PulSAR, 500 кГц

12-Bit, U-out, 2.5 мкс

16-Bit, U-out, 10 мкс

14-Bit, I-out, 0.04 мкс

12-Bit, I-out, 0.6 мкс

16-Bit, U-out, 1 мкс

www.maxim- ic.com

Тип микросхемы

Основные параметры

Тип корпуса

Производитель

16 кБит, 1 трлн

4 кБит, неогр.

64 кБит, неогр.

256K, 32768×8, 0.1млн Cycles

8К, 1024×8, 0.1млн Cycles

16K, 8192×8, 0.1млн Cycles

128K, 16384×8, 0.1млн Cycles

256K, 32768×8, 0.1млн Cycles

Termosensor

13-bit, -40 to +150 C o (±0.5C o)

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

Например, интерфейс SPI может оказаться полезным для считывания информации о состоянии большого числа двухпозиционных датчиков или для ввода многобитовых данных, поступающих в параллельном формате. Для этих целей удобно использовать отдельные регистры с параллельной записью и последовательным считыванием (8-Bit Parallel-In/Serial-Out Shift Register), например CD74HCT166 (рис. 1.25).

Схема подключения шестнадцати двухпозиционных датчиков (S1 – S16) через SPI-интерфейс микроконтроллера показана на рис. 1.26. Следует отметить, что перед стартом работы SPI-интерфейса необходимо сформировать сигнал записи информации в регистры с параллельных входов D0-D7. Для 38 этого можно использовать один из выходов микроконтроллера, в данном примере PC0.

Рис. 1.25. Функциональная схема регистра CD74HCT166

Рис. 1.26. Подключение двухпозиционных датчиков к SPI-интерфейсу

Рис. 1.27. Подключение шестиразрядного индикатора к SPI-интерфейсу

Применяя регистры с последовательной записью и параллельной выдачей информации (8-Bit Serial-In, Parallel-Out Shift Register) – SN74HC595 , SPI-интерфейс можно использовать и для многобайтовой параллельной выдачи информации. В качестве примера на рис. 1.27 приведена схема подключения шестиразрядного семисегментного индикатора к микроконтроллеру. В отличие от предыдущей схемы, сигнал параллельного вывода (PB1) необходимо сформировать после окончания передачи данных интерфейсом SPI средствами, выходящими за рамки интерфейса. Например, алгоритм взаимодействия с интерфейсом должен предусматривать контроль количества переданных байтов данных, а после завершения передачи последнего байта необходимо дополнительно передать сигнал параллельного вывода.

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 ) ;

Проблемы