Векторный анализатор цепей на основе компьютерного SDR-приёмника
Протокол работы прошивки микроконтроллера

Тут описан протокол работы прошивки микроконтроллера самодельного векторного анализатора цепей на базе компьютерного SDR-приёмника, домашняя страница проекта тут. Благодаря данному описанию можно легко портировать прошивку на МК любого типа.

Прошивка в микроконтроллере антенного анализатора является «тонким клиентом»: МК выполняет роль простого «преобразователя интерфейсов». Он принимает от компьютера команды через com-порт и осуществляется необходимые действия по управлению выходными интерфейсами: параллельным портом, последовательными интерфейсами SPI и I2C, к которым подключены генераторы ВЧ и измерительный мост. Вся логика по управлению ВЧ-генераторами (по определению адресов регистров и их значений) реализуется программой на компьютере.

Выходные интерфейсы МК следующие:

Преобразование интерфейсов может осуществляться в двух режимах. В первом режиме МК, получив команду управления интерфейсами от компьютера, немедленно её выполняет и затем посылает подтверждение в комп. Этот режим используется программой на компе для инициализации генераторов ВЧ и интерактивного (по командам пользователя) управления ими.

Второй режим предусматривается управление интерфейсами с генерированием заданных задержек на стороне МК. Дело в том, что компьютер не позволяет с высокой точностью формировать даже миллисекундные задержки. Поэтому для быстрых измерений компьютер сперва выдаёт в МК команду на «наполнение» специального буфера командными байтами. Потом по другой команде начинается исполнение команд управления интерфейсами из ранее заполненного буфера. При этом предусмотрено выдерживание заданных задержек, что для МК не представляет проблемы.

Микроконтроллер получает команды по интерфейсу com c уровнями TTL (3.3в – логическая 1, стоп-бит; 0в – логический ноль, старт-бит). Скорость обмена 115200 бод, 1 стоп-бит, без контроля четности.

Все команды начинаются с байта 0xcd. Список поддерживаемых команд от com-порта представлен в таблице

Команда Описание
0xcd, 10 и 0xcd, 0xcd Переход в режим обновления прошивки, осуществляется сброс микроконтроллера для запуска кода обновления прошивки (если он есть).
0xcd, 40, FMDiv, ShimValue Настройка генерации отрицательного напряжения. МК должен выдавать на выход RC2 заданную частота 10 МГц / FMDiv, а ShimValue – скважность импульсов (0 – выключены). В ответ МК посылает байт 0xd1 в комп для подтверждения выполнения команды.
0xcd, 41 Запрос параметров таймера МК, который используется для выдерживания измерительных интервалов. В ответ МК посылает в комп младшими байтам вперед:
А) 32-битной слово частоты (например, 10000000);
Б) 32-битной слово, описывающее коэффициент деления этой частоты в предделителе таймера (например, 64).
В) повтор А);
Г) повтор Б);
0xcd, 50, MaskOr, MaskAndOld Выдачи сигнала на параллельные линии. MaskAndOld – маска «И», которая сперва применяется к предыдущим значениям. MaskOr – маска «ИЛИ», которая применяется к выходным значениям. Биты 0-5 в данных масках управляют соответственно линиями RC0, RС1, RB2, RB3, RB4, RB5. Линии RC0, RC1, RB2 предназначены для выбора кристаллов для SPI - абонентов. Линии RB4, RB3 управляют коммутатором антенного моста (определяют, к какой точке моста подключен sdr-приёмник). Линия RB5 – вкл/выкл несущей для модулей Rfm22 / Rfm69. В ответ МК посылает байт 0x51 для подтверждения выполнения команды.
0xcd, 60, SpiMode Настройка режима работы SPI-интерфейса, SpiMode =0..3. Ответ: 0xa9, 0xe2, SpiMode
0xcd, 61, DataSpi Выдачи / приём одного байта данных по интерфейсу SPI. В дуплексном режиме по интерфейсу SPI посылается один байт DataSpi. В качестве ответа МК посылает в комп принятый по SPI байт данных.
0xcd, 71, Flags Посыл управляющих данных по интерфейсу I2C. Если бит Flags.D0 = 1, то на I2C посылается сигнал «Start». Если бит Flags.D1 = 1, то на I2C посылается сигнал «Stop». Если бит Flags.D2 = 1, то на I2C посылается сигнал «повторный Start». Если бит Flags.D3 = 1, то на I2C посылается бит «Ask». Если бит Flags.D4 = 1, то на I2C посылается бит «NoAsk». Подтверждение выполнения команды в комп не посылается.
0xcd, 72, DataI2C Посыл байта данных DataI2C по шине I2C. В ответ МК посылает в комп флаги выявленных на шине I2C ошибок (0 – отсутствие ошибок). Примечание: комп сам отвечает за посыл требуемого адреса I2C абонента перед данными, а также команд «Start» и «Stop».
0xcd, 73 Приём байта данных по шине I2C. Инициируется приём 8 бит данных и в качестве ответа МК посылает в комп принятый байт данных. 9-й бит данных (Ask/NoAsk) на шину I2C не посылается (для его посыла предназначена команда 0xcd, 71).
0xcd, 80 Определение максимального размера Size буфера в памяти МК, который можно заполнить командой 90. В комп посылаются байты SizeLo, SizeHi, ~SizeLo, ~SizeHi. Чем больше буфер – тем лучше.
0xcd, 81, CS_UnSelect, CS_Selector, I2C_Adr Настройка абонентов шин SPI и I2C для последующей работы команды 0xcd, 91. CS_UnSelect используется для дезактивации всех абонентов SPI (аналог маски MaskOr в команде 0xcd, 50). CS_Selector для выбора абонента SPI (аналог маски MaskAndOld в команде 0xcd, 50). I2C_Adr – адрес абонента для шины I2C. В качестве ответа в компьютер посылается код 0x9a.
0xcd, 90, LenLo, LenHi, <байты данных>, TestCrc8 Приёма Len байт данных в спец. буфер. Буфер заполняется переданными байтами для последующего исполнения командой 0xcd, 91. При успешном приёме в комп отправляется байт подтверждения 0x9c. Алгоритм расчета Crc8 следующий:
а) Инициализация: Сrc8= LenLo
б) Обновление Crc8 при получении каждого последующего байта Data:
void Crc8_ClassicPic(BYTE &Crc8, BYTE Data)
{
  Crc8 ^= Data;
  BYTE NewCrc = 0;
  if (Crc8 & 1) NewCrc ^= 0xD5;
  if (Crc8 & 2) NewCrc ^= 0x7F;
  if (Crc8 & 4) NewCrc ^= 0xFE;
  if (Crc8 & 8) NewCrc ^= 0x29;
  if (Crc8 & 16) NewCrc ^= 0x52;
  if (Crc8 & 32) NewCrc ^= 0xA4;
  if (Crc8 & 64) NewCrc ^= 0x9D;
  if (Crc8 & 128) NewCrc ^= 0xEF;
  Crc8 = NewCrc;
};
в) Перед сравнением c TestCrc8 байт Crc8 инвертируется.
0xcd, 91 Команда на исполнения последовательности байт из заполненного ранее буфера (см. подробное описание ниже). В качестве ответа в комп возвращается число исполненных байт и признаки ошибок на шине I2C.
0xcd, 92, LenLo, LenHi, <байты данных>, TestCrc8 Команда заполнения буфера с немедленным исполнением, аналогична командам 90 и 91, выполненным последовательно.

