Рекомендую: ПЕЛАГЕЯ!

pelagea.jpg

      Концерт на площади Минина в Нижнем Новгороде 9 Мая 2013

      Мини-концерт в Магасе (Ингушетия) 4 Июня 2014

Протокол обмена SDR-1000

 

Разъём управления режимами SDR-1000 и считывания состояния SDR-1000

protocol_1.gif

 

Ноги растут из LPT

Надо сказать, что исторически управление трансивером SDR-1000 первоначально было завязано на разъём LPT компьютера, а точнее на адаптер LPT, расположенный в компьютере. Впоследствии с появлением различных способов управления SDR-1000 через USB стало не всегда обязательным вникать в структуру данных LPT, т.к. важнее понимать сам принцип управления SDR-1000. Тем не менее некоторая краткая информация о LPT, адаптированная для нашего случая, будет полезной.

Собственно название сигналов на разъёме SDR-1000 перекликается с названиями битов в регистрах адаптера LPT (даже нумерация битов совпадает). Ещё раз говорю (уточняю), что адаптер LPT это такая микросхема в компе, которая отвечает за работу LPT на физическом уровне. D0...D7 - биты 8-разрядного регистра данных адаптера LPT. C0...C3 - биты 8-разрядного регистра управления адаптера LPT. S3...S7 - биты 8-разрядного регистра состояния адаптера LPT. Названия регистров LPT говорят сами за себя. Регистр данных это регистр, который выдаёт байты полезной информации во внешнее устройство (в нашем случае в SDR-1000). Регистр управления это регистр, который выдаёт сигналы во внешнее устройство (опять же в SDR-1000), которые указывают на род данных, находящихся в регистре данных. Регистр состояния считывает состояние внешнего устройства, т.е. нашего SDR-1000.

Все три регистра адаптера LPT имеют свои три внутренних адреса в компьютере. К примеру, если в PowerSDR указан порт LPT1 с базовым адресом 378h, то регистр данных адаптера LPT будет иметь этот указанный адрес 378h. Регистр состояния имеет адрес на единицу больше, т.е. 379h. Регистр управления ещё на единицу больше, т.е. 37Ah. На этом краткий экскурс в LPT можно завершить.

 

Общая информация о сигналах (стробах) C0...C3

Сигналы C0...C3 применительно к SDR-1000 принято называть стробами из-за их короткой длительности. Передний и задний фронты стробов отстоят друг от друга на очень малое время. По этой причине можно для управления трансивером формировать стробы как положительной, так и отрицательной полярности. В частности в SDR-1000UA стробы инвертированы инверторами 74HC14 в отличие от оригинального SDR-1000 от Флексов. В связи с этим регистры-защёлки в SDR-1000UA защёлкиваются по отрицательному фронту стробов. 

Стробы напрямую завязаны на регистры-защёлки (это две микросхемы 74AC574 для стробов C0, С1 и две микросхемы 74LCX574 для стробов C2, C3). Количество регистров-защёлок равно количеству линий C0...С3, т.е. четыре штуки. Вообще, регистры-защёлки это своего рода ворота для управляющих байтов, поступающих в трансивер. Образно говоря, имеются четверо ворот. Каждая микросхема регистра-защёлки всегда готова отреагировать на появление положительного фронта соответствующего строба. При этом регистр-защёлка запоминает байт, выставленный на линиях D0...D7 разъёма, и выдаёт его на свои выходы. Байт хранится на выходах регистра-защёлки до тех пор, пока не придёт другой строб.

Каждый строб (C0, C1, C2, C3) отвечает за свою группу данных на шине D0...D7. Например, если на шину D0...D7 выставлен один из байтов частоты DDS, то затем следует возникновение строба C2.

Далее будут рассмотрены группы данных на шине D0...D7, за которые отвечают стробы. Самая навороченная группа соответствует стробу C1 и поэтому будет рассмотрена в последнюю очередь. Все фрагменты схем взяты из SDR-1000UA.

 

Группа данных на шине D0...D7 для строба C0

protocol_c0.gif

