Производные и совместимые протоколы
· 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 | Вход выбора подчиненного (выбор микросхемы) |
Табл. 2. Режимы SPI
Режим SPI | ||||
CPOL | ||||
CPHA | ||||
Временная диаграмма первого цикла синхронизации |
Интерфейс I2C.
1 Описание интерфейса I2C
Этот интерфейс был предложен фирмой Philips®, которая применила его для организации связи между микросхемами в своих телевизорах. I2C (аббревиатура слов Inter-Integrated Circuit), и представляет собой двунаправленную асинхронную шину с последовательной передачей данных. Физически шина I2C представляет собой две сигнальные линии, одна из которых (SCL) предназначена для передачи тактового сигнала, а вторая (SDA) для обмена данными. Для управления линиями применяются выходные каскады с открытым коллектором, поэтому линии шины должны быть подтянуты к источнику питания +5 В через резисторы сопротивлением 1...10 кОм, в зависимости от физической длины линий и скорости передачи данных. Длина соединительных линий в стандартном режиме может достигать 2-х метров, скорость передачи данных – 100 кбит/с.
Все абоненты шины делятся на два класса – "Master" и "Slave". Устройство "Master" генерирует тактовый сигнал (SCL) и, как следствие, является ведущим. Оно может самостоятельно выходить на шину и адресовать любое "Slave"-устройство с целью передачи или приёма информации. Все "Slave"-устройства "слушают" шину на предмет обнаружения собственного адреса и, распознав его, выполняют предписываемую операцию. Кроме того, возможен так называемый "MultiMaster"-режим, когда на шине установлено несколько "Master"-абонентов, которые либо совместно разделяют общие "Slave"-устройства, либо попеременно являются то "Master"-устройствами, когда сами инициируют обмен информацией, то "Slave", когда находятся в режиме ожидания обращения от другого "Master"-устройства. Режим "MultiMaster" требует арбитража и распознавания конфликтов. Естественно, он сложнее в реализации (имеется ввиду программная реализация) и, как следствие, реже используется в реальных изделиях.
В начальный момент времени – в режиме ожидания – обе лини SCL и SDA находятся в состоянии лог. 1 (транзистор выходного каскада с открытым коллектором закрыт). В режиме передачи (рисунок 1) бит данных SDA стробируется положительным импульсом SCL. Смена информации на линии SDA производится при нулевом состоянии линии SCL. "Slave"-устройство может "придерживать" линию SCL в нулевом состоянии, например, на время обработки очередного принятого байта, при этом "Master"-устройство обязано дождаться освобождения линии SCL, прежде чем продолжать передачу информации.
Рисунок 1 – Диаграмма процесса передачи данных по шине I2C
Для синхронизации пакетов шины I2C различают два условия – "START" и "STOP", ограничивающие начало и конец информационного пакета (рисунок 2). Для кодирования этих условий используется изменение состояния линии SDA при единичном состоянии линии SCL, что недопустимо при передаче данных. "START"-условие образуется при отрицательном перепаде линии SDA, когда линия SCL находится в единичном состоянии, и наоборот, "STOP"-условие образуется при положительном перепаде линии SDA при единичном состоянии линии SCL.
Рисунок 2 – Диаграмма "START" / "STOP" условий шины I2C
Передача данных начинается по первому положительному импульсу на линии SCL, которым стробируется старший бит первого информационного байта. Каждый информационный байт (8 битов) содержит 9 тактовых периодов линии SCL. В девятом такте устройство-получатель выдаёт подтверждение (ACK) – отрицательный импульс, свидетельствующий о "взаимопонимании" передатчика и получателя. Следует отметить, что любой абонент шины, как "Master", так и "Slave" может в разные моменты времени быть как передатчиком, так и получателем и в соответствии с режимом обязан либо принимать, либо выдавать сигнал ACK, отсутствие которого интерпретируется как ошибка.
Чтобы начать операцию обмена, устройство "Master" выдаёт на шину "START"-условие, за которым следует байт с адресом "Slave"-устройства (рисунок 3), состоящий из семибитового адреса устройства (биты 1...7) и однобитового флага операции – "R/W" (бит 0), определяющего направление обмена, причём 0 означает передачу от "Master" к "Slave" (рисунок 3а), а 1 – чтение из "Slave" (рисунок 3б). Все биты по шине I2C передаются в порядке старший-младший, то есть первым передаётся 7-ой бит, последним 0-ой. За адресом могут следовать один или более информационных байтов (в направлении, определённом флагом R/W), биты которых стробируются сигналом SCL из "Master"-устройства.
При совершении операции чтения "Master" абонент должен сопровождать прочитанный байт сигналом ACK, если необходимо прочитать следующий байт, и не выдавать сигнал ACK, если собирается закончить чтение пакета (см. рисунок 3б).
Допускается многократное возобновление "Slave"-адреса в одном цикле передачи, то есть передача повторного "START"-условия без предварительного "STOP"-условия (рисунок 3в).
Рисунок 3 – Формат операций чтения/записи
Необходимо отметить некоторые особенности микросхем памяти, работающих по интерфейсу I2C, и процедур обмена данными с ними. Во-первых, энергонезависимая память данных этих микросхем разбита на страницы памяти, поэтому при записи байта вначале происходит копирование всей страницы во внутреннюю оперативную память микросхемы, где производится изменение нужной ячейки. После этого, производится стирание старой страницы и запись на её место новой. Ещё одной особенностью является то, что старшие четыре бита адреса "Slave" всегда должны быть равны 1010. Это требование регламентировано самой фирмой Philips.
Теперь рассмотрим процедуры "общения" ведущего с микросхемой памяти. Прежде всего, он обязан сформировать на шине условие "START", вслед за которым послать байт с адресом ведомого и установленным признаком записи. Получив подтверждение приёма, ведущий продолжает передачу, посылая один или два байта адреса (зависит от ёмкости микросхемы) ячейки памяти. Приём каждого из них должен быть подтверждён "Slave"-устройством. В отличие от привычного программистам принятого в IBM PC порядка первым в данном случае передаётся байт со старшими разрядами адреса.
Дальнейшие действия зависят от того, намерен ли ведущий читать данные, хранящиеся в массиве памяти ведомого, или записывать их туда. Для записи одного или нескольких байтов их достаточно передать вслед за адресом. Первый попадёт в заданную ячейку, после чего внутренний контроллер микросхемы памяти автоматически инкрементирует адрес. Поэтому повторять его передачу не требуется. Следующий байт будет направлен в следующую ячейку и так далее до верхней границы страницы записи (в соответствующем числе младших разрядов адреса ячейки – все единицы), после чего заполнение страницы продолжится с нижней границы (в младших разрядах – все нули). Число байт данных, передаваемых в одном сеансе, не ограничено, но сохранятся лишь последние из них в количестве, не превышающем длины страницы.
Страничная запись значительно сокращает время, требуемое для перезаписи всего массива памяти или большей его части, но кроме неё иногда предусматривается и мультибайтная запись, отличие которой состоит в том, что адреса последовательно записываемых ячеек могут находиться на смежных страницах, пересекая их границу.
В любом случае после передачи и подтверждения приёма всех данных для программирования ведущий подаёт команду "STOP", запускающую в микросхеме внутренний автомат записи. Время записи здесь довольно большое – около 10 мс. Если данные переданы в мультибайтном режиме и находятся на разных страницах, продолжительность записи удваивается – автомат программирует две страницы.
До окончания процедуры программирования микросхема памяти не реагирует ни на какие внешние сигналы и в течение этого времени на повторные обращения ведущего по её адресу не откликается. Этим пользуются для определения момента завершения программирования.
Перед чтением данных не требуется обязательно указывать адрес ячейки. Если ведущий обращается к микросхеме памяти, установив в младшем бите байта адреса "Slave" признак чтения, в ответ ему будет передан байт из ячейки, следующей за той, с которой выполнялась последняя операция записи или чтения, после чего счётчик адреса будет автоматически инкрементирован. Продолжая посылать импульсы SCL, ведущий может последовательно и неоднократно прочитать весь массив данных. Возврата к началу страницы на её границе при чтении не происходит, а за адресом последней ячейки всего массива следует нулевой. Сигнал окончания чтения – отсутствие подтверждения ведущим приёма последнего или единственного байта данных и следующая за этим команда "STOP".
При необходимости адрес читаемой ячейки задают в явном виде следующим образом (см. рисунок 3в). Прежде всего, ведущий обращается к микросхеме памяти с признаком записи и посылает ему один или два байта адреса ячейки. Получив подтверждение, он немедленно посылает новую команду "START", а за ней – адрес "Slave" с признаком чтения и выполняет описанную выше процедуру. Первым ему будет передан байт из ячейки с указанным адресом.
Все вышеописанные процедуры обмена данными относятся и к микросхемам часов реального времени, за исключением того, что некоторые ячейки памяти у них представляют собой регистры счётчиков даты времени и, соответственно, изменяются самой микросхемой, хотя ничто не запрещает изменять их и ведущему (так производится установка времени).
Практические рекомендации
Удобства применения шины I2C очевидны – малое количество соединительных линий и высокая скорость обмена, простота аппаратной реализации линии связи. Наиболее широко поддерживает шину I2C, конечно же, фирма Philips, производящая множество микросхем различной сложности с управлением по I2C. В первую очередь, можно выделить микросхемы энергонезависимой памяти (EEPROM) серии 24Схх в 8-ми выводных корпусах, фактически ставшие промышленным стандартом. Из широко распространенных микросхем можно выделить: микросхемы часов DS1307 и DS3231, параллельный порт PCF8574, 4-х канальный 8-ми разрядный АЦП PCF8591.
I2C-абоненты жёстко разделяются по классам: "Master"- и "Slave"- устройство. Тот факт, что сигнал SCL всегда генерируется "Master"-устройством означает, что "Master"-абонент может быть достаточно легко реализован чисто программными средствами, так как все изменения на шине будут происходить только по сигналу SCL. И наоборот, реализация "Slave"-устройства требует аппаратной поддержки, кроме случая очень низких скоростей обмена. Существуют однокристальные микроконтроллеры (МК) поддерживающие "Slave"-операции шины I2C. Это прежде всего Philips PCF80C552 (652), Microchip PIC16F88 (PIC16F690, PIC18F2620 и др.), Motorola MC68HC705CJ4 (BD3, E5).
Типичная ошибка при реализации программ "Master"-абонента – управление значением порта МК для установки состояний лог. 0 и лог. 1 линий SCL и SDA. Если для МК семейства MCS-51 это нормальный режим работы, так как единичное состояние порта у них реализуется встроенным подтягивающим резистором, то для МК с симметричными портами (Motorola 68HCxx, Microchip PIC, Atmel AVR) это будет порождать электрические конфликты. Например, в руководстве "Microchip. Embedded Control Handbook 1994/1995" приведены практические программы для связи PIC c EEPROM 24Cxx, содержащие подобные грубые ошибки. Положение усугубляется ещё и тем, что в случае микросхем EEPROM такой вариант может сработать, так как они являются 100% аппаратными схемами и не вносят задержек в связной протокол, а паузу ожидания окончания цикла программирования производят переходом в пассивное состояние. Однако использование таких подпрограмм с микросхемами, производящими захват линии SCL (практически любой "Slave"-абонент, реализованный с применением МК), приведёт к невозможности связи, а возможно, и к выходу микросхемы из строя.
Реализовать настоящую имитацию режима "Открытый коллектор" (ОК) (мы назвали этот режим имитацией ОК, так как он не позволяет устанавливать на линии напряжение выше напряжения питания, что было бы нормально для настоящего ОК, но так как по спецификации I2C напряжение на линиях SCL и SDA не должно превышать напряжение питания, его вполне законно можно считать выходом с ОК) на порте с симметричным выходом можно, если установить значение порта постоянно в лог. 0, а управлять состоянием линии через манипуляции с регистром направления данных. Для МК семейства PIC это будет регистр "TRISx", переводящий порт либо в третье состояние, либо подключающий линии в соответствии с состоянием регистра "PORTx". Практически так же это реализуется в МК AVR и MC68HC05 (08, 11), где "DDRx" коммутирует порт "PORTx", с той лишь разницей, что у них другая полярность управляющего сигнала – у PIC лог. 0 в "TRISx" соответствует лог. 0 на выходе, а у AVR и MC68HC05 лог. 1 в "DDRx" соответствует лог. 0 на выходе.
Другая важная сторона вопроса – необходимость тщательного соблюдения параметров временной диаграммы процесса обмена. Несмотря на то, что шина I2C асинхронная и позволяет затягивать передачу бита (байта) на сколь угодно длительное время (это свойство позволяет реализовывать программы I2C-обмена на самом низком уровне приоритета, прерывая процесс передачи в любое время), требования к минимальным значениям длительностей импульсов очень жёсткие. Ситуация усугубляется тем, что положительные перепады состояния линии имеют склонность затягиваться, так как несимметричные управляющие выходы не могут создать крутые положительные фронты.
При написании программ очень важно контролировать время между операциями на шине, реализуемыми различными подпрограммами, например выдача "START" и "STOP"-условия, передача бита, передача байта. При состыковке этих подпрограмм не должны быть нарушены минимальные значения времени, что очень легко происходит при использовании высокоскоростных процессоров (AVR, PIC). Кроме того, необходимо следить, чтобы время между изменением на линии SDA и стробированием положительным импульсом на линии SCL было не меньше половины минимальной длительности полупериода SCL (2,4 мкс для скорости 100 кБит/сек). Помимо этого, некоторые "Slave"-приборы могут ужесточить требования к максимальной частоте обмена, в этом случае необходимо пропорционально снижению частоты обмена увеличивать значения минимумов временных допусков.
Ещё одна распространенная ошибка – игнорирование требования слежения за захватом линии SCL "Slave"-абонентом. Грамотно реализованные прграммы операций "Master"-абонента должны контролировать возврат линии SCL после того, как переводят её в единичное состояние, и только дождавшись реальной установки линии SCL в единичное состояние продолжать операции приемо-передачи.