Продолжение. Начало в № 4'2006
Проектирование
на программируемых системах на кристалле PSoC Cypress.
Часть 4. Системные ресурсы PSoC
Дмитрий КИЛОЧЕК
Продолжая рассказ о программируемых системах на кристалле PSoC, рассмотрим имеющиеся в них выделенные системные ресурсы, которые могут использоваться как для обеспечения работы цифровой и аналоговой периферии, так и для расширения функциональности.
К системным ресурсам PSoC относятся следующие элементы:
• источники тактовых частот;
• блок (блоки) накапливающего умножителя;
• блок децимации;
• контроллер I2C;
• контроллер USB;
• схемы сброса;
• схемы контроля напряжения питания и импульсного повышающего регулятора напряжения (Switch Mode Pump);
• внутренний источник опорного напряжения и сенсор температуры;
• аналоговый мультиплексор.
В системные ресурсы можно включить также флэш-память, которая доступна для записи из программы пользователя.
Кратко источники тактовых частот упоминались в первой статье цикла, когда шла речь о настройке системных ресурсов в среде проектирования PSoC Designer. Сейчас мы рассмотрим структуру блока генераторов (рис. 1) более подробно.
Главный внутренний генератор (IMO) является базовым источником тактового сигнала почти для всех прочих источников в системе PSoC. Этот генератор создает опорную частоту 24 МГц, которая используется прочими схемами. В некоторых сериях PSoC имеется возможность выбора режима работы генератора на пониженной частоте — 6 МГц вместо 24 МГц. В версиях микросхем PSoC, предназначенных для работы в расширенном температурном диапазоне (для так называемого автомобильного применения), частота главного генератора составляет 12 МГц. Главный генератор является RC-генератором и его точность составляет ±2,5% без применения внешних компонентов. Это достигается загрузкой калибровочных значений в управляющий регистр IMO_TR из отдельной области ПЗУ (Supervisory ROM, SROM), которая программируется на заводе — изготовителе чипа.
Загрузка этих калибровочных значений выполняется кодом в файле boot.asm, который автоматически генерируется при создании проекта в PSoC Designer. Если требуется большая точность главного генератора, то в сис-
теме PSoC предусмотрена возможность синхронизации его с генератором, использующим внешний кварцевый резонатор 32 768 Гц ^ТО). Главный генератор через мультиплексор связывается с основной шиной тактовой
MULx_X МАСх X
£
ё
5
U
знак MSB
LSB
MULx DH
MULx DL
MULx Y X £ > ВЫХОД 16 бит 32-битный ■АССх _DR3 АССх _DR2 АССх _DR1 АССх
МАСх Y
аккумулятор
знак MSB
I I I
LSB
£
Ш
t
X
О
MAC» CL1
МАСх CL0
Системная шина
Рис. 2. Блок накапливающего умножителя
Данные
(выход!
дециматор тип 1
С
ACC REG 1 -ACC REGO-
ACC REG 0 -
ом паратора)
CLK
16
Ч—
SEL
16-Bit Full L \ADDR
16
4—
16
-Í—
DE
MUX
ACC REG 0(16 bit)
16
4----------ACC REG 1 (16 bit)
16
-f---- OUTPUT REG 0 (16 bit) -f-
► DB[7:0]
Рис. 3. Блок децимации первого типа
частоты системы (линия SYSCLK). Благодаря указанному мультиплексору в качестве системной частоты может выступать сигнал EXTCLK, подаваемый с контакта микросхемы. Системная частота SYSCLK является опорной для частоты SYSCLKX2 (удвоенная системная), а также для делителей, формирующих частоты CPUCLK (тактовая частота процессорного ядра), VC1 и VC2 (тактовые частоты для цифровых и аналоговых блоков), VC3 (тактовая частота для цифровых блоков и один из источников прерывания). Кроме того, частота SYSCLK используется для привязки асинхронных сигналов, поступающих с портов ввода-вывода или возникающих в системе.
Внутренний низкоскоростной генератор (ILO) используется в качестве тактового сигнала для сторожевого таймера и таймера режима «сна» (частота SLEEP), а кроме того, может выступать и как источник частоты для цифровых блоков (CLK32K). Генератор ILO тоже является RC-генератором, создает частоту 32 кГц и также калибруется значениями из SROM, однако точность его ниже, чем у главного генератора. Если необходима большая точность для частоты CLK32K, то генератор ILO может быть отключен, а для создания CLK32K будет использоваться генератор ECO.
Блок накапливающего умножителя (рис. 2) является полностью аппаратным системным ресурсом, не требующим какого-либо конфигурирования. Наличие этого блока в составе системы зависит от серии PSoC; в некоторых сериях могут присутствовать два независимых умножителя. Доступ к умножителю осуществляется через регистры, отображенные на пространство регистров ввода-вывода процессорного ядра. Умножитель может работать в двух режимах — просто умножение и умножение с накоплением результата. В первом случае сразу после записи 8-разрядного значения в регистр MULx_X или MULx_Y результат будет находиться в регистрах MULx_DH и MULx_DL. Во втором случае функция умножения с накоплением будет выполнена при записи в регистр MACx_X
Рис. 4. Фильтр Sinc2
или МЛСх_У, а результат будет находиться в регистрах ЛССх_БК(3-0).
Накапливающие регистры могут быть сброшены записью в регистр МЛСх_СЬ0 или в регистр МЛСх_СЬ1.
Для выполнения умножения не требуется вводить ожидание со стороны процессора — результат готов сразу же после записи операнда в один из входных регистров умножителя и доступен для чтения следующей инструкции, выполняемой процессором.
Блок децимации предназначен для аппаратной поддержки функций цифровой обработки сигналов и используется в РвоС для реализации дельта-сигма и инкрементирующего АЦП. Наличие этого блока и его тип зависят от серии Р8оС. Существуют два возможных типа блока децимации. Блок первого типа (рис. 3) позволяет осуществить одиночное или двойное интегрирование входного дискретного 1-битного сигнала. Кодированному зна-
чению входного сигнала ставится в соответствие взвешенное значение — входной сигнал, равный единице, имеет вес «+1», а сигнал, равный нулю, — «-1». Таким образом, интегрирование сигнала представляет собой суммирование весов за определенный период времени. На каждом такте частоты работы блока интегральное значение увеличивается или уменьшается на единицу в зависимости от сигнала на входе.
Блок децимации первого типа реализует интегрирующую часть цифрового 8тс2-фильтра, являющегося частью дельта-сигма АЦП (рис. 4). Дифференцирующая часть в этом случае реализуется программно.
Блок децимации второго типа (рис. 5) представляет собой полноценный аппаратный 8тс2-фильтр.
Контроллер представляет собой преобразователь из параллельной шины в двухпроводную последовательную.
Для того чтобы уменьшить нагрузку на процессор, этот блок осуществляет необходимую базовую поддержку протокола 12С. Контроллер 12С может функционировать в режиме ведомого, ведущего и в режиме с несколькими ведущими на шине. В режиме ведущего контроллер поддерживает тактовые частоты 50, 100 и 400 кГц. Взаимодействие контроллера с процессором осуществляется через регистры ввода-вывода и прерывания. Поскольку контроллер реализует лишь базовую поддержку протокола, полная реализация функциональности осуществляется со стороны программного обеспечения.
В аппаратной реализации контроллера есть несколько ограничений:
• нет аппаратного сравнения адреса, поэтому в режиме ведомого каждый полученный байт адреса вызывает прерывание, а сравнение должно осуществляться программно;
• нет автоматического подтверждения приема, поскольку принимаемые и передаваемые данные не буферизуются.
Для интерфейса с контроллером используются четыре регистра. Регистр 12С_СРО предназначен для конфигурации контроллера — выбора режима работы, скорости и используемых прерываний. Регистр 12С_8СИ используется для управления передачей, а также для контроля состояния шины. Регистр 12С_БК используется для передаваемых и принимаемых данных. 12С_М8СИ является регистром управления и статуса при работе контроллера в режиме ведущего.
Благодаря тому, что в библиотеке пользовательских модулей присутствует несколько программно-аппаратных реализаций контроллера 12С, необходимость дополнительного программирования может возникнуть лишь в исключительных случаях.
Контроллер USB присутствует на данный момент лишь в одном семействе микросхем РвоС — СУ8С24х94, а также в чипах СУ7С64215. Он реализует спецификацию ШВ 2.0 для полноскоростных устройств (РиЦ-врее^ со скоростью передачи 12 Мбит/с.
В состав контроллера USB (рис. 6) входят следующие компоненты:
• полноскоростной приемопередатчик USB;
• автомат управления последовательным интерфейсом (Serial Interface Engine, SIE);
• 256 байт выделенного статического ОЗУ;
• арбитр памяти PSoC (PMA);
Системная шина
РМА SRAM
SIE
USBXCVR
і і D+ D
Рис. 6. Блок-схема контроллера USB
Приемопередатчик содержит встроенный регулятор напряжения для создания необходимых для шины уровней напряжения, а также встроенный подтягивающий резистор 1,5 кОм на линии D+.
Автомат SIE аппаратно осуществляет следующие действия:
• кодирование передаваемых и декодирование принимаемых данных;
• проверка адреса;
• генерация соответствующих квитирующих пакетов ACK/NAK/Stall;
• проверка безошибочности принимаемых пакетов;
• идентификация типа принимаемых пакетов (SETUP, IN, OUT);
• идентификация маркера начала фрейма SOF (Start-of-Frame) и подсчет их числа;
• запись или считывание данных в выделенной памяти USB в соответствии с установками арбитра памяти.
Кроме того, автомат SIE генерирует прерывания для обработки в программе следующих необходимых для реализации интерфейса USB событий:
• заполнение и считывание буферов данных в выделенной памяти USB;
• настройки каналов арбитра памяти;
• декодирование запросов USB;
• проверка и установка правильных маркеров DATA0, DATA1.
Автомат SIE поддерживает 5 конечных точек USB — конечную точку управления с адресом 0, поддерживающую запросы SETUP, IN и OUT, и четыре конечных точки с адресами 1-4, которые поддерживают запросы IN и OUT для транзакций передачи массивов данных (Bulk), прерываний (Interrupt) или изохронных данных (Isochronous).
Выделенная память USB представляет собой 256 байт статической памяти, однако она не доступна напрямую для процессорного ядра M8C. Получить доступ к ней можно только через регистры арбитра памяти PMA, который является интерфейсом к данной памяти для двух блоков — процессора M8C и автомата SIE. Блок PMA предоставляет восемь каналов для управления данными. Все эти каналы могут использоваться M8C, но со стороны SIE четыре конечных точки с адресами 1-4 жестко связаны с каналами 1-4 блока PMA. На программное обеспечение накладывается обязанность следить за тем, чтобы один и тот же канал не использовался одновременно и M8C, и SIE. Если процессору требуется получить доступ к той области памяти, которая в данный момент используется SIE, то должны использоваться два канала, настроенные на одинаковые диапазоны адресов.
Задача программирования интерфейса USB является достаточно нетривиальной и заслуживает отдельной статьи, поэтому лучше всего воспользоваться при разработке готовым и отлаженным модулем из библиотеки PSoC Designer.
Схемы сброса предназначены для инициализации конфигурационных регистров и про-
цессора в начальные состояния. Возможны четыре условия, приводящие к сбросу:
• начальный сброс при подаче напряжения питания (Power-on-Reset, POR) либо при его падении;
• сброс при подаче сигнала на контакт XRES;
• сброс от сторожевого таймера (WDR);
• внутренний сброс, возникающий при начальной загрузке, если обнаружена ошибка чтения флэш-памяти.
Сброс POR представляет собой две раздельные схемы — непрецизионного (Imprecise POR, IPOR) и прецизионного сброса (Precision POR, PPOR). Схема IPOR имеет невысокую точность, и ее порог срабатывания находится ниже более точного порога схемы PPOR, который калибруется при начальной загрузке. Это позволяет разделить причину возникновения сброса POR и, как следствие, получить более быстрый переход к рабочему режиму в случае кратковременного «просаживания» питающего напряжения.
Внешний сброс (External Reset) возникает при подаче сигнала высокого уровня на контакт XRES. Этот контакт имеет внутренний резистор, притягивающий его к земле, поэтому внешнего резистора не требуется.
Во время действия схем сброса POR или XRES главный внутренний генератор IMO выключается для сбережения энергии. Кроме того, работа этих схем сброса изменяет поведение контактов P1[0] и P1[1], предназначенных для «прошивки» микросхемы PSoC. После возникновения сброса POR и примерно на 8 мс после окончания его действия на контакт P1[0] выдается высокий уровень напряжения, а контакт P1[1] конфигурируется как контакт с резистивной подтяжкой к земле. Затем контакт P1[0] еще на 8 мс, также как и P1[1], конфигурируется как контакт с резистивной подтяжкой к земле. После этого эти контакты переводятся в высокоимпедансное состояние. При возникновении сброса XRES контакты P1[0] и P1[1] после окончания действия этого сигнала на 200 мкс конфигурируются как контакты с резистивной подтяжкой к земле. Эти последовательности необходимы для того, чтобы просигнализировать программатору PSoC, что он может перехватить управление и осуществить прошивку или чтение флэш-памяти.
Сброс от сторожевого таймера (WDR) возникает при его переполнении. Сторожевой таймер может быть запущен пользователем при сбросе бита PORS в управляющем регистре CPU_SCR0. Однако так как этот бит может быть установлен только при возникновении сброса POR или WRES, то возможности отключить сторожевой таймер после запуска не существует. Для того чтобы не происходило сброса WDR, необходимо регулярно, не реже одного раза за два периода частоты CLK32K, сбрасывать таймер при помощи записи любого значения в регистр RES_WDT. При возникновении сброса WDR оперативная память очищается, однако это
можно предотвратить, если установить бит IRAMDIS в регистре CPU_SCR1 — это приведет к тому, что первые 216 ячеек ОЗУ сохранят свои значения.
При любом из вариантов сброса процессор проходит через процедуру начальной инициализации, когда выполняется специальная функция SWBootReset, находящаяся в SROM. Эта функция проверяет контрольную сумму калибровочных значений, записанных в SROM и, в случае ее правильности, инициализирует регистры процессора и ОЗУ нулями (только первую страницу при многостраничной организации памяти) и переходит к исполнению кода пользователя, начиная с адреса 0000h во флэш-памяти. В случае неправильной контрольной суммы выполняется внутренний сброс и устанавливается бит IRESS в регистре CPU_SCR1, свидетельствующий, что процесс начальной инициализации выполнялся неоднократно. Функция SWBootReset может быть вызвана программно — для этого необходимо установить в нулевое значение регистр-аккумулятор процессора и выполнить инструкцию SSC.
Схема контроля напряжения питания (Low Voltage Detect, LVD) контролирует напряжение на контакте Vdd и вызывает прерывание при его падении ниже порога, выбираемого пользователем в регистре VLT_CR. Кроме того, эта же схема может вызывать понижение тактовой частоты процессора при падении напряжения, если установлен бит LVDTBEN.
Встроенный импульсный повышающий регулятор напряжения (Switch Mode Pump, SMP) предназначен для генерации питающего напряжения Vdd при использовании батарейного питания. При включении микросхемы PSoC и до тех пор, пока напряжение на контакте питания Vdd не достигнет порогового уровня схемы POR, все внутренние схемы PSoC удерживаются в выключенном состоянии. Исключением является схема SMP. Типичная схема повышающего регулятора представлена на рис. 7. Для его реализации
необходимы три внешних компонента — индуктивность, диод и конденсатор.
При замкнутом ключе SMP электрическая энергия накапливается в индуктивности, а при размыкании заряжает конденсатор. Ключ переключается с частотой 1,3 МГц (скважность 50%), благодаря чему напряжение на конденсаторе достигает необходимого уровня, заданного в регистре VLT_CR. Данная схема позволяет получить необходимое напряжение питания от одной батареи с напряжением не менее 1,1 В, однако нагрузочный ток невелик — от 10 мА при питании от 2 В до 80-100 мА при 4,5 В. Повысить продуктивность этого регулятора можно, немного усложнив схему [4].
Внутренний формирователь опорного напряжения Vbandgap (рис. 8) представляет собой схему, создающую опорное напряжение 1,3 В из напряжения запрещенной зоны полупроводника, равного 1,2 В.
Рис. 7. Повышающий импульсный регулятор напряжения
Кроме буфера, формирующего опорное напряжение, этот блок содержит и схему выборки-хранения, выполненную на КМОП-клю-че и конденсаторе, что позволяет использовать опорное напряжение при выключенном буфере. Помимо опорного напряжения этот блок формирует пропорциональное температуре напряжение, то есть является встроенным сенсором температуры. Это напряжение изменяется на 3 мВ при изменении температуры на 1 °С. Данный температурно-зависимый выход блока подсоединен к одному из входов аналогового блока ЛвС21, что позволяет в программе отслеживать изменения температуры кристалла. Однако так как это температурно-зависимое напряжение формируется относительно температуры абсолютного нуля (-273 °С), то присутствует достаточно большое смещение на выходе температурного сенсора, поскольку рабочая температура РвоС находится в пределах от -40 до +85 °С (+125 °С). Поэтому при использовании данного датчика требуется производить его калибровку.
Дополнительный аналоговый мультиплексор (рис. 9) присутствует только в микросхемах СУ8С24х94, СУ8С21х34, СУ7С64215, СУ7С603хх и CYWUSB6953. Этот системный ресурс позволяет подключать все (либо почти все) контакты ввода-вывода микросхемы РвоС к выделенной внутренней аналоговой шине, причем одновременно к ней может быть подсоединено любое число контактов.
Аналоговая шина может, в свою очередь, подсоединяться к инвертирующему или к не инвертирующему входу аналогового блока типа CT. Контакты ввода-вывода могут также соединяться с напряжением питания Vdd.
Благодаря тому, что ключи, соединяющие контакты с аналоговой шиной, являются двунаправленными, на базе блока аналогового мультиплексора можно реализовать аналоговый коммутатор сигналов.
Аналоговая шина может подключаться к управляемому источнику тока, что может применяться, например, там, где требуется измерение емкости.
Широко используемое на данный момент применение блока аналогового мультиплексора — реализация емкостных сенсоров прикосновения (технология CapSence). Более подробно данная технология будет рассмотрена в одной из следующих статей.
Флэш-память, помимо хранения собственно программы, может быть использована для сохранения каких-либо параметров, состояние которых должно быть восстановлено после включения питания. Для реализации записи во флэш-память можно воспользоваться библиотечным модулем эмуляции EEPROM, либо прямым вызовом процедур для выполнения очистки и записи блока, находящихся в SROM. Второй вариант может оказаться более предпочтительным, если требуется уменьшить размер программы, поскольку модуль эмуляции EEPROM позволяет изменять только выбранное количество байт в блоке флэш-памяти, но ценой достаточно больших затрат ОЗУ и памяти программ. Используя вызовы процедур из SROM, можно сэкономить до килобайта в объеме кода программы. Вызов данных функций не представляет никаких сложностей (листинг 1). Для этих операций необ-
ходимо рассчитать значения длины импульсов программирования (CLOCKW) и очистки (CLOCKe), а также величины задержки DELAY. Эти параметры зависят от температуры, от частоты работы процессора и индивидуальных особенностей чипа (рис. 10) и нужны для выбора оптимальных значений при «прошивке» флэш-памяти, которая выполняется для продления срока службы памяти этого типа. Параметры M, B и Mult можно получить, вызвав находящуюся в SROM функцию чтения калибровочных таблиц TableRead. Значение температуры можно получить от упоминавшегося встроенного датчика, либо задав его константой. В данном примере для вызова функций из SROM используется макроопределение SSC_Action, объявленное в файле m8ssc.inc.
Следует не забывать о том, что по умолчанию в проекте, созданном в PSoC Designer, все блоки флэш-памяти защищены от записи. Поэтому тот блок, к которому предполагается осуществлять доступ, нужно объявить незащищенным, модифицировав файл flashse-curity.txt.
Чтение сохраненных данных осуществляется инструкцией romx.
В заключение читателю предлагается самостоятельно поэкспериментировать с отладочной платой из комплекта CY3210-Miniprog1. Возьмите за основу примеры из прошлых статей и сделайте для тренировки следующий «проект»: используя модуль АЦП DELSIG8 (8-разрядный дельта-сигма), реализуйте в программе оцифровку значения с потенциометра и сохранение во флэш-память текущего значения при нажатии на кнопку. Используйте это сохраненное значение в качестве порогового для управления индикаторами — при превышении порога включайте светодиоды. ■
include «m8c.inc» ; part specific constants and macros include «m8ssc.inc» ; part specific constants and macros
FLASH_BANK : equ 3 ; банк флэш-памяти FLASH_BLOCK : equ 127 ; номер блока в банке FLASH_ADDRESS : equ 0x7FC0 ; адрес начала данного блока
export Flash_Write_Block Flash_Write_Block:
push A ; сохраняем указатель на данные в стеке
call Calculate_CLOCK_E
;используем блок умножителя
mov A, [FCh] ; clock_e
mov reg[MUL0_X], A
mov A, [FDh] ; параметр Mult
mov reg[MUL0_Y], A
mov A, reg[MUL0_DL]
mov [FCh],A
mov A, reg[MUL0_DH]
;деление на 64 mov X, 5 .l0: rrc A
rrc [FCh] ; параметр CLOCK_w dec X jnc .l0
pop A восстанавливаем указатель на данные в памяти
mov [FBh], A
M8C_SetBank1
mov reg[FAh], FLASH_BANK ;BANK M8C_SetBank0
mov [FAh], FLASH_BLOCK ;BLOCK
mov [FEh], 180 ;параметр DELAY SSC_Action(FLASH_WRITE)
ret
export Flash_Erase_Block Flash_Erase_Block:
call Calculate_CLOCK_E
mov [FEh], 180 ;параметр DELAY
mov [FAh], FLASH_BLOCK
M8C_SetBank1
mov reg[FAh], FLASH_BANK
M8C_SetBank0
SSC_Action(FLASH_ERASE)
ret
Calculate_CLOCK_E:
mov [bSSC_TABLE_TableId], 3 SSC_Action(TABLE_READ)
;используем блок умножителя mov A, [FBh] ; параметр М mov reg[MUL0_X], A mov reg[MUL0_Y], 25 ;температура mov A, reg[MUL0_DH] ;результат/256 rlc A ; умножаем на 2
sub [FCh], A ; вычитаем результат из параметра B ret
Листинг 1
Литература
1. PSoC Mixed Signal Array Technical Reference Manual (TRM). Version 2.20.
2. Assembly Language User Guide.
3. Килочек Д. Проектирование на программируемых системах на кристалле PSoC Cypress. Компоненты и технологии. 2006. № 4, 6, 8.
4. Grygorenko V. AN2349. Increasing Output Power of a Switch Mode Pump.