Ну тут как бы всё просто. При включении строба C0 получаем на выходе байт для управления внешними устройствами через разъём X2. Это внешний усилитель мощности (пин X2_7) и антенный коммутатор (пины X2_1...X2_6). Для справки, пины антенного коммутатора программируются в меню Setup>Ext.Ctrl программы PowerSDR. Кстати, на выходе регистра-защёлки есть ещё сигнал GAIN для переключения усиления в тракте ПЧ на величину 20дб. С точки зрения протокола обмена SDR-1000 совершенно нет необходимости вникать как это всё работает. Просто PowerSDR выставит нужный байт на шину D0...D7 и защёлкнет его в регистре при помощи строба C0.

 

Группа данных на шине D0...D7 для стробов C2 и C3

protocol_c2_c3.gif

Здесь посложнее будет. Два регистра-защёлки призваны обслуживать DDS AD9854. DDS имеет внутри себя регистры для хранения байтов частоты, их там 6 штук. Сами регистры имеют уникальные адресы. Сигналы A0...A5 это и есть двоичный адрес регистров DDS, отвечающих за хранение байтов частоты внутри DDS. Сигналы D0...D7 (не путать с шиной данных SDR-1000) это собственно сами байты частоты, загружаемые в DDS по указанным адресам регистров DDS. Сигнал WR это отрицательный строб, производящий запись байта частоты в DDS по указанному адресу регистра DDS. Сигнал RST положительной полярности просто сбрасывает DDS в исходное состояние при включении оборудования.

Для справки (с точки зрения протокола обмена SDR-1000 в это сильно вникать не надо), каждая записываемая в DDS частота преобразуется программой PowerSDR по формуле в нужный код и разбивается на шесть байтов. Для примера возьмём частоту 3495275 Гц (3,495275 МГц):

(3495275 x 281474976710656) / 200000000 = 4919162246111(округлено до целого) и преобразуем в шестнадцатиричное 047954EB13DFh.

В формуле число 281474976710656 это 2^48 (разрядность аккумулятора фазы DDS AD9854), а число 200000000 это внутренняя частота DDS (200 МГц).

Итак, мы получили шестнадцатиричное число 047954EB13DFh. Вот его-то и посылает PowerSDR в DDS побайтно начиная с старшего байта - сначала 04h, далее 79h, 54h, EBh, 13h, DFh. Всего шесть байтов частоты по количеству регистров частоты. Адресы регистров частоты в DDS соответственно 04h, 05h, 06h, 07h, 08h, 09h.

Рассмотрим поведение PowerSDR при загрузке в один из регистров частоты DDS одного байта частоты. Надо сразу сказать, что сигнал записи WR является битом в байте адреса регистра частоты (особенность схемы SDR-1000), что вынуждает три раза устанавливать адрес регистра на шину данных SDR-1000 при манипуляциях с битом WR (не удобно, но ничего не поделаешь):

1.   Установка байта частоты на шину данных SDR-1000.
2.   Включение и выключение строба C2 для защёлкивания байта частоты в соответствующем регистре-защёлке.
3.   Установка на шину данных SDR-1000 адреса соответствующего регистра частоты DDS.
4.   Включение и выключение строба C3 для защёлкивания адреса в соответствующем регистре-защёлке.
5.   Снова установка на шину данных SDR-1000 адреса регистра DDS, но бит WR переведён в активное состояние.
6.   Включение и выключение строба C3 для защёлкивания (ещё раз!) адреса в регистре-защёлке. Так как бит WR в активном состоянии, то произошла запись байта частоты в регистр DDS. Результат достигнут!
7.   Снова установка на шину данных SDR-1000 адреса регистра DDS, но бит WR возвращён в неактивное состояние.
8.   Включение и выключение строба C3 для защёлкивания (ещё раз!) адреса в регистре-защёлке.

Для справки. Вообще-то описанный выше порядок действий несколько стилизованный. Анализ сигналов показывает, что PowerSDR просто обожает оставлять строб C3 в единичном активном уровне после защёлкивания байта в регистр-защёлку. И только когда требуется ещё что-нибудь защёлкнуть, то строб переводится в нулевое неактивное состояние, а затем сразу в единичное. Выше я уже говорил, что полярность стробов в принципе не имеет значения, поэтому описанное в этом абзаце просто примите к сведению.

 

