Инструменты пользователя

Инструменты сайта


prog:spacewire:proj1923

Тестируем SpaceWire на МК 1923ВК014

В этой статье мы протестируем работу блока SpaceWire в МК 1923ВК014 с помощью тестера соответствия Spacewire (conformance tester) производства фирмы STAR-Dundee. Для это мы сначала рассмотрим основные положения протокола SpaceWire, потом разберём программу для тестирования МК и проведём серию основных тестов. Программа SpaceWire для МК 1923ВК014 доступна в архиве.

Начальные сведения о SpaceWire

SpaceWire — телекоммуникационная сеть для космических аппаратов, совмещающая в себе простоту и низкую цену реализации наравне с высокой производительностью и гибкостью архитектуры. Здесь представлены только основные положения стандарта SpaceWire, более подробную информацию можно получить из самого стандарта, спецификации на МК 1923ВК014, либо из этой замечательной статьи.

Стандарт SpaceWire предусматривает двунаправленную передачу информации по каналу (link). Канал SpaceWire включает две пары дифференциальных сигналов: одна пара D и S передающая, другая пара D и S принимающая. Такой способ передачи данных называется Data-Strobe (DS)-кодирование.

Линия D повторяет значение бита данных, т.е. имеет высокий потенциал для бита логической "1" и низкий потенциал для логического "0". Линия S изменяет свое состояние каждый раз, когда состояние линии D остается неизменным для следующего бита.

Битовый поток состоит из символов данных и управления. Тип символа определяется в зависимости от значения флага данные/управление. Из символов данных и управления собирается пакет SpaceWire.

Пакет SpaceWire включает поле адреса назначения, поле с данными пользователя и маркер конеца пакета. Формат пакета с адресом места назначения ориентирован на передачу пакета через сеть из маршрутизаторов. В нашем случае пакет передается между двумя абонентами (ПК-МК), связанными прямым каналом (точка-точка), поэтому поле адреса назначения остается пустым. Поле данных состоит из символов данных по 10 бит, из которых полезные 8 бит данных при приёме передаются в буфер FIFO. Конец пакета обозначается символом управления EOP или EEP.

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

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

В случае возникновения ошибок из любого состояния интерфейс канала сбрасывается и абоненты автоматически выходят на новое установление соединения, после чего передача информации продолжается. После сброса и до перехода в рабочий режим канал работает на обязательной скорости передачи данных 10 Мбит/с. После выхода в рабочий режим скорость передачи данных устанавливается пользователем в диапазоне от 2 до 400 Мбит/с.

Программа SpaceWire для тестирования

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

Условно программу можно разделить на четыре части: настройка тактирования МК и конфигурация блока Spacewire, определение состояния обмена данными в канале, обработка принимаемого пакета и отправка полученного пакета обратно.

В начале выполнения программы должна быть осуществлена настройка тактирования МК и конфигурация блока Spacewire.

//................................................................................ 		
/*                     Настройка тактирования МК                                */
//................................................................................ 
CLK_CNTR->KEY      = 0x8555aaa1;                 // Ключ для доступа к регистрам
CLK_CNTR->MAX_CLK  = 0;                          // Тактирование от генератора HSI (по умолчанию)  	
CLK_CNTR->HSE1_CLK = (1 << 27)|(1 << 29);	 // Включить осциллятор HSE0
while((CLK_CNTR->HSE1_STAT & (1 << 20)) == 0){}	 // Подождать, пока HSE0 не будет запущен	
CLK_CNTR->PLL0_CLK = (4 << 29)|(6 << 8)|(0 << 0);// (HSE1)|(PLL_N=6)|(PLL_Q=0)->PLL_FREQ= FIN*PLL_N/(PLL_Q+1)=10MHz*6/1=60 MHz	
CLK_CNTR->PLL0_CLK |= (1 << 27);	         // Включить PLL
while((CLK_CNTR->PLL0_STAT & (1 << 20)) == 0){}  // Подождать, пока PLL0 не будет запущен	
CLK_CNTR->MAX_CLK = 8;	                         // MAX_CLOK <-- генератор PLL0 = 60 MHz	
//................................................................................ 		
/*                     Настройка блока SPW0                               */
//................................................................................ 
CLK_CNTR->PER0_CLK |= (1<<21);           // Разрешения тактирования частотой SpaceWire0	
CLK_CNTR->SPW0_CLK  = 1<<16;	         // Разрешение формирования тактовой частоты для блока SpaceWire0
MDR_SPW0->DIV = (6<<8) | (6<<0);	 // (60 МГц)(6<<8) - делитель для обеспечения скорости 10 Мбит/с до режима RUN, (6<<0) - делитель для задания скорости передачи данных в режиме RUN
MDR_SPW0->PAUSE = (385<<8) | (51<<0);    // Настройка счётчика для обеспечения задержек 6.4 мкс и 850 нс при частоте тактирования SPW0 = 60 МГц
MDR_SPW0->PHY_CNTR = 0x214;              // Настройка и включение PHY блока SpaceWire0

