nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

"МКО через UART" в железе - 2

Продолжим проверять этот модулёк.



"Для закрепления пройденного", снова запрашиваем телеметрию, сначала 1 слово данных (командное слово 0x3701, и там нули: CRC от пустого сообщения), затем 32 слова данных (командное слово 0x3700, и там заголовок массива, 31 слово данных и CRC от всего этого безобразия).

Затем пытаемся получить "полётное задание" (командное слово 0x3624), которое вообще-то мы не должны получать - мы должны его передавать! Приходит ответное слово 0x3400, т.е "адрес 6, ошибка в сообщении".

В следующий раз запрашиваем "несуществующий" подадрес 000012 (командное слово 0x3424). У нас старший бит подадреса играет роль бита чётности, все "правильные" подадреса должны содержать чётное количество "единичек" (не считая подадреса 11111 режима управления), а здесь единичка всего одна. Результат тот же самый: "ошибка в сообщении".

Потом мы запрашиваем целевую информацию, 24 слова данных (командное слово 0x34D8). Приходит ответное слово 0x3000 (адрес 6, всё в порядке), затем заголовок массива целевой информации 0x3C3C, после чего сама информация. Но туда я тупо положил числа от 1 до 23. Единичка пошла, а вот вместо двойки пришла метка времени. Да, именно для одного адреса в памяти мы предусмотрели, что вместо него нужно взять значение из "часов реального времени". Дальше пошли числа от 3 до 22. Я их ровно такие и поставил, в BCD :) И наконец, вместо 23 у нас выдаётся CRC, так и должно быть.

И чтобы чуть "помучать" часы реального времени, повторно запросил целевую информацию. Как видно, всё то же самое, но метка времени отличается. Была 0xE8E4, стала 0x0E57. Старший байт "перешёл через ноль", отличие в 37 единиц. Младший разряд старшего байта: 50 мс, т.е прошло 1,85 секунды между запросами. Похоже на правду...

Далее я наконец-то попробовал передать данные прибору, "полётное задание". Дал правильный заголовок массива, 0xAAAA, а затем некие 3 слова 0x0001, 0x0002 и 0x0003. Пришло ответное слово 0x3400, т.е "адрес 6, ошибка в сообщении". Да, потому что 0x0003 вот ни разу не является CRC от этого сообщения!

В следующий раз я вписал правильный CRC, 0x20AB - и получил ответное слово 0x3000, "адрес 6, всё в порядке".

И потом я попробовал исказить заголовок массива, 0xABAA вместо 0xAAAA, и соответствующим образом подправить CRC. Но меня снова "завернули": "адрес 6, ошибка в сообщении", поскольку заголовок массива не совпадает.

Дальше я вдруг задумался: а как это я умудрился получить меняющиеся метки времени, если у меня вход Mark никуда не подключён??? Ведь здесь должно вписываться не время отправки сообщения (это контроллер шины и так знает), а середину экспозиции кадра, на основе которого получены данные! То ли процессор, то ли обработчик видео, должен будет об этом позаботиться и отправлять единичку на вход Mark в нужный момент, но пока же этого нет.

Тогда я честно этот вход "заземлил", после чего повторно запустил синтез. Теперь вместо 1706 ЛЭ на синтезе и 1734 ЛЭ после фиттера, я получил 1672 ЛЭ на синтезе и 1700 ЛЭ после фиттера! То есть вот сейчас квартусу стало ясно, что все старшие разряды часов реального времени никому не нужны, и их можно выбросить. Выходит, "висящий в воздухе" на схеме в квартусе вывод по умолчанию соединяют на лог "1"?

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

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

Второй раз послал групповую команду "Синхронизация (с СД)". Ожидаемо, никакого ответа не получил. И чтобы убедиться, что штуковина не "зависла", снова запросил телеметрию - и успешно её получил.


Выглядит неплохо! Есть, что улучшить:
- пусть и на индивидуальную команду "Синхронизация (с СД)" отвечает правильно, подтверждая, что команда пришла,
- если "пообещать" длинное сообщение (например, 32 слова), но не передать его целиком - контроллер будет до посинения ждать, пока нужное число слов данных будет передано, здесь никакого таймаута пока не предусмотрено. Когда "ручками" с ним общаешься - неприятно, что-то немного не то вбил - и вдруг ни ответа ни привета, и поди разберись, что с ним. На деле, не так уж это и страшно, пошлёшь запрос повторно, он "доберёт" сколько надо слов, уйдёт в sIdle по несовпадению CRC, и дело с концом. Но вообще с таймаутом правильнее, ГОСТ предписывает проверять временнЫе параметры и при отступлении от норм тихо ругаться.
- у меня были предусмотрены команды "дамп памяти" и "передать изображение", там маленькими кусочками передаётся содержимое памяти, "внутренней" и "внешней" соответственно. Можно было бы это дело на контроллер "взвалить", чтоб делал без участия процессора. Но пока было лень...

А сейчас, пожалуй, надо взяться за DMA.
Tags: ПЛИС, работа, странные девайсы
Subscribe

  • Тестируем atan1 на QuatCore

    Пора уже перебираться на "железо" потихоньку. Решил начать с самого первого алгоритма, поскольку он уже был написан на ассемблере. В программу внёс…

  • Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

    Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза: Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и…

  • Алгоритм Ремеза в экселе

    Вот и до него руки дошли, причина станет ясна в следующем посте. Изучать чужие библиотеки было лениво (в том же BOOSTе сам чёрт ногу сломит), писать…

  • atan на ЧЕТЫРЁХ умножениях

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

  • Ай да Пафнутий Львович!

    Решил ещё немного поковыряться со своим арктангенсом. Хотел применить алгоритм Ремеза, но начал с узлов Чебышёва. И для начала со своего "линейного…

  • atan(y/x) на двух умножениях!

    Чего-то никак меня не отпустит эта тема, всё кажется, что есть очень простой и эффективный метод, надо только его найти! Сейчас вот такое…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments