В предыдущей публикации о трансивере «Радио-76» упоминалось о синтезаторе частоты с CAT-интерфейсом. В этой статье тема CAT-интерфейса будет раскрыта подробней.
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) производится двумя разными способами:
- По нажатию (TX) тангенты и её отпусканию (RX) (низкий/высокий уровень на входе PTT).
- При получении по 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 своим радиоприёмником или радиостанцией.