Группа данных на шине D0...D7 для строба C1

Это cамая навороченная группа данных на шине D0...D7. Для начала посмотрим на регистр-защёлку, которая защёлкивает необходимые байты при поступлении рабочего фронта строба C1. Бит "приём-передача" (RX=0, TX=1) и бит MUTE (запрещает звук от приёмника) являются простыми сигналами. Остальные биты (SER, SCK, SCLR, A0, A1, DCDR) управляют сдвиговыми регистрами, о которых будет речь далее. Схема №1:

protocol_c1.gif

А вот и схема №2 монстра со сдвиговыми регистрами. Чтобы понять как это работает, надо приложить некоторые умственные усилия:

protocol_sdvig_register.gif

Для начала разберёмся как работает отдельно взятый сдвиговый регистр 74HC595. Задвигаемый в регистр байт подаётся побитно на вход SER. Каждый бит записывается в регистр при подаче положительного фронта на вход SCLK. Всего требуется восемь положительных фронтов для того, чтобы задвинуть байт. Задвинутый байт не появится на выходах регистра, пока не появится положительный фронт на входе RCLK, иначе говоря этот вход разрешает обновление состояния выходов. Вот так обобщённо работает сдвиговый регистр. Вход сброса SCLR рассматривать нет смысла, т.к. он не участвует в логических действиях и служит только для первичного сброса регистров при запуске PowerSDR.

Теперь перейдём к общим рассуждениям о работе схемы сдвиговых регистров. Задвигаемый байт побитно записывается сразу во все сдвиговые регистры. Но только одному регистру будет разрешено выдать задвинутый байт на свои выходы. Иначе говоря, всякий задвигаемый байт соответствует только своему регистру. Выбор регистра производится дешифратором 74HC139.

Дешифратор 74HC139 управляется двоичным двухразрядным кодом и имеет инверсные выходы. Сигнал DCDR разрешает дешифратору выдать нулевой уровень на один из выходов. Значение двоичного кода на входах A0 и A1 определяет на каком из выходов появится нулевой уровень. Если сигнал DCDR находится в единичном уровне, то дешифратор не работает и на всех его выходах присутствует единичный уровень.

Чтобы дешифратор 74HC139 выбрал требуемый сдвиговый регистр, необходимо сначала установить код A0 и A1 на входах дешифратора, затем переключить DCDR в нулевой уровень, и наконец вернуть DCDR в единичный уровень.

Надеюсь, теперь понятно что, чтобы изменить всего лишь один бит на выходе одного из сдвиговых регистров (например включить аттенюатор) следует произвести кучу действий с кучей байтов. При этом изменение всего лишь одного бита потребует прописывания заново всех остальных битов на выходах этого сдвигового регистра.

Примерный порядок действий следующий:
1. Выставить байт XX10000X на шину данных D0...D7 (схема №1). Два старших бита не надо трогать, их значение нужно взять из предыдущей операции. Младший бит это информационный бит SER, который надо задвинуть в сдвиговые регистры в схеме №2. По стробу C1 байт защёлкнется в регистр-защёлку.
2. Выставить тот же байт на шину данных D0...D7, но бит SCK должен быть переведён в единичное состояние. По стробу C1 байт защёлкнется в регистр-защёлку. В результате информационный бит SER будет записан в сдвиговые регистры (схема №2).
3. Выставить тот же байт на шину данных D0...D7, но бит SCK должен быть переведён в исходное нулевое состояние. По стробу C1 байт защёлкнется в регистр-защёлку.
4. Повторить пункты 1,2,3 семь раз для каждого нового информационного бита SER. Итого будет восемь битов SER.
5. Выставить байт XX100000 на шину данных D0...D7, в котором установить нужные значения битов A0 и A1 для выбора нужного сдвигового регистра в схема №2. По стробу C1 байт защёлкнется в регистр-защёлку.
6. Выставить тот же байт на шину данных D0...D7, но бит DCDR должен быть переведён в нулевое состояние. По стробу C1 байт защёлкнется в регистр-защёлку.
7. Выставить тот же байт на шину данных D0...D7, но бит DCDR должен быть переведён в исходное единичное состояние. По стробу C1 байт защёлкнется в регистр-защёлку. В результате задвинутый во все регистры байт появится на выходах только одного нужного сдвигового регистра.

 

