July 26th, 2021

QuatCore

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

Долго мучали эту штуковину на симуляции, пора уже в макет это прошить и посмотреть, как оно себя поведёт.

Оставлю "основную схему" (процессор, SPI, контроллер ЖК-экранчика, видеообработчик, детектор и селектор синхроимпульсов), но "отниму" у неё RS485 и "отдам" его новой схеме, этому самому "МКО". Позже они должны будут получить общий доступ к памяти, но давайте сначала обособленно его проверим.

Окинем прощальным взором львиную долю "схемы" TopLevel:


Collapse )



Что-то есть. Первое сообщение "начинаем работу" - это от старой прошивки. При подаче питания срабатывает она, потом я по JTAG "запихиваю" в ПЛИС текущий проект. Это показывает, что по крайней мере "железо" рабочее.

Далее даю командное слово: адрес 6, подадрес 110002, передача ОУ-КШ, передать одно слово данных. Байты переставлены местами, потому как у меня приёмник и передатчик передают по 16 бит за раз, от младшего бита к старшему, а на компьютере передаётся по байту, от младшего бита к старшему, из-за чего "endian" меняется.

В ответ получаю ответное слово 0x3000 (адрес 6, все флажки сброшены, "всё в порядке") и одно слово данных: 0000. Да: по нашей логике последнее слово это всегда CRC, даже если оно по совместительству первое :) Вот это оно и есть, CRC от пустого сообщения!

Потом посылаю командные слова на "чужой" адрес 0, и никакого ответа не получаю. Всё верно.

В следующий раз заказал по тому же адресу и подадресу ("телеметрия") 2 слова данных - и получил заголовок массива телеметрии, 0xFF00, а затем CRC от него. Тот же CRC можно получить на crccalc.com, если ввести 00FF, и в строке CRC16/KERMIT в результате 0x0F78 переставить местами байты.

Потом ещё попробовал 3 слова данных, 4, 5, 6, 7. Результат: ответное слово, за ним заголовок массива, за ним сплошные нули (ну да, здесь я в память никаких "интересных" значений не клал), и CRC. Во всех случаях корректный.

И ещё "заказал" 0 слов данных, только этот ноль в МКО (ГОСТ Р 52070-2003, Mil-Std 1553) интерпретируется как 32 слова, что нужно было также прописать в коде. Что ж, эта часть также работает, выдаётся ответное слово и ещё 32 слова данных, последнее из которых: CRC.

Продолжение следует...
QuatCore

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

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


Collapse )

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

А сейчас, пожалуй, надо взяться за DMA.