Из-за того, что каждый из программируемых XO/VCXO генераторов Si570, Si571, Si598, Si599 имеет свою уникальную частоту кварца, необходимо выполнить вычисления по преобразованию частоты для каждой желаемой новой выводимой синтезированной частоты, и делать это нужно индивидуально для каждого экземпляра программируемого генератора. Чтобы упростить создание процедур вычислений и поиска коэффициентов, компания Silicon Laboratories предоставила следующий эталонный дизайн (пример программирования), написанный на языке ANSI C. Эти вычисления можно производить на разном оборудовании и программном обеспечении, потому что используется ANSI C, который легко портируется с одной платформы на другую. ANSI C поддерживается на большом количестве процессоров и микроконтроллеров, поэтому приведенный здесь код можно адаптировать практически для любой платформы.
Вычисления, необходимые для изменения выходной синтезируемой частоты, используют умножение и деление, требующие достаточной точности, чтобы гарантировать точное значение выходной частоты. В этом коде показаны 2 способа решения проблемы точности. Один из них использует арифметику плавающей запятой двойной точности (double floating point precision), что дает точность установки частоты лучше 5 ppm. Альтернативный способ вычислений использует арифметику плавающей запятой одинарной точности (single floating point precision), что дает точность установки частоты лучше 100 ppb. Последний метод можно использовать для процессоров, которые не поддерживают вычисления точности double floating point.
Каждый пользователь должен решить для себя (в зависимости от имеющегося техзадания), как он будет управлять синтезатором - нужно ли ему вычислять данные для передачи в синтезатор на лету, во время работы кода в рабочей системе, либо использовать уже готовые синтезированные данные, сохраненные в EEPROM, памяти программ или любом другом хранилище данных.
Если независимый процессор недоступен в конкретной разработке, то все вычисления реального времени для программирования синтезатора может сделать дополнительный MCU, такой как например C8051F301 от компании Silicon Labs. C8051F301 имеет размер корпуса 3x3 мм, и содержит достаточно памяти Flash (память программ) для этой реализации. Вход стробирования (куда подключена кнопка) C8051F301 используется для перехода по списку сохраненных частот, см. рис. 1, где показан общий алгоритм функционирования примера кода. Оба примера кода из Приложения A и из Приложения B позволяют обработать этот список частот, однако отличие в том, что код Приложения B сохраняет последнюю выводимую частоту в энергонезависимой памяти Flash, чтобы эта частота автоматически устанавливалась, когда происходит новое включение питания (или сброс). Весь эталонный дизайн был реализован на оценочной плате с установленным процессором C8051F301.
Примечание: код Приложения A и Приложения B с русскими комментариями можно скачать по ссылке [4].
Микросхема Si570 [2] это программируемый через I2C синтезатор XO, который совместим по внешним выводам и внутренним регистрам с синтезатором Si598. Микросхема Si571 это синтезатор VCXO, который совместим по внешним выводам и внутренним регистрам с синтезатором Si599. Код, приведенный в этом апноуте, позволяет использовать любой из этих синтезаторов, в зависимости от требований техзадания. Более точные параметры по диапазону частот, стабильности и джиттеру см. в даташите на каждый используемый синтезатор.
Компилятор. Этот эталонный дизайн требует использования вычислений с плавающей запятой одинарной точности (single-precision floating point). Чтобы снизить цену конечной системы, которая может возрасти из-за требований к точности вычислений, применен бесплатный компилятор SDCC [3]. Готовый двоичный код для прошивки в память программ C8051F301 (Flash), а также исходный код можно загрузить с сайта Silicon Labs (также см. ссылку [4]). Апноут "AN198: Integrating SDCC 8051 Tools into the Silicon Labs IDE" описывает процедуру привязки компилятора SDCC к среде разработки. Этот код также был успешно протестирован с полной версией компилятора Keil. Апноут "AN104: Integrating Keil 8051 Tools into the Silicon Labs IDE" описывает процедуру встраивания компилятора Keil в среду разработки.
Особенности C8051F301. Поскольку требуется обмен данными с синтезатором по шине I2C, код использует аппаратуру I2C, имеющуюся в MCU. Когда код портируется на другие процессоры, необходимо определить, как обеспечить коммуникации I2C на этом другом оборудовании. Прерывания I2C и функции в этом коде скорее всего не будут обрабатываться на других процессорах, и их потребуется переписать. Обычно соответствующий код для поддержки I2C предоставляется производителем процессора. Код I2C, используемый в этом эталонном дизайне, был скопирован из апноута "AN141: SMBus Communication for Small Form Factor Device Families" (см. пример общения с EEPROM).
Реализация. В эталонном дизайне реализованы необходимые операции чтения/записи из/в синтезаторы Si57x/598/599 и поиск коэффициентов выходного делителя (HS_DIV и N1), а также вычисления коэффициентов для настройки нового коэффициента умножения опорной частоты (reference frequency multiplier, RFREQ). Приведено 2 примера кода: один (Приложение A) всегда запускается (после сброса или включения питания) с жестко запрограммированной в коде частоты по умолчанию, а другой пример (Приложение B) будет запускаться с последней выведенной частоты. После включения питания или сброса MCU читает начальную конфигурацию из Si57x/598/599, и затем ждет подачи сигнала строба (нажатия кнопки). Изначально синтезатор Si57x/598/599 выводит свою частоту запуска, как это было определено в заказе на этот синтезатор (если используется программа из Приложения A), или последняя выводимая частота перед сбросом или выключением и включением питания (если используется программа из Приложения B). После получения сигнала строба MCU вычисляет новую конфигурацию для новой частоты и загружает соответствующие ей значения регистров в Si57x/598/599 через интерфейс I2C. Оба примера кода просто циклически с каждым стробом проходят по всему массиву частот, находящемуся в коде программы (см. таблицу 1). Если нужны другие частоты, просто отредактируйте код, чтобы поменять значения частот в этом массиве.
Таблица 1. Жестко закодированные в программе частоты (МГц).
27.000000 61.440000 74.175824 74.250000 100.000000 106.250000 125.000000 133.333300 155.520000 156.250000 161.132813 164.355469 167.331646 167.410714 172.642300 173.370747 176.095145 176.838163 200.000000 212.500000 368.640000 491.520000 622.080000 625.000000 644.531250 657.421875 666.514286 669.326580 672.162712 690.569196 693.482991 704.380580 707.352650 800.000000 933.120000 1000.000000 1400.000000
Примечание: микросхемы Si598/599 ограничены максимальной частотой 525 МГц.
Из-за того, что C8051F301 поддерживает арифметику плавающей запятой только одинарной точности, в этом эталонном дизайне была изменена рекомендуемая в даташите на синтезатор Si570 процедура вычислений [2], чтобы ограничить потерю точности (используется тип данных unsigned long). Изначально были взяты стандартные формулы:
fXTAL · RFRWQ fOUT = -------------- HSDIV · N1
и
fDCO RFREQNEW = ------ fXTAL
затем во вторую формулу была подставлена частота кварца fXTAL, и получилось следующее:
fOUT1 N11 HSDIV1 RFREQNEW = (-----) · (----) · (-------) · RFREQOLD fOUT0 N10 HSDIV0
Изначальные вычисления сохранены максимально близко к оригинально рекомендуемым, в результате получилась очень малая потеря точности. В зависимости от того, значительно или мало частота запуска (startup output frequency, fOUT0) отличается от новой выходной частоты, могут понадобиться вычисления множителей.
Рис. 1. Модель использования демонстрационного примера.
Аппаратура. Для демонстрации работы кода использовалась печатная плата, схема которой показана на рис. 2. Переход MCU к новой частоте из списка происходит по сигналу от нажатия кнопки (SW1). Светодиоды состояния (status LEDs) последовательно зажигаются, чтобы показать индекс текущей выбранной частоты таблицы.
Рис. 2. Схема печатной платы.
Этот эталонный дизайн был протестирован на синтезаторе Si570. Код для поддержки Si598 может потребовать незначительных изменений, потому что значение RFREQ синтезатора Si598 имеет не нулевые биты выше 34-й цифры.
[Словарик]
MCU MicroController Unit, микроконтроллер.
ppb Parts Per Billion, т. е. количество единиц на миллиард таких единиц.
ppm Parts Per Million, т. е. количество единиц на миллион таких единиц.
XO/VCXO здесь XO означает кварцевый генератор, VCXO означает управляемый напряжением кварцевый генератор.
[Ссылки]
1. AN334 Si57X/598/599 ANSI C Reference Design with optional Non-Volatile Output Frequency site:silabs.com. 2. Si570, Si571: программируемый через I2C генератор XO/VCXO. 3. 170301stc15w404as-clock.zip - в этом архиве можно найти компилятор SDCC. 4. 180530Si570x-appnotes-datasheets.zip - апноуты, даташиты, исходный код примеров программирования синтезаторов Si57x. |