[i] Тестирование SpaceWire в МК К1986ВЕ8Т
В статье рассмотрено взаимодействие блока SpaceWire в микроконтроллерах К1986ВЕ8Т с тестером Spacewire (conformance tester) производства фирмы STAR-Dundee. Для этого сначала рассмотрены основные положения протокола SpaceWire, далее программа для тестирования микроконтроллера, и впоследствии проведена серия основных тестов.
Пример SpaceWire для микроконтроллера К1986ВЕ8Т, используемый в данной статье, доступен в архиве "Standard Peripherals Library" в конце статьи (путь в архиве: "Examples\MDR32F8\spw_loopback").
Содержание
|
1. Начальные сведения о SpaceWire 2. Программа SpaceWire для тестирования 3. Тестирование SpaceWire с помощью тестера STAR-Dundee |
1. Начальные сведения о SpaceWire
SpaceWire — телекоммуникационная сеть для космических аппаратов, совмещающая в себе простоту и низкую цену реализации наравне с высокой производительностью и гибкостью архитектуры. Здесь представлены только основные положения стандарта SpaceWire, более подробную информацию можно получить из самого стандарта, спецификации на МК К1986ВЕ8Т, либо из статьи с внешнего ресурса.
Стандарт SpaceWire предусматривает двунаправленную передачу информации по каналу (link). Канал SpaceWire включает две пары дифференциальных сигналов: одна пара D и S передающая, другая пара D и S принимающая. Такой способ передачи данных называется Data-Strobe (DS)-кодирование. Наглядное представление кодирования на рисунке 1.
Рисунок 1 - Data-Strobe (DS)-кодирование
Линия D повторяет значение бита данных, то есть имеет высокий потенциал для бита логической "1" и низкий потенциал для логического "0". Линия S изменяет свое состояние каждый раз, когда состояние линии D остается неизменным для следующего бита.
Битовый поток состоит из символов данных и управления. Тип символа определяется в зависимости от значения флага данные/управление. Из символов данных и управления собирается пакет SpaceWire.
Пакет SpaceWire включает поле адреса назначения, поле с данными пользователя и маркер конца пакета. Формат пакета с адресом места назначения ориентирован на передачу пакета через сеть из маршрутизаторов. В нашем случае пакет передается между двумя абонентами (ПК-МК), связанными прямым каналом (точка-точка), поэтому поле адреса назначения не используется и формирование пакета начинается сразу с поля данных. Поле данных состоит из символов данных по 10 бит, из которых полезные 8 бит данных при приёме передаются в буфер FIFO. Конец пакета обозначается символом управления EOP или EEP. Графически пакет SpaceWire представлен на рисунке 2.
Рисунок 2 - Структура пакета SpaceWire
Для передачи и приёма пакетов используются регистры дескрипторов, которые хранят информацию о длине пакетов и типах конца пакетов. При отправке длина пакета и тип конца пакета указываются пользователем. При приёме длину пакета подсчитывает отдельный счётчик по количеству принятых символов данных. При получении символа конца пакета, полученное значение счётчика переписывается в разряды 24-0 текущего дескриптора, а сам счетчик сбрасывается в 0.
Учитывая суровые условия и сложную помеховую обстановку на борту космических аппаратов и аналогичных систем, на которые ориентирован стандарт SpaceWire, разрыв и последующее автоматическое восстановление соединения является штатной ситуацией, обрабатываемой автоматом контроллера SpaceWire, который представлен на рисунке 3.
Рисунок 3 - Автомат контроллера Spacewire
В случае возникновения ошибок из любого состояния интерфейс канала сбрасывается, и абоненты автоматически выходят на новое установление соединения, после чего передача информации продолжается. После сброса и до перехода в рабочий режим канал работает на обязательной скорости передачи данных 10 Мбит/с. После выхода в рабочий режим скорость передачи данных устанавливается пользователем в диапазоне от 2 до 400 Мбит/с.
2. Программа SpaceWire для тестирования
В этом разделе будет разобран код с основными настройками блока SpaceWire, а также отмечена реализация функции "эхо" для тестов. Для большего понимания по всему коду приведены комментарии.
Условно программу можно разделить на три части:
-
Настройка тактирования микроконтроллера и конфигурация блока Spacewire;
-
Определение состояния обмена данными в канале;
-
Обработка принимаемого пакета и отправка обратно.
В начале программы осуществлена настройка тактирования микроконтроллера и конфигурация блока Spacewire. Основными настройками блока SpaceWire являются: задание скорости передачи данных и настройка счётчика для обеспечения задержек 6.4 мкс и 850 нс.
Скорость передачи устанавливается делителями в регистре MDR_SPWx→DIV для двух режимов: до режима RUN и в режиме RUN. До режима RUN должна быть установлена скорость 10 Мбит/с. В режиме RUN можно установить любую скорость, в пределах от 2 Мбит/с до SPWCLK. В рассмотренном случае частота тактирования SPWCLK блока SPWx равна 60 МГц для К1986ВЕ8Т, поэтому максимальная скорость передачи равна 60 Мбит/с. Также следует обратить внимание, что скорость интерфейса на приём задаётся внешним передатчиком! Для корректной работы приёмника скорость в канале приёма не должна превышать частоту CPUCLK более чем в 2 раза. В рассмотренном случае при частоте тактирования микроконтроллера 60 МГц, максимальная скорость приёма равна 120 Мбит/с.
Настройка счётчика для обеспечения задержек 6.4 мкс и 850 нс настраивается в регистре MDR_SPWx→PAUSE, исходя из частоты тактирования блока SPWx. Для стабильной работы может потребоваться подобрать количество тактов экспериментально.
Блок программы по определению состояния обмена данными в канале считывает регистр MDR_SPWx→STATUS и подсчитывает количества произошедших событий. Таким образом, можно, например, определить количество успешно принятых пакетов за время обмена данными.
В обработчике принимаемых пакетов последовательно проверяются все дескрипторы приемника на наличие действительных данных (31 бит - флаг готовности дескриптора). Если дескриптор приемника заполнен, то из дескриптора считывается информация о длине принятого пакета и о типе конца пакета (EOP или EEP).
Важно отметить, что буфер FIFO приёмника имеет размер 64 байта, что не достаточно для приёма больших пакетов. Поэтому для приёма пакетов больше, чем 64 байта, в ходе работы МК необходимо перемещать данные из FIFO приемника (FIFORX) в другую память МК, например, во внутреннюю ОЗУ. Дескриптор приёмника заполняется только после получения конца пакета (или из-за разрыва связи), поэтому до этого момента принимаемые данные необходимо постоянно перемещать из FIFORX в ОЗУ. Для этого может быть использовано ядро или DMA. В примере реализовано оба варианта, выбор осуществляется с помощью макроопределения USE_DMA_RX:
- если USE_DMA_RX раскомментировано, то для перемещения принятых данных из FIFORX в массив кольцевого буфера используется DMA, канал 0. Максимальная длина принимаемого пакета ограничена максимальным количеством пересылаемых слов в цикле DMA, т.е. 1024 32-разрядных слова (макроопределение SIZE_BUF). Если требуется передача большего количества слов с помощью DMA, то необходимо использовать режим DMA "исполнение с изменением конфигурации".
- если USE_DMA_RX закомментировано, то для своевременного реагирования используется прерывание по заполнению FIFO приёмника на 3/4, в обработчике прерывания принятые данные перемещаются из FIFORX в массив кольцевого буфера. Максимальная длина принимаемого пакета ограничена размерами кольцевого буфера, в примере это 1024 слова (4096 байт), макроопределение SIZE_BUF.
В зависимости от принятого пакета в дескриптор передачи записывается тип конца пакета и длина пакета в байтах. Если пакет имел данные, то они последовательно записываются в FIFO передатчика из программного кольцевого буфера, где хранится пакет. Из-за ошибки некорректного запроса к DMA (описание ошибки приведено в Errata на МК), в примере используется перемещение данных из ОЗУ в FIFOTX с помощью ядра.
После отправки пакета программа возвращается к определению состояния обмена данными в канале, и цикл повторяется.
3. Тестирование SpaceWire с помощью тестера STAR-Dundee
Для тестирования блока SpaceWire в МК К1986ВЕ8Т будет использован тестер соответствия SpaceWire фирмы STAR-Dundee. Тестер имеет широкий набор алгоритмов для проверки протокола обмена по SpaceWire, но для статьи будут приведены только основные.
После установки драйверов и самой программы, необходимо подключить тестер по USB к ПК, а по SpaceWire к микроконтроллеру, используя канал Link 1. После проделанных манипуляций на задней крышке тестера должны мигать два зелёных светодиода, обозначающих успешное подключение к ПК и ожидание подключения по SpaceWire.
Теперь необходимо загрузить программу в микроконтроллер. Для К1986ВЕ8Т загрузка выполняется при входе в режим отладки.
В случае успешной загрузки программы, между тестером и микроконтроллером должно установиться соединение. Об этом будет свидетельствовать зелёный светодиод тестера около разъёма Link 1, который должен перестать мигать.
Для проведения тестов необходимо запустить на ПК программу ConformanceTester_v1… . Из основного окна программы нужно перейти сразу во вкладку Settings, как это показано на рисунке 4:
Рисунок 4 - Настройки вкладки Settings
Здесь необходимо установить только скорость передачи данных от тестера в микроконтроллер. Остальные настройки трогать не нужно, они сейчас не важны. По умолчанию скорость передачи данных от тестера установлена 200 Мбит/с. Вводя в поле "Transmit rate divider" делитель скорости, можно уменьшить её до корректного значения. Скорость передачи данных, то есть скорость приёма для микроконтроллера, может задаваться в зависимости от частоты тактирования блока SpaceWire в микроконтроллере. Скорость приёма в микроконтроллере задаётся внешним передатчиком и не должна превышать частоту тактирования блока SpaceWire более чем в 2 раза. В рассматриваемом случае частота тактирования 60 МГц, поэтому максимально возможная скорость приёма данных микроконтроллером равна 120 Мбит/с. В программе ConformanceTester необходимо ввести делитель, задав допустимую скорость передачи.
Теперь нужно перейти во вкладку Bit-level. Здесь установлены 7 тестов для проверки корректной работы интерфейса SpaceWire. Каждый тест запускается кнопкой "Run Test". Слева от кнопки появляется результат выполнения теста, внизу выводится краткая информация о прохождении теста. Примерный вид вкладки Bit-level приведен на рисунке 5.
Рисунок 5 - Настройки вкладки Bit-level
Краткое описание тестов:
- Тест "Determine Link State", то есть тест определения состояния линии. Тест всегда проходится успешно. В рассматриваемом случае результатом теста является то, что SpaceWire устройство включено (UUT is link enabled).
- Тест "Link Initialisation Test" - это тест инициализации автомата SpaceWire. Если микроконтроллер за 64 мкс выходит в режим RUN, то тест считается пройденным.
- Тест "Start Up Link Speed" проверяет, что начальная скорость передачи сигналов от тестируемого устройства составляет 10 ± 1 Мбит. В окошке внизу выводится результат измерения скорости. Иногда для прохождения теста требуется дополнительно немного варьировать значение для задержки в 6.4 мкс в регистре MDR_SPWx→PAUSE. В рассматриваемом случае результат получился таким, как на рисунке 6.
Рисунок 6 - Результаты теста "Start Up Link Speed"
- Тест "Start Up Wavefrom" проверяет корректность Data-Strobe (DS)-кодирования, принцип которого описан в начале статьи. Результаты теста представлены на рисунке 7.
Рисунок 7 - Результаты теста "Start Up Wavefrom"
- Тест "Link Shutdown Analysis" определяет, что сигналы данных и стробирующие сигналы отстают друг от друга в пределах 555 нс.
- Тест "Disconnect Timeout" измеряет время до отключения микроконтроллера от линии из-за ошибки рассоединения. Если тестер не отвечает в течении 850 нс, то микроконтроллер должен отключиться от линии. Время для ожидания 850 нс выставляется в регистре MDR_SPWx→PAUSE. Отключение от линии после 850 нс ожидания показано на рисунке 8.
Рисунок 8 - Отключение от линии после 850 нс ожидания восстановления соединения
- Тест "Simultaneous D/S Transition Check" - точная оценка Data-Strobe (DS)-кодирования.
Эти тесты являются низкоуровневыми и должны выполняться для всех устройств. Основные проблемы могут возникать из-за неверного выставления времён задержек в регистре MDR_SPWx→PAUSE. Показателем прохождения всех тестов будет результат из рисунка 9.
Рисунок 9 - Успешное прохождение тестов из вкладки Bit-level
Если все тесты пройдены успешно, то далее нужно перейти во вкладку EOP/EEP. Здесь на тестовом стенде будут выполнены первые 5 тестов, определяющих корректный приём и передачу пустых пакетов. Вид вкладки EOP/EEP показан на рисунке 10.
Рисунок 10 - Вкладка EOP/EEP
Первые два теста "Empty Packet (EOP)" и "Empty Packet (EEP)" проверяют успешность приёма пустых пакетов с разным символом конца (EOP - конец нормального пакета, EЕP - конец пакета с ошибкой).
Для следующих двух тестов "Empty Packet Loop-back (EOP)" и "Empty Packet Loop-back (EOP)" необходимо настроить режим "эхо" для пересылки пустых пакетов обратно, что в приведенной программе сделано.
Последний тест "Send Packet With EEP" проверяет обратную передачу непустого пакета с ошибкой, что опять же реализовано в программе. После успешного прохождения пяти тестов результат будет таким, как на рисунке 11.
Рисунок 11 - Успешное прохождение тестов из вкладки EOP/EEP
Для тестирования передачи пакетов с данными нужно перейти во вкладку "Packet (1)". Вид вкладки и настройки показаны на рисунке 12.
Рисунок 12 - Вкладка Packet(1) и её настройки
- Тест "UUT is data loop-back" отправляет пакет, размер которого указан в поле "Packet size" (в рассматриваемом случае это 4), и ждёт получения в ответ этого же пакета (эхо).
- Тест "UUT is data sink" позволяет отправить пакет с данными, введенными в поле "Packet bytes". Проверяется приём пакета.
- Тест "UUT is data source" ожидает, что микроконтроллер будет сам передавать пакеты с данными. В рассматриваемой программе "эхо" этот режим не настроен, поэтому проводить тест не нужно, выставив соответствующую галочку возле надписи "Not run"
Успешное прохождение первых двух тестов будет выглядеть также, как на рисунке 13.
Рисунок 13 - Успешное прохождение тестов из вкладки Packet(1)
В статье были рассмотрены только основные тесты по соответствию блока SpaceWire стандарту, остальные тесты могут быть проведены самостоятельно.
Сохранить статью в PDF
Документация
Программное обеспечение