Команда 0xcd, 91 – команда на исполнения последовательности байт из заполненного ранее буфера. Байты из заполненного ранее буфера интерпретируются один за другим следующим образом:

Байты Интерпретация
Коды 0 - 0x7f выполнить задержку, которая закодирована 16-битным значением, старший байт задержки соответствует текущему байту, а младший – следующему. Интерпретация задержки определяется выполненной ранее командой 0xcd, 41.
При генерации задержек не должно учитываться время, требуемое на фактическое исполнение команд. На практике перед началом исполнения потока байт из буфера запускается автономный таймер, на который надо ориентироваться для получения задержек в дальнейшем.
0x80 - 0x83 Команды управления ВЧ-коммутатором измерительного моста. Младшие 2 бита кода команды транслируются в линии управления коммутатором моста RB3 и RB4 соответтвенно.
0x84 и 0x85 Команда выключения и включения несущей Rfm22 / Rfm69, на линию RB5 выдаётся ноль или логическая 1.
0x86, AntOpor, DelayLo, DelayHi, Count Команда многократного переключения коммутатора моста (линий RB3, RB4). Сперва подключается к антенне, выдерживается заданная задержка, затем подключается к опоре и выдерживается заданная задержка. И так повторяется заданное количество раз. Биты 0-1 в AntOpor задают значения RB3 и RB4 при подключении к антенне, а биты 4-5 – значения RB3 и RB4 при подключение к опорной точке моста. Delay – время удержания подключения в терминах запущенного таймера, Count – количество переключений.
0x87 Команда начать отсчет времени от текущего момента. Сбрасывает таймер и главное, его предделитель.
0x9N, <байты> Команда поcыла N байт по интерфейсу SPI. Число байт задают младшие 4 бита кода команды. Перед посылом данных выбирается абонент, заданный ранее командой 0x81, после посыла всех байт сигналы выбора кристалла снимаются.
0xAN, <байты> Команда поcыла N байт по интерфейсу I2C. Число байт задают младшие 4 бита команды. Перед посылом данных выдаётся сигнал «Start» и адрес абонента, заданный ранее командой 0x81. После посыла данных выдаётся сигнал «Stop».
0xfe Команда выдержать задержку в ~153 мкс, применяется при работе с тормознутой si4463.
0xff Конец, выполнение команд из буфера прекращается, в комп шлётся двухбайтовое количество использованных в буфере байт, а также байт флагов ошибок, обнаруженных на шине I2C (этот байт флагов ошибок сбрасывается в начале исполнения команды 0xcd, 91).

Егошкин Н.А., Рязань, © 2020-2023