Тут описан протокол работы прошивки микроконтроллера самодельного векторного анализатора цепей на базе компьютерного 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; }; |
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). |