Swic

Материал из WIKI ELVEES

Статьи о SpaceWire

Руководство пользователя SpaceWire (Steve Parkes)

Физический уровень

Терминирующие резисторы

Терминирующие резисторы номиналом 100 Ом реализованы в приемниках SpaceWire на кристалле. Установка внешних терминирующих резисторов не требуется.

Failsafe-резисторы и "ложные соединения"

При установке соединения передатчик SpaceWire начинает отсылать в канал символы NULL. Также для установки соединения порт ожидает приема NULL-ов от удаленного порта.

Если линии приемника никуда не подключены, или подключены к выключенному передатчику, дифференциальное напряжение на них близко к нулю. Когда включается передатчик, передаваемые NULL-ы "наводятся" на линии приемника. Наведенное дифнапряжение на линиях приемника невелико, однако этого достаточно, чтобы приемник "воспринял" NULL-ы. После этого порт переходит в состояние "соединение установлено", несмотря на фактическое отсутствие второго абонента. Это происходит не всегда и не на всех портах SpaceWire, но вероятность такого события является ненулевой. Это событие условно обозначается как "ложное соединение".

Схематично наводки на входе показаны на рисунке ниже:


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

Чтобы исключить ложные соединения, необходимо подключать к линиям приемника резисторы, подтягивающие линии P и M к разным уровням (далее - failsafe-резисторы). Это обеспечивает на входах дифнапряжение, достаточное для того, чтобы наводки от передатчика были несущественными.

Номинал и схема включения failsafe-резисторов для конкретного типа микросхем указаны в руководстве пользователя на микросхему.

Примечание. Данная особенность не является специфичной для контроллеров SpaceWire в микросхемах АО НПЦ "ЭЛВИС". Ряд сторонних устройств с портами SpaceWire также использует аналогичные failsafe-резисторы.

Разрыв соединения при повышении скорости обмена

Помимо параметров передатчика и приемника, на максимальную скорость обмена влияет качество линий передачи. Из практики - кабели длиной более 20 метров не обеспечивают скорости обмена выше 100 Мбит/с, несмотря на то, что сами передатчики и приемники в микросхеме способны работать на более высоких скоростях. Поэтому рекомендуется в ПО проверять соединение после повышения скорости передачи, даже в случае установки заведомо пониженной скорости.

Отказы портов SpaceWire

Из практики анализа отказов - самой частой причиной отказов является "выбитый" вывод LVDS. Это является следствием воздействия повышенного напряжения - либо статического электричества, либо подключение "на горячую", либо подключение двух SpaceWire-устройств без общей "земли".

Предварительная диагностика подобного отказа может производиться на стороне пользователя. Она сводится к измерению сопротивления всех выводов порта SpaceWire к "земле" и к питанию 3.3В. Сопротивление менее 1 кОм говорит о том, что с выводом порта SpaceWire не все в порядке.

Общая "земля" и гальваническая развязка

Стандарт SpaceWire не предполагает гальванической развязки. Поэтому, так или иначе, кабели SpaceWire должны содержать общий сигнал «земли». Если обратить внимание на кабель SpaceWire, описанный в стандарте, видно, что общая «земля» двух устройств, соединенных по SpaceWire, соединяет корпуса разъемов через внешнюю экранирующую оплетку кабеля. Фактически, это значит, что для работы кабеля, соответствующего стандарту, необходимо соединять корпус разъема на плате с «землей» этой платы. В частности, такое решение использовано и в устройстве USB Brick фирмы StarDundee. В отладочных модулях и другой аппаратуре АО НПЦ «ЭЛВИС» для работы по SpaceWire используется альтернативный вариант. Используемый кабель для обмена по SpaceWire – обычная витая пара. Контакты №3 разъемов SpaceWire двух устройств соединены посредством экранирующей оплетки кабеля. Опыт работы показывает, что использование такого кабеля обеспечивает корректную работу микросхем АО НПЦ «ЭЛВИС» на скоростях передачи данных, гарантированных документацией.

Логический уровень

Таймауты установки соединения

Согласно стандарту SpaceWire, при установке соединения передатчик должен перемежать посылки символов NULL с "молчанием", причем длительности отсылки и "молчания" строго регламентирована. В процессорах АО НПЦ "ЭЛВИС" эти длительности рассчитываются с использованием частоты ядра CPU (за исключением микросхемы 1892ВМ14Я). Поскольку частота ядра CPU является конфигурируемой, для соблюдения стандарта предусмотрен коэффициент в регистре TX_SPEED (поле TIMING). Значение по умолчанию соответствует частоте CPU, равной 100 МГц. Если CPU работает на другой частоте, необходимо изменить этот коэффициент в соответствии с руководством пользователя на конкретную микросхему. При невыполнении этого требования микросхема с высокой долей вероятности может не устанавливать соединение с удаленным абонентом.

Скорость передачи и пропускная способность

Максимальная пропускная способность канала SpaceWire равна 0.8 от установленной битовой скорости, так как 8 бит данных в канале SpaceWire представлены 10-битовым словом. 1 бит - признак "данные/служебный символ" и 1 бит - четность. То есть, максимальная битовая скорость 400 Мбит/с (по стандарту) - это максимальная пропускная способность 320 Мбит/с.

Зависимость скорости передачи от настроек удаленного абонента

Приемник принимает данные по SpaceWire на той скорости, которая настроена у передатчика. Иными словами, если мы хотим передавать на скорости 400 Мбит/с - нам нужно только настроить передатчик на эту скорость. Приемник просто примет это как данность.