На моей отладочной плате установлен резонатор на 10 МГц, частота которого умножается в блоке PLL на 6 и используется для тактирования всего МК.

Основными настройками блока SPW0 являются: задание скорости передачи данных, и настройка счётчика для обеспечения задержек 6.4 мкс и 850 нс.

Скорость передачи устанавливается делителями в регистре MDR_SPW0→DIV для двух режимов: до режима RUN и в режиме RUN. До режима RUN должна быть установлена скорость 10 Мбит/с. В режиме RUN можно установить любую скорость, в пределах от 2 Мбит/с до SPWCLK. В моём случае частота тактирования SPWCLK блока SPW0 равна 60 МГц, поэтому максимальная скорость передачи равна 60 Мбит/с. В программе мы установим скорость передачи 10 Мбит/с. Также обращаю внимание, что скорость интерфейса на приём задаётся внешним передатчиком! Для корректной работы приёмника скорость в канале приёма не должна превышать частоту CPUCLK более чем в 2 раза. В моём случае при частоте тактирования МК 60 МГц, максимальная скорость приёма равна 120 Мбит/с.

Настройка счётчика для обеспечения задержек 6.4 мкс и 850 нс настраивается в регистре MDR_SPW0→PAUSE исходя из частоты тактирования блока SPW0. SPW0 тактируется частотой 60 МГц, количество тактов для задержек равно

Nтактов (6.4 мкс) = 6.4 мкс * 60 МГц = 384 тактов
Nтактов (850 нс) = 0.85 мкс * 60 МГц = 51 такт

Для конфигурации блока SPW1 используются те же настройки, что и для блока SPW1. Однако

В текущей ревизии МК (2017 год) для корректной работы блока PHY SPW1 необходимо установить бит EN_BNG в регистре MDR_SPW0→PHY_CNTR (сигнал разрешения работы блока REF для SPW), так как блоки SPW0 и SPW1 PHY работают от одного источника Vref

Пример индивидуальной настройки блока SPW1 представлен в архиве в начале статьи.

Блок программы по определению состояния обмена данными в канале считывает регистр MDR_SPW0→STATUS и подсчитывает количества произошедших событий. Таким образом, можно, например, определить количество успешно принятых пакетов за время обмена данными.

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

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

После отправки пакета программа возвращается к определению состояния обмена данными в канале и цикл повторяется.

Тестер соответствия SpaceWire

Для тестирования блока SpaceWire в МК 1923ВК014 мы воспользуемся тестером соответствия SpaceWire фирмы STAR-Dundee. Тестер имеет широкий набор алгоритмов для проверки протокола обмена по SpaceWire, мы же воспользуемся только основными.

После установки драйверов и самой программы, подключим тестер по USB к ПК, а по SpaceWire к МК, используя канал Link 1. В программе для МК настраивается блок SpaceWire0, поэтому для соединения с тестером используем разъём Space Wire 0. Сейчас на задней крышечке тестера должны мигать два зелёных светодиода, обозначающих успешное подключение к ПК и ожидание подключения по SpaceWire.

Теперь необходимо зашить нашу программу в МК. В моей ревизии микроконтроллера JTAG интерфейс недоступен, поэтому воспользуемся программой Loader для прошивки через UART. Подробнее об этом написано в статье Загрузка и отладка программы в МК 1923ВК014

В случае успешной загрузки программы, между тестером и МК должно установиться соединение. Об этом будет свидетельствовать зелёный светодиод тестера около разъёма Link 1, который должен перестать мигать.

Настало время проводить тесты! Для этого запускаем на ПК программу ConformanceTester_v1… . Из основного окна программы мы переходим сразу во вкладку Settings:

Здесь нам необходимо установить только скорость передачи данных от тестера в МК. Остальные настройки трогать не будем, они для нас сейчас не важны. По умолчанию скорость передачи данных от тестера установлена 200 Мбит/с. Вводя в поле "Transmit rate divider" делитель скорости, мы сможем уменьшить её до корректного значения. Напомню, что скорость передачи данных, т.е. скорость приёма для МК, мы можем задать в зависимости от частоты тактирования блока SpaceWire в микроконтроллере. Скорость приёма в МК задаётся внешним передатчиком и не должна превышать частоту тактирования блока SpaceWire более чем в 2 раза. В нашем случае частота тактирования 60 МГц, поэтому максимально возможная скорость приёма данных микроконтроллером - 120 Мбит/с. Нам такая скорость для тестов не нужна, поэтому в программе ConformanceTester мы запишем значение делителя 20, установим тем самым скорость передачи - 10 Мбит/с, такую же, как и в МК.

Теперь переходим к вкладке Bit-level. Здесь установлены 7 тестов для проверки корректной работы интерфейса SpaceWire. Каждый тест запускается кнопочкой "Run Test". Слева от кнопочки появляется результат выполнения теста, внизу выводится краткая информация о прохождении теста.

Начнём по порядку.

- Запустим тест "Determine Link State" - тест определения состояния линии. Тест всегда проходится успешно. В нашем случае результатом теста является то, что SpaceWire устройство включено (UUT is link enabled).

- Следующий тест "Link Initialisation Test" - тест инициализации автомата SpaceWire. Если МК за 64 мкс выходит в режим RUN - тест пройден.

- Тест "Start Up Link Speed" проверяет, что начальная скорость передачи сигналов от тестируемого устройства составляет 10 ± 1 Мбит. В окошке внизу выводится результат измерения скорости. Иногда для прохождения теста требуется дополнительно немного варьировать значение для задержки в 6.4 мкс в регистре MDR_SPW0→PAUSE. В нашем случае результат получился таким

- Тест "Start Up Wawefrom" проверяет корректность Data-Strobe (DS)-кодирования, принцип которого описан в начале статьи.

- Тест "Link Shutdown Analysis" определяет что сигналы данных и стробирующие сигналы отстают друг от друга в пределах 555 нс.

- Тест "Disconnect Timeout" измеряет время до отключения МК от линии из-за ошибки рассоединения. Если тестер не отвечает в течении 850 нс, то МК должен отключиться от линии. Время для ожидания 850 нс выставляется в регистре MDR_SPW0→PAUSE.

- "Simultaneous D/S Transition Check" - точная оценка Data-Strobe (DS)-кодирования.

Эти тесты являются низкоуровневыми и должны выполняться для всех устройств. Основные проблемы могут возникать из-за неверного выставления времён задержек в регистре MDR_SPW0→PAUSE.

Если все тесты пройдены успешно, то переходим к вкладке EOP/EEP. Здесь мы выполним первые 5 тестов, определяющих корректный приём и передачу пустых пакетов.

Первые два теста "Empty Packet (EOP)" и "Empty Packet (EEP)" проверяют успешность приёма пустых пакетов с разным символом конца (EOP - конец нормального пакета, EЕP - конец пакета с ошибкой).

Для следующих двух тестов "Empty Packet Loop-back (EOP)" и "Empty Packet Loop-back (EOP)" необходимо настроить режим "эхо" для пересылки пустых пакетов обратно, что у нас в программе и сделано.

Последний тест "Send Packet With EEP" проверяет обратную передачу непустого пакета с ошибкой, что опять же реализовано в нашей программе.

Для тестирования передачи пакетов с данными перейдём во вкладку "Packet (1)".

- Тест "UUT is data loop-back" отправляет пакет, размер которого указан в поле "Packet size" (в нашем случае это 4), и ждёт получения в ответ этого же пакета (эхо).

- Тест "UUT is data sink" позволяет отправить пакет с данными, введенными в поле "Packet bytes". Проверяется приём пакета.

Последний тест ждёт, что МК будет сам передавать пакеты с данными. В нашей программе "эхо" этот режим не настроен, поэтому проводить тест не будем.

На этом мы и остановимся. Здесь были рассмотрены только основные тесты по соответствию блока SpaceWire стандарту, остальные пользователь может провести самостоятельно.

prog/spacewire/proj1923.txt · Последние изменения: 2018/11/12 11:13 — vova