14.7 (I) Последовательные шины и линии связи
==1032
Последовательные шины и линии связи имеют несколько важных преимуществ перед параллельными, два из которых уже известны.
- Удобство обращения с небольшим числом проводов в кабеле и соединителе ( сравните шнурок USB и «шланг» SCSI или GPIB ), а также числом выводов в передатчике и приёмнике.
- Высокая частота тактирования, не ограничиваемая разбегом фронтов в параллельных линиях, и удобство согласования соединения точка-точка.
- Однопроводную связь легко передавать через оптоволокно или радиоканал.
Если всё же нужны параллельные линии на обоих концах, можно взять пару микросхем SERDES ( serializer-deserializer, произносится “ser'-deez” ), которые переводят параллельные шины в последовательный поток и обратно ( см. §12.8.4 и §12.10.3 [* рис. 12.129 ] ). Примерами такого рода являются FT245 и FT2232 фирмы FTDI. Они преобразуют интерфейс USB в 8-разрядный параллельный порт со встроенным FIFO буфером. Есть примеры и побыстрее: 18-разрядный SERDES ( скорость до 1.2 Gbps ) DS92LV18 или физический интерфейс гагабитного ( а то и 10-гигабитного ) Ethernet.
В следующих параграфах будут рассмотрены наиболее важные вопросы последовательной связи и разобраны примеры из жизни. Сначала познакомимся с внутриплатными интерфейсами, а затем с внешними последовательными шинами. Внутри указанных категорий примеры выстраиваются по степени увеличения сложности от простого и медленного 4-проводного SPI к сложным и быстрым 1-проводным SATA и PCIe с кодировкой 8b/10b и восстановлением синхросигнала.
14.7.1 SPI
Рис. 14.37 Типичный протокол SPI. В показанном варианте данные в обоих направлениях сдвигаются по восходящему фронту «SCLK». В SPI надо согласовывать объём ( и смысл ) записываемых и считываемых данных со спецификацией периферийного устройства. В данном случае ведомый принимает 6 бит ( «MB5...MB0» ) и одновременно выдаёт 4 ( «SB3...SB0» )
Последовательный периферийный интерфейс SPI был предложен фирмой Motorola и активно используется для связи между микросхемами ( для тех же целей служит протокол I2C, обсуждаемые далее ) 50 . Это протокол ведущий-ведомый ( как PC104 ), но использует только 4 провода ( рис. 14.37 ): тактовый сигнал «SCLK», две однонаправленные линии данных ( «MOSI» и «MISO» 51 ) плюс активный низкий сигнал выбора кристалла ( «SS'» ). Есть несколько вариантов построения системы, но наиболее часто используемый приведён на рис. 14.38 . Тактовый сигнал и линии данных образуют сквозную шину, подходящую к каждому ведомому ( многоточечное соединение ), а линии выбора кристалла индивидуальные.
Рис. 14.38 Типичная шинная конфигурация SPI. Тактовый сигнал и линии данных общие, а входы выбора кристалла ( «SS'» ) индивидуальные
==1033
Весь обмен управляется ведущим. Для начала, следует активировать нужную линию «SS'» ведомого ( делать это надо, когда выход «SCLK» находится в пассивном состоянии [* неплохо ещё выяснить какое это состояние ] ), а затем, выдавая нужное число импульсов, выполнить сдвиг данных по линиям «MOSI» и «MISO». SPI не имеет чётко описанной процедуры сдвига, не оговаривает размерность пересылаемых данных и т.д. Вместо этого каждая конкретная микросхема указывает, сколько бит она принимает, сколько возвращает в ответ [* , по каким фронтам синхронизирует ] , и что каждый бит значит.
Возьмём, для примера, AD7927 - 12-разрядное АЦП умеренного быстродействия ( 200 ksps ) со встроенным мультиплексором на 8 входов и портом SPI ( рис. 14.39 ), через который выбирается требуемый канал и режим работы, а также считывается результат. Данная микросхема загружает первые 12 входных бит в регистр управления, отбрасывая все остальные, и одновременно возвращает 16-разрядное слово с результатом предыдущего преобразования ( рис. 14.39 ) 52 . Биты отсчитываются от нисходящего фронта на «SS'», который запускает преобразование. Некоторые примеры ИМС с интерфейсом SPI можно посмотреть на информационном плакате 15.21 .
Рис. 14.39 8-канальное АЦП с SPI интерфейсом. Показанный протокол - самый простой из имеющихся вариантов. Нисходящий перепад на «CS'» инициирует преобразование, а ведомый передаёт номер канала ( 3 разряда ) и результат преобразования ( 12 разрядов ). Одновременно с чтением данных ведущий пересылает номер следующего канала
14.7.1.A Некоторые комментарии
Протокол SPI имеет свободный формат и никак не оговаривает объём и интерпретацию передаваемых данных. В SPI нет адресной информации ни в какой форме, и куда идут входные данные определяет получающее их устройство. Стандартный метод обмена - просто задвигать порцию битов, сообразуясь с требованиями справочных данных ( I2C имеет совершенно иную организацию ). Бывают микросхемы, рассчитанные только на запись ( индикаторы с последовательным входом ) или только на чтение ( MAX6675 фирмы MAXIM - преобразователь для термопары, который имеет выводы «SCLK», «MISO», «SS'» и просто сообщает температуру ). Периферия «с интерфейсом SPI» может привязывать входные-выходные биты к любому фронту тактового сигнала, что создаёт четыре разных варианта обмена ( пример на рис. 14.39 соответствует режиме «MODE 2» [* за прошедшие десятилетия производители таки договорились о каких-то минимальных правилах игры ] ). SPI прост в организации, может передавать данные в обоих направлениях независимо и одновременно ( дуплексная передача ) и не требует никаких сигналов квитирования. В результате ведущий может спокойно отправить данные периферийному устройству, которого в системе просто нет.
Отсутствие хорошо документированного стандарта SPI вынуждает внимательно читать описание на каждую периферийную микросхему. В дополнение к выбору правильного сочетания активных фронтов надо правильно выставлять максимальную, а иногда и минимальную (!) скорость обмена, которая может лежать в диапазоне от единиц килогерц до десятков мегагерц. Скажем, упомянутая AD7927 оговаривает \(f_{SCLK}\)=10 kHz (min), 20 MHz (max). Имея в системе несколько периферийных устройств SPI, можно столкнуться со столь серьёзными проблемами совместимости, что придётся организовывать отдельный программный канал SPI с «ручным» переключением состояния сигналов ( такой метод называется bit-banging ).
==1034
14.7.2 I2C ( «TWI» )
Последовательный «интерфейс для связи интегральных компонентов» ( IIC, I2C или I²C ) был предложен Philips ( сейчас NXP ) для организации связи между микросхемами 53 . Он имеет несколько важных отличий от SPI.
- Использует только 2 провода, проходящих насквозь через все ведомые устройства ( отдельной линии выбора кристалла, как «SS'» в SPI, нет ).
- Адресная информация передаётся по той же линии данных.
- Шина полудуплексная, т.е. в каждый момент времени данные могут двигаться только в одном направлении.
- I2C имеет организацию ведущий-ведомый, но при этом любое устройство на шине может стать ведущим, когда активный в данный момент ведущий освободит шину ( переключив её в состояние «STOP», завершающее текущий цикл обмена ).
Протокол показан на рис. 14.40 . Двухпроводная шина I2C состоит из тактовой линии ( «SCL» ) и линии данных ( «SDA» ). На обоих должны бить резистивные подтяжки на положительную шину питания. Тактовый сигнал «SCL» идёт от ведущего к ведомому, а линия данных «SDA» двунаправленная. Сначала её захватывает ведущий. Он предаёт 7 разрядов адреса и бит направления движения данных. Ведомый отвечает битом подтверждения ( «ACK» ), после которого в объявленном направлении передаются 8-разрядные данные, синхронизированные тактовым сигналом от ведущего. Цикл шины завершается, когда после очередного переданного и подтверждённого байта ведущий переводит шину в состояние «STOP» 54 . «START» и «STOP» - особые состояния, которые намеренно нарушают правило: «данные могут изменяться только при НИЗКОМ уровне на линии «SCL»».
Рис 14.40 2-проводный интерфейс I2C. Сверху показана ременная диаграмма общего вида. Передача ведётся 8-разрядными словами. Каждое подтверждается 1-битным признаком успешного приёма ( «ACK» ). Первое слово после состояния «START» всегда содержит адрес ведомого ( «A6...A0» ) и направление движения данных ( «R/W'» ). Остальные слова пакета передаются в заявленном направлении ( в соответствии со значением бита «R/W'» ) источником и подтверждается ( «ACK» ) получателем. На двух нижних диаграммах показан пример протокола, использующего I2C в качестве транспортного уровня. Первым словом в блоке данных пакета I2C идёт номер внутреннего регистра ведомого устройства, а далее следует «полезная нагрузка». Показаны как операция записи ( сверху ), так и операция чтения. Чтобы прочитать регистр используется опция «повторного старта» в I2C. При этом ведущий сначала передаёт адрес нужного регистра, а после повторного старта меняет направление данных и получает требуемое в поле данных.
В качестве примера рассмотрим AD7294 - 12-разрядную «систему наблюдения в составе АЦП, ЦАПа, датчика температуры и измерителя тока». Это «швейцарский нож» для задач управления в автомобильной и промышленной электронике ( рис. 14.41 ). Не самый быстрый кристалл такого рода: АЦП выдаёт менее 300 ksps , но зато присматривает за всеми параметрами сразу, сообщая результат через шину I2C. Справочные данные объёмом 44 страницы сообщают, как организовать взаимодействие с внутренними регистрами, коих в ИМС 40 штук, и все с именами наподобие “AlertRegisterA(R/W)” или “DataHIGHRegisterTsenseINT(R/W)”. См. информационный плакат 15.22 с некоторыми примерами периферийных устройств с шиной I2C.
Рис. 14.41 Многофункциональная микросхема контроля и управления с широкими возможностями, хотя и с умеренной скоростью измерения. Ведущий может добраться до каждого из 40 регистров ИМС, передав его номер во втором байте пакета сразу после адреса ведомого, см. рис. 14.40
==1035
14.7.2.A Некоторые комментарии
2-проводный интерфейс I2C хорошо описан и удобен для организации внутренних соединений, особенно в условиях большого числа узлов, т.к. вся необходимая информация - адрес, данные и синхронизация - идут всего по двум проводам. Кроме того, ведомый может притормозить ведущего, зажав линию «SCL» в НИЗКОМ состоянии – «растянув» тактовый сигнал . Наконец, протокол предусматривает наличие нескольких ведущих на шине. Через I2C удобно подключать кристаллы с «богатым внутренним миром»: протокол позволяет легко добраться до регистров микросхемы по их номеру. Скажем, AD7294 требуются пакеты по 3–4 байта. Сначала идёт адрес микросхемы, затем [* уже в блоке данных ] - номер регистра и, наконец, последний байт или два - полезная нагрузка от ведущего или ведомого.
14.7.2.B Сравнение с SPI
I2C гораздо сложнее SPI и плохо подходит для потоковых данных с высокой нагрузкой. Мультимастерные возможности тянут за собой проблемы со столкновениями и арбитражем. Все участники обмена должны иметь уникальные адреса. Проблема выбора адреса из нескольких возможных [* см. хождение по мукам в §13.12.3 ] часто решается переключением уровней на специальных выводах, например, AD7294 имеет три таких входа и позволяет выбрать что-нибудь из диапазона 61h...7Bh , но гибкость выбора стОит трёх лишних выводов корпуса. Универсальность адресации, двунаправленность и мультимастерность конкурируют с обескураживающей простотой и скоростью SPI.
Так что же использовать? В большинстве случаев выбор определяется периферийным устройством, которое обычно поддерживает только один протокол, в то время как микроконтроллеры могут работать и с SPI, и с I2C ( а, если вдруг аппаратной поддержки нет, можно организовать программную ).
14.7.3 Протокол «1-wire» фирмы Dallas-Maxim
Принципиального сокращения числа выводов до одного ( плюс возвратная земля, конечно ) удалось достичь в интерфейсе «1-wire™» фирмы Dallas ( теперь Maxim ) 55 . По одному проводу передаётся и информация, и питание . Этого удалось достичь, передавая данные в импульсном режиме ( замыкая линию на землю ), в то время как каждый ведомый содержит непосредственно на кристалле фильтрующий конденсатор, позволяющий пережить кратковременную просадку напряжения. В итоге удалось упростить и подключение к шине ведомых устройств, в число коих входят термодатчики, память, контроллеры батарей и т.д. ( см. рис. 14.42 ). Два контакта на ведомом устройстве позволяют упаковать его в корпус iButton, напоминающий дисковую батарейку.
Рис. 14.42 Шина «1-wire™», предложенная фирмой Dallas-Maxim. Внутренний конденсатор позволяет ведомому не терять питание в момент прихода коротких импульсов данных
Протокол довольно замысловатый. Все периферийные устройства сидят на двухпроводной линии данные-земля, уровень напряжения в которой задаёт ведущий. Линия подтягивается через резистор к +5V , что позволяет и питать ведомые устройства, и кратковременно замыкать шину на землю. Каждый цикл шины инициируется ведущим, который сначала передаёт адрес, а затем обеспечивает передачу данных в нужном направлении. Передача данных идёт широтно-импульсным способом: короткий импульс ( <15 μs ) обозначает «1», а длинный ( 60 μs ) – «0». Если ведущий - источник данных, то он просто формирует биты нужной длительности, а, если ведущий собирается получать данные, то он начинает битовый промежуток - передаёт единицу, а за окончание отвечает ведомый. Чтобы передать «1», ничего делать не надо: подтяжка на +5V передаст единицу сама, а чтобы отправить «0», ведомый должен «зажать» линию на уровне земли, доведя ширину импульса до 60 μs .
==1036
Каждое устройство 1-wire должно иметь уникальный 64-разрядный номер, записываемый в процессе производства. 8 бит номера указывают тип устройства. Каждый цикл шины начинается с импульса сброса длительностью >480 μs , позволяющего ведомым отличить фазу адресации. Ведущий может передавать широковещательные ( безадресные ) посылки всем устройствам или выбирать какое-то конкретное по его уникальному номеру. Адрес передаётся сразу после импульса сброса.
Шина 1-wire может использоваться для подключения внешних датчиков к прибору. В обычных условиях общая длина сегмента ограничена величиной 30 m , но, если взять специальный драйвер, цифру можно довести до 500 m ( см. техническую заметку ##AN244 ). Есть переходники с 1-wire на Ethernet.
14.7.4 JTAG
JTAG ( его ещё называют «протоколом граничного сканирования» или IEEE 1149.1 ) - очень полезный интерфейс с интересной историей. Появился в 1980-х для решения сложной проблемы с проверкой на возможные неисправности компонентов и печатных плат. Тогда только появилась технология поверхностного монтажа, которая резко усложнила подключение к выводам компонентов. В то время о проверке самих микросхем ещё никто не думал. Для решения поставленной задачи в микросхемы стали добавлять несколько специальных регистров и простой 4-проводный интерфейс, позволявший локализовать неисправность без демонтажа компонентов.
В настоящее время JTAG превратился в универсальный последовательный интерфейс, наравне с SPI и I2C, т.к. реализованная в интерфейсной части машина состояний позволяет управлять процессом передачи данных. Он активно используется в микроконтроллерах ( например, входит в ядро ARM ), cPLD, FPGA, ИМС постоянной памяти ( флэш, EEPROM ) и гибридных микросхемах разной степени сложности ( например, DS4550 фирмы Maxim, где JTAG соседствует с I2C ).
Базовая конфигурация показана на рис. 14.43 . Тактовая линия «TCK» и линия задания режима «TMS» идут параллельно на каждую подключённую микросхему, а два вывода данных ( «TDO», «TDI» ) соединяются в последовательную цепочку по схеме «daisy-chain» 56 . Данные на «TDI» фиксируются по восходящему фронту «TCK», а на «TDO» выводятся по нисходящему. По восходящему фронту «TCK» фиксируются и данные на линии «TMS», которая определяет режим работы «TDI» и «TDO». [* Правильнее сказать, путь от «TDI» к «TDO». Вход «TDI» либо передаётся на «TDO» через однобитовую задержку, либо между этими выводами вставляется один из регистров граничного сканирования ] . Предусмотрена и опциональная общая линия инициализации «TRST». Движение данных по шине идёт со скоростью 1...100 Mbps ( зависит от конкретной ИМС ).
Рис. 14.43 Интерфейс «граничного сканирования» JTAG использует четыре однонаправленных линии - тактовую ( «TCK» ), управления ( «TMS» ) и ввода-вывода данных ( «TDI», «TDO» ) - и последовательное по цепочке включение ведомых
Многие PLD и микроконтроллеры используют JTAG для загрузки прошивки в программную память. Обычно требуется приобретать специальный адаптер, который подключается к управляющей машине через USB, а к целевому устройству - через разъём JTAG. Форм-фактор и разводка последнего не стандартизованы, но небольшое число выводов позволяет легко смастерить переходник. Важнее другое. Программное обеспечение, поставляемое производителем целевых ИМС, вынуждает использовать конкретный программный адаптер. А такое ПО необходимо для загрузки конфигурации и отладки на реальной аппаратуре через тот же порт JTAG.
==1037
14.7.5 Отказ от линии синхронизации: восстановление тактового сигнала
SPI, I2C и JTAG используют отдельную линию тактирования для фиксации данных ( «SCLK», «SCL», «TCK» ). Но возможно восстановление тактового сигнала непосредственно из потока данных, если правильно подойти к организации процесса. Метод не только уменьшает число линий, но и позволяет поднять скорость передачи, исключая проблемы разбега фронтов такта и данных. Все оставшиеся последовательные интерфейсы используют технику восстановления тактового сигнала ( “CDR” ) по изменениям состояния последовательного канала. В §14.7.9 - §14.7.12 объясняется, как именно это происходит.
14.7.6 SATA, eSATA и SAS
SATA и SAS - быстрые последовательные шины для внешних и внутренних накопителей ( оптические и магнитные диски, ленты ). SATA заменил устаревший параллельный интерфейс ATA ( PATA или IDE ), а SAS, соответственно, SCSI. Оба интерфейса используют один разъём ( хотя для SAS есть несколько альтернативных вариантов ) и допускают «горячее» подключение. Максимальная скорость передачи данных составляет 6 Gbps , но физическое ограничение канала составляет 12 Gbps . У SAS есть кое-какие возможности, отсутствующие в SATA. Он предназначается для серверного ( как противоположность потребительскому ) сегмента. Идеологически SAS повторяет SCSI, но использует при этом последовательный интерфейс.
SATA и SAS на физическом уровне используют LVDS , кодировку 8b/10b, позволяющую восстановить тактовый сигнал и допускают горячую замену, хотя последняя опция для корректной работы требует поддержки со стороны операционной системы.
eSATA является расширением стандарта SATA для подключения внешних дисков. Физический соединитель отличается, но зато имеет большую надёжность. Других отличий нет. Внешний диск должен иметь свой источник питания, но рабочая группа “Power Over eSATA” призвана исправить данный недостаток.
==1037
50 SPI и I2C можно найти в ИМС датчиков, преобразователей, постоянной памяти, аналоговых ключей и цифровых потенциометров, которые рассчитаны на внешнее цифровое управление. <-
51 Встречаются и другие имена: «SDI», «DI», «SI» для входной линии и аналогичные для входной, причём имена сигналов соотносятся с направлением для данной конкретной микросхемы . Например, вывод «MOSI» у ведущего должен подключаться к «DI» у ведомого. <-
52 AD7927 может многое, например, выполнять циклический опрос заданного набора каналов. Надо задать последовательность, которая загружается через «теневой регистр» , доступ к которому открывают два бита в регистре управления. <-
53 Очень похожий протокол SMBus чётче описывает как сам протокол, так и его электрические характеристики. <-
54 Данный процесс можно рассматривать как аналог передачи данных по шине PC104/ISA в приложении к последовательной шине. В PC104 ведущий выставляет адрес на линии «A19...A0», а направление обозначает стробами «IOW'/IOR'». При записи данные на «D7...D0» подаёт ведущий, а при чтении - выбранный ведомый. В I2C реализуется тот же набор действий, но в последовательной форме, причём и для адреса, и для данных используется одна линия «SDA», а каждый бит на ней сопровождается импульсом на линии «SCL». <-
55 Массу деталей можно найти в технических заметках ##AN147, ##AN148, ##AN155, ##AN159, ##AN244, ##AN1796 и ##AN3358. <-
56 Буква «T», предваряющая названия сигналов, относится к термину «test» и указывает на исходную задумку разработчиков. <-