Однако есть нюанс, который необходимо учитывать в данном случае. Передатчик отсылает данные только тогда, когда получит от приемника подтверждение готовности к приему. Таким подтверждением является получение служебного символа FCT - оно говорит передатчику, что приемник готов принять очередные несколько байт. Если принимающий удаленный абонент настроен на скорость передачи 10 Мбит/с (базовую при установке соединения), то максимальный темп отсылки символов FCT позволит отсылать этому абоненту данные с максимальной пропускной способностью ~100 Мбит/с. Поэтому, даже если узел должен только получать данные, для обеспечения пропускной способности рекомендуется повышать его скорость передачи после установки соединения.

Перечень возможных коллизий при работе по SpaceWire

Невозможность установить соединение из-за заполненного приемного FIFO данных

Если у порта SpaceWire целиком заполнено приемное FIFO данных, то этот порт не сможет установить соединение, пока в приемном FIFO данных не освободится хотя бы одна ячейка. Данная ситуация может возникнуть при разрыве соединения во время передачи данных. Чтобы избежать данной ситуации, необходимо очищать приемное FIFO данных перед установкой соединения.

"Лишние" данные в FIFO данных приемника

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

Чтобы избежать данной ситуации, необходимо очищать приемное FIFO данных перед установкой соединения.

"Лишние" данные в FIFO дескрипторов приемника

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

Чтобы избежать данной ситуации, необходимо очищать приемное FIFO дескрипторов перед установкой соединения.

"Лишние" данные в FIFO данных передатчика

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

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

"Лишние" дескрипторы в FIFO дескрипторов передатчика

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

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

Отсылка случайных данных в канал SpaceWire

Применимо к микросхемам 1892ВМ8Я, 1892ХД1Я, 1892КП1Я.

Порты SpaceWire данных микросхем могут отсылать случайные данные при установке соединения, изменении скорости передачи или при разрыве соединения. В канал отсылается один-два символа при каждом действии (установили соединение - в канал отправилось не более двух символов, далее ничего не будет непроизвольно отсылаться до изменения скорости передачи или разрыва соединения). Отсылка происходит спорадически, невозможно предсказать, произойдет ли это в конкретном случае.

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

Процедуры очистки FIFO

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

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

Для микросхемы 1892ВМ14Я полный сброс всех FIFO производится записью единицы в бит MODE_CR[6]. Для микросхем 1892ВМ8Я, 1892ВМ7Я, 1892ХД1Я необходимы более сложные алгоритмы, описанные ниже.

Очистка FIFO RX DATA

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

Важные нюансы:

1) Ожидать можно с помощью таймаута, либо с помощью чтения поля WCX регистра CSR DMA. Если поле WCX перестало менять свое значение - значит, DMA больше ничего не вычитывает из FIFO. Значит, вычитывать нечего, и процедура завершена.

2) В микросхемах 1892ВМ8Я, 1892ХД1Я, 1892ВМ7Я существуют особенности процедуры останова DMA, отраженные в руководстве пользователя на микросхему. Их в данном случае также необходимо учитывать.

Очистка FIFO RX DESC

Очистка приемного FIFO дескрипторов осуществляется аналогично очистке приемного FIFO данных.

Очистка FIFO TX DATA и FIFO TX DESC

Возможны два сценария:

1) В передающем FIFO данных остались данные, для которых нет соответствующего дескриптора. Они не будут переданы до получения соответствующего дескриптора. Установить, сколько таких данных находится в FIFO, имеющимися средствами невозможно.

2) В передающем FIFO данных остались данные, а в FIFO дескрипторов - дескрипторы неотправленных пакетов.

Во втором случае надо сначала убедиться в отсутствии "лишних" дескрипторов в FIFO дескрипторов, и после этого приступать к очистке FIFO данных.

Общий алгоритм очистки таков:

  • включается режим Loopback (установкой в единицу бита MODE_CR[13];
  • DMA приема данных включается на прием некоторого количества данных, заведомо большего, чем размер передающего буфера;
  • проверяется, есть ли изменения поля WCX в регистре CSR принимающего канала DMA. Если изменения есть - значит, передатчик отправляет оставшиеся данные в соответствии с оставшимися дескрипторами. Следует ожидать, пока поле WCX не перестанет изменяться;
  • если данные перестали передаваться - значит, либо отработаны все дескрипторы из FIFO дескрипторов (но данные могли остаться в FIFO данных), либо выданы все данные из FIFO данных (но дескрипторы могут еще оставаться в FIFO дескрипторов);
  • чтобы проверить, остались ли неотработанные дескрипторы, необходимо через DMA данных передать одно слово и проверить состояние поля WCX в принимающем канале DMA. Если оно изменилось - значит, в передающем FIFO дескрипторов остались неотработанные дескрипторы. Необходимо формировать и передавать через DMA данных по одному слову, пока у DMA приемника не перестанет меняться поле WCX - это будет значит, что все дескрипторы отработаны и FIFO дескрипторов на передачу очищено;
  • далее необходимо окончательно очистить передающее FIFO данных. Для этого формируется и передается в передатчик дескриптор на передачу одного байта;
  • проверяется, изменился ли счетчик WCX в канале DMA приема данных. Если изменился - значит, байт был отправлен и получен, и нужно снова формировать и передавать дескриптор;
  • если счетчик WCX в канале DMA приема данных не изменился - значит, передающее FIFO данных очищено и в нем больше нет данных, и более формировать дескриптор не требуется;
  • для завершения процедуры необходимо, чтобы отработал последний переданный в передатчик дескриптор. Для этого DMA данных передатчика должно передать из памяти одно слово данных. Оно будет передано, после чего оба FIFO очищены.