nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

"МКО (Mil-Std1553) через UART", часть 0

Некая подготовительная работа, конечно, уже проведена, ровно для этого мы сделали 16-битные передатчик и приёмник UART: они не только удобнее согласуются с 16-битным процессором, отправляя по одному слову за раз, но и куда ближе к этому самому МКО (ГОСТ Р 52070-2003), не на физическом уровне конечно (там манчестерский код и безусловная гальваническая развязка через трансформатор), но на логических. А дальше просто "поменяю" приёмопередатчик, подключённый к ПЛИС, и будет мне счастье.

А то паять два устройства МКО, общающихся друг с другом как-то стрёмно: они вполне могут нормально заработать, обмениваться информацией, только это будет ни разу не МКО, а какой-то "свой диалект" :) Покупать на свои PCIную плату чего-то совсем не хочется, последний раз когда я спрашивал цену, озвучивали 66 000 рублей, и ещё не факт что физическому лицу продадут. Где-то на предприятии, может даже в отделе, должен лежать компьютер с установленной платкой МКО, но пока удобнее всё отлаживать "у себя", а за этот компьютер засесть, когда уже почти всё будет готово.

В штатном приборе приёмник МКО явно должен быть достаточно умным, чтобы хотя бы "отфильтровывать" все командные слова, адресованные "не нам". Уж больно их много: устройств сидит чуть ли не под завязку, 30 штук, и каждого по крайней мере 5 раз в секунду опрашивают, а то и побольше: отдельно выдача целевой информации и отдельно телеметрия. И если бы нам приходилось каждый раз отвлекать процессор на такую фигню, он бы точно запарывал каждый кадр изображения, там его отвлекать нельзя!

Я стал думать, насколько это легко, "отпарсить" весь поток информации и выделить адресованную "нам" и на некоторое время впал в полнейший ступор, как же нам слово данных от командного слова отличить?


Ведь в слове данных могут произвольные 16 бит лежать, чего бы им не совпасть с определённым командным словом? Получается, надо чётко прослеживать логику посылок, типа "вот сейчас была пауза, значит первое слово - командное, в нём было запрошено 32 слова данных (СД). Значит, сейчас отсчитываем 33 слова: сначала ответное, потом СД, а первое после них - это и будет следующее командное слово!" И всё бы хорошо, но стоит один раз ошибиться - и можно по "мусору" из слов данных очень долго строить соответствующие цепочки и отлавливать непонятно что. Чисто по паузам ориентироваться?

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


И чуть-чуть разрисовал этот рисуночек из ГОСТа, чтобы больше так не путаться:


У слов данных СИНХРОИМПУЛЬС ИМЕЕТ ДРУГУЮ ПОЛЯРНОСТЬ! И это серьёзно упрощает нам жизнь. Вот это особенность, которой у меня в "16-битном" UART'е, увы, не будет. Думаю под такое дело выделить младший бит данных. Для 16-битных чисел он не шибко важен, число слов данных можно на единичку сместить, неважно, ну и признак "неисправность ОУ" я выдавать не собираюсь. С этими признаками отдельная история, как-нибудь обсудим.

Подумаем, можно ли просто-напросто прочитывать слова с синхроимпульсом, соответствующим командному или ответному слову, воспринимать их как командные слова, и если адрес задан "наш", реагировать на них, в противном случае ждать следующего?

Как ни странно, да! Вот контроллер шины посылает командное слово кому-то ещё. Мы его прочитываем, понимаем: "не нам" и продолжаем ничегонеделание.

От "кого-то ещё" пришло ответное слово. Важно, что в нём также стоит адрес оконечного устройства, с которого оно отправлено, и мы снова понимаем "не нам" - и игнорируем его!

Разве что наш приёмник должен быть в курсе того, что делает передатчик - и не прочитать случайно НАШЕ СОБСТВЕННОЕ ОТВЕТНОЕ СЛОВО в качестве командного, но это мы как-нибудь обеспечим.

Что интересно, даже самый упоротый "формат 3":


будет обработан корректно. "Формат 3" - это когда контроллер шины просит одно устройство передать данные другому устройству. Первое командное слово - на приём. Типа "устройство №3, прими 5 слов данных". Но вместо того, чтобы тут же их и выдать, посылается второе командное слово, типа "устройство №25, передай 5 слов данных". Вот тогда устройство №25 передаёт сначала ответное слово, затем слова данных, а после этого устройство №3 передаёт ответное слово, дескать "данные получены, всё хорошо".

Вообразим себя сначала на месте устройства №3. Всё, что нам нужно делать в этой ситуации - это во время приёма СЛОВ ДАННЫХ начисто игнорировать прочие слова (командные и ответные) - тогда всё пройдёт как надо. Мы получим свои 5 слов - и выдадим ответное слово, что они получены.

А теперь поставим себя на место устройства №25. Тут мы начисто проигнорировали командное слово, обращённое к №3, зато когда нам сказали выдать данные - мы как ни в чём не бывало послали ответное слово и слова данных, после чего начисто проигнорировали ответное слово от №3, т.к его адрес не совпадает с нашим! То есть, если выполнить "форматы 1-2", то "формат 3" должен получиться сам собой :)

Форматы 4-6 - это "команды управления".