Получение байта состояния трансивера

Программа PowerSDR постоянно отслеживает состояние SDR-1000, получая сигналы S3...S7 в виде байта (младшие биты 0...2 игнорируются) с периодичностью около 4 мс (время определено опытным путём и не является абсолютно достоверной информацией). Смотрим схему ниже.
Сигнал S3 - блокировка приёма при помощи внешнего сигнала на разъёме X2 "Ext Control". Крайне скудная информация об этом сигнале в связи с его практической невостребованностью.
Сигналы S4,S5 - обслуживание телеграфного ключа (простого и автоматического). В современных версиях PowerSDR эти сигналы не обрабатываются (исключены) в связи с большими временными задержками при обслуживании ключа. Ключ следует подключать на COM-порт компьютера (смотреть документацию на SDR-1000).
Сигнал S6 - в режиме передачи обслуживание АЦП измерителя мощности и КСВ. АЦП присутствует в оригинальном SDR-1000, но отсутствует в SDR-1000UA, где установлен только разъём для стыковки с АЦП. Ничего не мешает изготовить дополнительный модуль АЦП и встроить его в SDR-1000UA.
Сигнал S7 - педаль включения передачи.

protocol_s3_s7.gif

 

Обслуживание АЦП (измеритель КСВ и мощности)

Показанная ниже схема является выжимкой из схемы оригинального SDR-1000 и схемы SDR-1000UA.
Программа PowerSDR обслуживает АЦП только в режиме передачи при помощи регистра DD19 в SDR-1000UA. Принцип управления регистрами описан выше, в параграфе "Группа данных на шине D0...D7 для строба C1".

Для управления АЦП используются следующие сигналы: ADC CLK для тактирования АЦП; ADC DI для выбора конфигурации АЦП и метода измерения (сказано громко, но на самом деле там всё просто); ADC CS для разрешения работы АЦП. Результат измерения (сигнал S6) выводится на разъём LPT в виде последовательного байта. При измерении КСВ обслуживание АЦП производится дважды, т.е. для падающей волны и для отражённой волны, а при измерении мощности только для падающей волны. Показанный на схеме дополнительный узел на транзисторе (в SDR-1000UA этот узел отсутствует) предназначен для сигнализации программе PowerSDR, что внешнее автоматическое согласующее устройство находится в режиме активной настройки.

adc.jpg

Ниже показана диаграмма сигналов АЦП, взятая из даташита.
- Процесс обслуживания АЦП начинается с установки нулевого уровня сигнала ADC CS, разрешающего работу АЦП. Далее на информационный вход ADC DI устанавливают единичный уровень и подают положительный фронт тактового сигнала ADC CLK. В результате АЦП, приняв этот START BIT, оживает и ждёт сигналы конфигурации.
- Затем на информационный вход ADC DI устанавливают снова единичный уровень и подают следующий положительный фронт тактового сигнала ADC CLK. В результате в АЦП устанавливается конфигурация - "два независимых аналоговых входа". Один вход для падающей волны, а другой для отражённой.
- Далее на информационный вход ADC DI устанавливают нулевой или единичный уровень в зависимости от того, на каком аналоговом входе необходимо произвести измерение - на входе падающей волны или на входе отражённой волны (или наоборот, точно не помню). При этом подают очередной положительный фронт тактового сигнала ADC CLK.
- Затем отрицательный фронт тактового сигнала ADC CLK переводит выход АЦП из третьего (высокоимпедансного) состояния в нулевое состояние, а последующие тактовые импульсы выводят последовательно биты байта измерения на выход АЦП. Заметьте, что сначала выводится байт с первым старшим битом, а затем байт дублируется, но уже с первым младшим битом. Я не знаю как в этом случае поступает PowerSDR - использует оба байта, или только один. Ведь по идее достаточно вывести только первый байт с первым старшим битом и завершить работу установкой ADC CS в единичное состояние.

adc_1.jpg