CAT-интерфейс (Computer Aided Transceiver) предназначен для управления частотой, видами модуляции и другими функциями радиостанции с помощью компьютера.
В сети есть множество описаний радиолюбительских синтезаторов на базе Si5351, но в массе своей CAT они не поддерживают. Данная публикация этот пробел должна восполнить.
Аппаратное решение
Аппаратное решение не несёт никакой новизны. Синтезатор создавался из того, что было под рукой: плата Black Pill c микроконтроллером STM32F411CEU6, дисплей SSD1306 и микросхема синтезатора частоты Si5351A-B-GT.
Схема подключения Si5351A-B-GT приведена ниже.
Подтягивающие резисторы R1, R2 устанавливаются на выводы дальнего от микроконтроллера устройства на шине I2C. Сигнал с выхода CLK0 подаётся на первый смеситель основной платы трансивера Радио-76. Сигнал с выхода CLK2 подаётся на второй смеситель трансивера. Делители напряжения на резисторах R3, R6 и R4, R5 препятствуют перегрузке смесителей.
Вся схема собрана на печатной плате переходника SSOP-DIP:
Из имеющихся у меня в наличии кварцевых резонаторов на частоту 25MHz и 27MHz ни один на этих частотах не запустился. Параллельно включенные резисторы и конденсаторы ситуацию не спасали. На фотографии кварц, который запустился на частоте 24MHz, когда параллельно ему был включен резистор номиналом 1МОм.
Конфигурация микроконтроллера
Проект создан на основе платы Black Pill c микроконтроллером STM32F411CEU6 в среде разработки STM32CubeIDE:
Шина I2C подключена к выводам PB9, PB10 микроконтроллера. К выводам PB0, PB1, PB2 подключены тангента (PTT, Push-To-Talk) и контакты телеграфного ключа (KEY_DIT, KEY_DAH). Вывод PC13 служит для аппаратного переключения режима приём/передача (RX/TX). Режиму TX соответствует сигнал низкого логического уровня, при этом светится индикатор на плате.
Виртуальный COM-порт создан на основе IP Commucation Device Class. Максимальное количество интерфейсов равно двум. Размер буферов задан равным 64 Bytes.
Программная реализация CAT
Ссылка на репозиторий: https://github.com/dmitrii-rudnev/radio-76-cat
За основу решения была принята система команд для управления популярным трансивером Yaesu FT-817. Описание работы CAT-интерфейса этой радиостанции занимает в руководстве пользователя всего четыре страницы.
Управляющие программы сторонних производителей обычно используют для связи с радиостанцией драйвер OmniRig, созданный канадским радиолюбителем Alex Shovkoplyas (VE3NEA). Описанная реализация CAT-интерфейса использует ограниченный набор команд Yaesu FT-817, поддерживаемый этим драйвером.
При настройке OmniRig для работы с публикуемым решением нужно выбрать в конфигураторе OmniRig тип трансивера FT-817, COM-порт, к которому подключен CAT, и установить скорость порта 9600 бит/с.
Для управления радиостанцией один раз в 200 мс через COM-порт посылается пять байт данных. Пятый байт содержит команду управления, первые четыре байта могут содержать данные или быть пустыми. Радиостанция распознает команду, выполняет её и посылает отклик.
Описанная реализация CAT-интерфейса поддерживает работу в составе радиостанции двух генераторов плавного диапазона VFO A и VFO B. Наличие двух VFO позволяет работать на разнесённых частотах (режим Split), когда приём осуществляется на частоте одного VFO, а передача на частоте другого.
Описанное решение позволяет осуществлять переключение между VFO, перестройку частоты активного VFO управляющей программой, а также производить переключение режимов приём/передача.
Помимо этого, хотя для Радио-76 это и не актуально, оставлена возможность переключения вида модуляции.
Собственно трансивер реализован переменной trx со структурой, приведённой ниже:
typedef enum{ MODE_LSB = 0x00, MODE_USB = 0x01, MODE_CW = 0x02, //CW-USB MODE_CWR = 0x03, //CW-LSB MODE_AM = 0x04, MODE_FM = 0x08, MODE_DIG = 0x0A, //DIG-U MODE_PKT = 0x0C //DIG-L} Mode;typedef struct{ Mode mode; //используемая модуляция из списка uint64_t vfoa; //частота VFO A в герцах uint64_t vfob; //частота VFO A в герцах uint8_t vfo; //активный VFO: 0, если активен VFO A; 1, если VFO B uint8_t split; //режим работы на разнесенных частотах: 1, если включен uint8_t is_tx; //режим передачи: 1, если включен uint32_t sysclock; //системное время uint8_t systicks; //счётчик прерываний SysTick до десяти} TRX_TypeDef;
Системное время используется для отслеживания тайм-аутов. Инкремент trx.sysclock происходит по каждому десятому прерыванию SysTick.
Переключение режима RX/TX осуществляет программный модуль ptt_if.c.
Переключение в режим передача (TX) и возврат в режим приём (RX) производится двумя разными способами:
1. По нажатию (TX) тангенты и её отпусканию (RX) (низкий/высокий уровень на входе PTT).
2. При получении по CAT команды FT817_PTT_ON (0x08) (TX) и получении по CAT команды FT817_PTT_OFF (0x88) (RX).
Следует учесть, что возврат в режим приём возможен только при условии отсутствия всех сигналов переключения в режим передачи.
Обработка состояния телеграфного ключа, а также линий RTS и DTR виртуального COM-порта в публикуемой реализации CAT-интерфейса не предусмотрена.
Связь с драйвером микросхемы синтезатора частоты осуществляет программный модуль vfo_if.c. Модуль меняет настройки синтезатора в зависимости от полученной по CAT частоты, а также режима работы радиостанции.
Модуль cat_if.c содержит драйвер CAT-интерфейса.
Обработчик состояния CAT-интерфейса запускается в бесконечном цикле main.c. Обработчик проверяет наличие подключения по виртуальному COM-порту, и если оно есть, то проверяется наличие данных в буфере CAT-интерфейса.
Если данные в буфере есть, обработчик извлекает из буфера пять байт данных и распознаёт команду по списку поддерживаемых. Если команда распознана, запускается обработчик команды, который обращается или к ptt_if.c, или к vfo_if.c. По результатам обработки формируется отклик, который передаётся в компьютер через виртуальный COM-порт.
Наиболее часто трансивер получает две команды: FT817_GET_FREQ (код команды 0x03) и FT817_READ_TX_STATE (0xF7). По ним он возвращает частоту настройки, вид модуляции, текущий режим приём/передача и режим работы на разнесённых частотах.
Виртуальный COM-порт
Виртуальный COM-порт создан на основе IP Commucation Device Class.
Команды CAT передаются из приёмного буфера CDC в приёмный буфер CAT функцией CDC_Receive_FS из состава файла usbd_cdc_if.c, расположенного в папке USB_DEVICE\App.
Отклик на команды передаётся из обработчика команд CAT-интерфейса запуском функции CDC_Transmit_FS.
Для корректной работы COM-порта в его буфер необходимо прописать параметры подключения:
static int8_t CDC_Init_FS(void){ /* USER CODE BEGIN 3 */ USBD_CDC_HandleTypeDef *hcdc; USBD_CDC_LineCodingTypeDef line_coding = { /* 9600 8n1 */ .bitrate = 9600U, /* Data terminal rate, in bits per second */ .format = 0U, /* Stop bits: 0 - 1 Stop bit */ .paritytype = 0U, /* Parity: 0 - None */ .datatype = 8U, /* Data bits */ }; hcdc = (USBD_CDC_HandleTypeDef*) hUsbDeviceFS.pClassData; memcpy ((uint8_t*) hcdc, &line_coding, 7U); /* Set Application Buffers */ USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); return (USBD_OK); /* USER CODE END 3 */}
Без этой записи в буфере OmniRig к COM-порту может и не подключиться.
От автора
Данное решение CAT-интерфейса может работать с любыми доступными радиолюбителям синтезаторами частоты и контроллерами дисплеев с минимальными переделками main.c и vfo_if.c.
Мне будет очень приятно, если эта публикация поможет кому-нибудь реализовать управление по CAT своим радиоприёмником или радиостанцией.