Далее ещё есть "широковещательные команды", это когда задан адрес 31 ("все единицы" в 5-битном поле адреса). Они могут быть только на приём данных от контроллера шины (либо широковещательная команда на приём + обычная команда отдельному устройству на передачу), и различие лишь в том, что мы ни в коем случае не должны посылать ответное слово! Потому как если каждый абонент пошлёт ответное слово, будет коллизия. Вместо этого мы должны "включить" флажок "принята групповая команда" - и если нам подадут команду управления "передать ОС" - выдать ответное слово с этим флажком. Таким способом контроллер шины может убедиться, что широковещательную команду все получили! (Скажем, передали сразу всем 32 слова данных, а потом индивидуально каждого опросили - ты получил? - да! -а ты получил? -да!)

Но сейчас мне и этого не требуется реализовывать: будет передаваться две широковещательные команды, "синхронизация с СД" и передача массива "Бортовое время". Второй я вообще могу с чистой совестью проигнорировать, там "с большим размахом" идут год-месяц-день-час-минуты-секунды-микросекунды", причём на самом деле это "добавочка" к чисто аналоговой системе распространения секундных импульсов, к которой мы не подключены. Это примерно как работал телефон "100": сначала механическая женщина говорила точное время до секунд, а потом звучал звуковой сигнал - именно в этот момент и наступало озвученное время!

Если приходит "синхронизация с СД" - нам нужно прочитать ровно одно слово данных, а когда оно появится на 16-битном выходе, выдать ещё сигнал sync для наших часов реального времени. Ответное слово давать не надо, и флажок "принята групповая команда" нам не нужен - достоверно известно, что нас не будут "пытать" с получением синхронизации. В конце концов, если и не получим разок - ничего страшного нет. Хотя совсем по-хорошему нам следовало бы проверять каждое слово на достоверность. Типа, если шли 42, 43, 44, а потом сразу же 90, это как-то подозрительно, наверное ошибка, и тогда его лучше пропустить - ну набежит ещё 4 микросекунды, и пущай! Но вообще ничего особо страшного не случится, ну не примут наши данные из-за неправильной метки, а через 200 мс снова примут. Пока не будем заморачиваться.

Все остальные команды - на получение и на отправку данных, тут уже я напридумывал им подадреса:
0 0000  - подадрес режима управления,
1 0001 - FT (Flight Task) - полётное задание,
1 0010 - LT (Long rangeTarget) - параметры МДД,
0 0011 - ST (Short range Target) - параметры МБД,
1 0100 - AF (AFfine matrix) - матрица аффинного преобразования,
0 0101 - RA (RAw data) - прибор принимает «сырые данные» для стереорежима,
0 0110 - DA (DAta) - целевая информация,
1 0111 - не используем, т.к отличается  лишь 1 битом от КУ «11111»,
1 1000 - TM (TeleMetry) - телеметрическая информация,
0 1001 - IM (IMage) - передача изображения,
0 1010 - DU (DUmp) - передача дампа памяти,
1 1011 - не используем, т.к отличается лишь 1 битом от КУ «11111»,
0 1100 - RA (RAw data) - прибор передаёт «сырые данные» для стереорежима,
1 1101 - не используем, т.к отличается лишь 1 битом от КУ «11111»,
1 1110 - не используем, т.к отличается лишь 1 битом от КУ «11111».
0 1111 - не используем, т.к отличается лишь 1 битом от КУ «11111».


Старший бит поставил как чётность, это мы можем проверить (вот только учесть что 1 1111 - это один из вариантов "команды управления", может быть всё верно). А дальше - стал присваивать "по порядку", но так, чтобы от 0 0000 или 1 1111 наши подадреса отличались хоть двумя битами, паранойя наше всё!

Тут ещё и "закодировано", идёт ли приём или передача (они могли бы делить один и тот же подадрес, отличаясь лишь полем К, но у нас все подадреса разные), так что ещё и это проконтролировать можем. "Признак передачи" из подадреса: SubAddr[3] | (SubAddr[2] & SubAddr[1]).


В общем, что-то начинает проглядываться. Вот думаю, может сделать-таки здесь DMA, причём приоритет всегда за процессором, а контроллер информационного обмена может и подождать пару тактов, всё-таки информационный обмен весьма нетороплив, одно слово за 20 мкс, это 500 тактов!

Была другая идейка, но возможно она слишком "толстая". Там пара модулей памяти воткнуты между процессором и этим контроллером. В первый модуль процессор может только записывать, в любое время, а контроллер может читать в любое время (память в ПЛИС двухпортовая). Второй модуль - всё наоборот, причём адреса "на запись" и "на чтение" по сути они делят. Например, процессор запишет по адресу "0" - тем самым передаст первое слово целевой информации. А прочитает по адресу "0" - получит первое слово полётного задания. Но с DMA можно сделать контроллер более "самостоятельным" - с дампом памяти он сам справится, не заставляя процессор чего-то готовить :)

Такие вот мысли вслух...
Tags: ПЛИС, работа, странные девайсы
Subscribe

  • Так есть ли толк в ковариационной матрице?

    Задался этим вопросом применительно к своему прибору чуть более 2 недель назад. Рыл носом землю с попеременным успехом ( раз, два, три, четыре),…

  • Big Data, чтоб их ... (4)

    Наконец-то стряхнул пыль с компьютерной модели сближения, добавил в неё код, чтобы мы могли определить интересующие нас точки, и выписать…

  • Потёмкинская деревня - 2

    В ноябре 2020 года нужно было сделать скриншот несуществующей программы рабочего места под несуществующий прибор, чтобы добавить его в документацию.…

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments