3.2.Плата L-761 3.2.1.С труктурная схема платы L-761 Как видно из приведенной выше структурной схемы, функционально плата L-761 как бы разделена на две гальванически развязанные части. На опторазвязанной с компьютером стороне находятся микроконтроллер AVR 90S2313, который обеспечивает надлежащее функционирование последовательного АЦП AD7894 и цепей коммутации входных сигналов, и ЦАП AD7294, управляемый непосредственно DSP. В ППЗУ микроконтроллера при наладке на ЗАО “Л-Кард" зашивается соответствующая программа, отвечающая за его корректную работу. На другой, гальванически не развязанной с компьютером, стороне расположены микросхема PCI9050-1, полностью обеспечивающая PCI-интерфейс платы с РС, цифровой сигнальный процессор (DSP), фактически управляющий всей периферией на плате, а также разъем для внешних цифровых линий. Итак, на данной плате установлен современный высокопроизводительный сигнальный процессор фирмы Analog Devices, Inc. ADSP-2184 (возможна замена на ADSP-2185), работающий на частоте 2*fq, где fq=14745.6 кГц – частота кварца. Внутренняя архитектура процессора оптимизирована для реализации таких алгоритмов, как цифровая фильтрация, спектральный анализ и т.д. Сам процессор имеет внутреннюю память программ на 4 КСлов и внутреннюю память данных 4 КСлов (процессор ADSP-2185 обладает 16 КСлов памяти программ и 16 КСлов памяти данных). Наличие такого мощного сигнального процессора обеспечивает Вам, при необходимости, возможность самостоятельного применения чрезвычайно гибких методов управления всей периферией платы и позволяет переносить часть операций по обработке данных на саму плату (например, Быстрое Преобразование Фурье). Процессор обладает своим собственным контроллером ПДП (канал IDMA: Internal Direct Memory Access; подробнее о работе IDMA см. “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 11.3 “IDMA Port”, Analog Devices, Inc., Third Edition September 1995 или на сайте www.analog.com) для доступа к любой ячейки внутренней памяти. Благодаря этому Ваша программа может обращаться к любой ячейки памяти процессора, не прерывая работы самого DSP, что исключительно удобно при построении алгоритмов, работающих в реальном масштабе времени. Максимальная пропускная способность обмена данными между сигнальным процессором и компьютером составляет приблизительно 10 Мб/с. Весь обмен данными с центральным компьютером DSP осуществляет через свой канал IDMA. Протокол работы с каналом IDMA предусматривает также возможность загрузки в сигнальный процессор управляющей программы (драйвера), которая будет осуществлять требуемые алгоритмы ввода-вывода (процедуру загрузки см. “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 11.3.5 “Boot Loading Through the IDMA Port”, стр. 11-24, Analog Devices, Inc., Third Edition September 1995). Фирменный драйвер LBIOS работает по принципу команд и для реализации такой возможности используется прерывание IRQ2 сигнального процессора. Сначала в соответствующую ячейку памяти данных DSP (предопределенная константа L_COMMAND, см. § 2.1.5.1.4 “Переменные LBIOS”) заносится номер команды, которую драйвер должен выполнить. Затем инициируется прерывание IRQ2, в ответ на которое, обработчик данного прерывания, содержащийся в самом LBIOS, выполняет соответствующие данной команде действия. DSP осуществляет получение данных с АЦП и управление работой микроконтроллера AVR с помощью одного из своих последовательных (сериальных) портов (SPORT0). Микроконтроллер AVR, получающий параметры своего функционирования от DSP по каналу UART, управляет цепями коммутатора входных сигналов, коэффициентом усиления программируемого усилителя, частотой запуска АЦП и, при необходимости, синхронизацией ввода данных по линии TRIG внешнего разъема DRB-37M. Сигнальный процессор обеспечивает также взаимодействие с микросхемой двухканального ЦАП через посредство другого своего последовательного порта (SPORT1). Управление внешними цифровыми линиями на разъеме PLD-40 осуществляется DSP с помощью чтения/записи своего пространства ввода/вывода (I/O Memory Space). Описание этого пространства можно найти, например, в оригинальной книге “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 10.6.4 “ADSP-2181 I/O Memory Space”, стр. 10-32, Analog Devices, Inc., Third Edition September 1995.
3.2.2.Создание управляющей программы У пользователя, как правило, не появляется необходимость в написаниии своих собственных управляющих программ для данной платы, т.к. все наиболее часто требуемые алгоритмы работы уже реализованы в фирменном драйвере, находящимся в файле L761.bio. Однако если же у Вас все-таки возникла необходимость в создании собственной управляющей программы (например, для формирования какого-либо специализированного алгоритма действия процессора), то для этого придется освоить достаточно несложный язык ассемблера для сигнального процессора. В качестве законченного примера программирования платы на таком языке можно использовать исходные тексты фирменного драйвера, хранящиеся в файлах DSP\L761\L761.DSP и DSP\L761\*.H. Эти исходные тексты достаточно подробно прокомментированы.
Процесс формирования собственной управляющей программы для DSP потребует от Вас приложения определенных усилий:
Вам необходимо будет изучить несложную архитектуру процессора ADSP-218x, а также освоить довольно простой язык его программирования (ассемблер для DSP). Всю подробную информацию об этом можно найти в оригинальной книге “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, Analog Devices, Inc., Third Edition, September 1995 или в русском переводе “Руководство пользователя по сигнальным микропроцессорам семейства ADSP-2100”, под редакцией А.Д.Викторова, Санкт-Петербург, 1997. Оба эти издания можно приобрести в ЗАО “Л-Кард". Описание и примеры программ для DSP с исходными текстами приводятся в двухтомном справочнике “Digital Signal Processing Applications Using the ADSP-2100 Family”, Analog Devices, Inc., который можно найти у официальных российских дистрибьюторов компании Analog Devices, Inc. (например, фирмы Autex Ltd. или Argussoft Co.). Много полезного в дополнение к указанной документации можно обнаружить также на сайте www.analog.com.
Процессоры семейства ADSP-218х поддерживаются полным набором программных средств отладки. Этот набор включает в себя несколько программ: построитель системы (bld21.exe), ассемблер (asm21.exe), линкер или редактор связей (ld21.exe) и т.д. Все эти программы очень подробно описываются в оригинальной книге “ADSP-2100 Family Assembler Tools & Simulator Manual”, Analog Devices, Inc., Second Edition, November 1994, которую можно найти у официальных российских дистрибьюторов компании Analog Devices, Inc. (например, фирмы Autex Ltd. или Argussoft Co.). Сам пакет разработчика программ для сигнальных процессоров семейства ADSP-21xx, содержащий все выше указанные средства отладки (кроме bld21.exe), можно приобрести в ЗАО “Л-Кард". В качестве архитектурного файла нужно использовать L761.ACH.
Итак, если у Вас не возникло проблем с первыми двумя этапами, то теперь можно приступать к собственно написанию Вашей управляющей программы. Для начала надо создать соответствующие файлы с исходным кодами Вашей программы на языке ассемблер DSP. Затем эти файлы необходимо оттранслировать (asm21.exe) и скомпоновать с помощью редактора связей (ld21.exe), формируя, таким образом, выполняемую программу типа .EXE, так называемый файл отображения в памяти (memory image file). !!! Не путать этот файл с обычной выполняемой DOS программой типа .EXE!!! Формат сформированного файла отображения в памяти очень подробно описан в “ADSP-2100 Family Assembler Tools & Simulator Manual”, Appendix B “File Format”, B.2 “Memory Image File (.EXE)”, Analog Devices, Inc., Second Edition, November 1994. Именно в этом файле содержатся все коды инструкций Вашей программы с соответствующими адресами их расположения в памяти программ DSP, а также инициализирующие значения Ваших переменных и адреса их нахождения в памяти данных. Зная всю эту информацию нужно просто аккуратно загрузить ее в память DSP по надлежащим адресам. Для упрощения процедуры загрузки полученный файл отображения в память .EXE преобразуется с помощью утилиты DSP\L761\BIN3PCI.EXE в файл .BIO (подробности см. приложение E).
Вообще-то, всю эту последовательность создания файла .BIO можно проследить по содержанию файлу DSP\L761\L761.BAT. Созданный таким образом файл с управляющей программой .BIO затем используется, например, в штатной функции загрузки сигнального процессора LOAD_LBIOS_PLX() (§ 2.1.5.2.2 “Загрузка LBIOS”).
3.2.3.Загрузка управляющей программы в DSP Перед началом работы с платой необходимо ее “оживить”, т.е. загрузить в DSP либо фирменный драйвер, находящийся в файле L761.bio, либо Вашу собственную управляющую программу. Только после выполнения такой процедуры плата будет корректно работать с функциями штатной или Вашей (если создадите) библиотеки. Формат файла L761.bio, содержащий все коды инструкций управляющей программы, подробно описан в приложении E. Коды инструкций сигнального процессора из этого файла необходимо расположить по соответствующим адресам памяти программ, также как данные, инициализирующие переменные драйвера, в памяти данных и запустить управляющую программу на выполнение. Все это и называется загрузка управляющей программы в DSP.
Сама процедура начальной загрузки управляющей программы во внутреннюю память DSP достаточно проста и хорошо описана в “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 11.3.5 “Boot Loading Through the IDMA Port”, стр. 11-24, Analog Devices, Inc., Third Edition September 1995. Она предполагает выполнение следующих несложных шагов:
произведите сброс (RESET) DSP на данной плате, например, с помощью API функции PLATA_RESET_PLX() (см.§ 2.1.5.2.6 “Сброс DSP на плате”);
заполните необходимыми данными по каналу IDMA память данных и программ, кроме ячейки с адресом PM(0х0000), для чего можно воспользоваться соответствующими функциями PUT_DM_ARRAY_PLX() (см. § 2.1.5.3.7 “Запись массива слов в память данных DSP”), PUT_PM_WORD_PLX() (см. § 2.1.5.3.8 “Запись массива слов в память программ DSP”) и т.д.
запишите данные в ячейку памяти программ по адресу PM(0x0000) для старта Вашей управляющей программы (при этом ее выполнение начнется с инструкции, находящейся в PM(0x0000)).
Внимание!!! Необходимо обязательно убедиться, что Вы загрузили всю нужную информацию в память DSP до записи данных по адресу PM(0x0000).
В общем-то ВСЕ! Теперь можно спокойно приступать к управлению платой с помощью функций штатной или Вашей библиотеки.
3.2.4.Установка флагов PFx сигнального процессора Микросхемы сигнальных процессоров ADSP-2184/2185/2186 имеют восемь дополнительных неспециализированных выводов, так называемых флагов, обозначаемых обычно PF0÷PF7. Данные флаги могут быть индивидуально запрограммированы как на вход, так и на выход. На указанных типах процессоров выводы этих флагов обладают также и дополнительными функциями. Так флаг PF6 совмещен с входом прерывания IRQL1, а флаг PF7 - с IRQ2 и т.д. (подробности можно найти в техническом описании этих DSP на сайте www.analog.com). Т.о. флаги PFx необходимо запрограммировать на вход-выход надлежащим образом, т.е. флаги PF0÷PF2, PF6, PF7 как входные, а флаги PF3, PF4 и PF5 как выходные. Программирование флагов осуществляется с помощью двух управляющих регистров DSP:
регистр Programmable Flag & Composite Select Control, находящий по адресу DM(0x3FE6) в памяти данных, управляет направлением флага
регистр Programmable Flag Data, расположенный по адресу DM(0x3FE5), используется для записи и считывания значений флагов.
Формат данных регистров приведен ниже и подробно описан в “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 9.5 “Flag Pins”, стр. 9-15, Analog Devices, Inc., Third Edition, September 1995.
Programmable Flag & Composite Select Control (DM(0x3FE6)) 15
| 14
| 13
| 12
| 11
| 10
| 9
| 8
| 7
| 6
| 5
| 4
| 3
| 2
| 1
| 0
|
|
|
|
|
|
|
|
| PF7
| PF6
| PF5
| PF4
| PF3
| PF2
| PF1
| PF0
|
Тип PFx флага
1 выходной
0 входной
Programmable Flag Data (DM(0x3FE5)) 15
| 14
| 13
| 12
| 11
| 10
| 9
| 8
| 7
| 6
| 5
| 4
| 3
| 2
| 1
| 0
|
|
|
|
|
|
|
|
| PF7
| PF6
| PF5
| PF4
| PF3
| PF2
| PF1
| PF0
|
PFx Data
Следовательно, для надлежащего программирования флагов PFx необходимо написать следующий код:
const Prog_Flag_Comp_Sel_Ctrl = 0x3FE6;
. . . . .
{сделаем флаги PFx: PF0PF2, PF6, PF7 - входные, остальные - выходные}
AR=0x38;
DM(Prog_Flag_Comp_Sel_Ctrl)=AR;
3.2.5.Микроконтроллер AVR На плате L-761 микроконтроллер AVR AT93S2313, находящийся на гальванически развязанной с компьютером стороне (см. § 3.2.1 “Структурная схема платы L-761”), в соответствии с информацией, получаемой от DSP, задает режим работы и временные диаграммы АЦП, а также управляет цепями входного коммутатора и программируемого усилителя (PGA). Полное техническое описание на микроконтроллер можно найти на сайте www.atmel.com. Два порта данного микроконтроллера сконфигурированы следующим образом:
Порт B
-
Вывод
| Назначение
| PB0
| MA0 – 0ой бит адреса канала
| PB1
| MA1 – 1ый бит адреса канала
| PB2
| MA2 – 2ой бит адреса канала
| PB3
| MA3 – 3ий бит адреса канала
| PB4
| MA4 – заземление входа программируемого усилителя/ 4ый бит номера канала
| PB5
| MA5 – 16 диф./32 общ. режим подключения входных каналов
| PB6
| GS0 – 0ой бит коэффициента усиления
| PB7
| GS1 – 1ый бит коэффициента усиления
| смысл назначений данного порта подробно описан в § 2.1.2.2.3 “Логический номер канала АЦП”.
Порт D
-
Вывод
| Назначение
| PD0
| Вход данных UART
| PD1
| Не используется
| PD2
| Прерывание INT0 используется для внешней синхронизации АЦП (отрицательный импульс _ длительностью не менее 200 нс)
| PD3
| Прерывание INT1 управляется от DSP (флаг PF3)
| PD4
| -CONV – запуск АЦП
| PD5
| Не используется
| PD6
| -FRAME используется при передаче данных из АЦП в DSP
| В ППЗУ микроконтроллера на ЗАО “Л-Кард" зашивается специализирована программа, которая через выше указанные порты осуществляет управление АЦП, коммутатором и PGA. Основные параметры этого управления AVR получает по UART (1 стартовый бит, 9 бит данных, 2 стоповых бита; скорость 625 кГц) из DSP, использующий для передачи последовательный порт SPORT0. Посылки по UART бывает двух типов: адрес и данные. Так при посылке адресного типа 9ый бит передаваемых данных должен быть установлен в ‘1’, иначе в ‘0’. Работа с AVR по UART предполагает выполнение следующих шагов:
сначала в AVR необходимо передать адрес, т.е. номер ячейки памяти микроконтроллера;
теперь можно осуществлять посылки самих данных, которые будут последовательно располагаться в ячейках памяти, начиная с уже переданного адреса.
При получении посылки любого типа AVR прерывает выполнение своей основной программы, фактически останавливая работу АЦП. После того, как все необходимые данные (параметры) приняты, основную программу AVR, а ,следовательно, и АЦП, необходимо заново запустить в обычном режиме сбора данных. Для этого надо вызвать прерывание INT1, сформировав короткий отрицательный импульс (_ менее 1 мкс) на выходе флага PF3 сигнального процессора. Можно осуществить и полный сброс (RESET) микроконтроллера, когда все параметры управления в программе AVR устанавливаются по умолчанию. Делается это также с помощью флага PF3, но формируемый отрицательный импульс (_) на его выводе должен иметь длительность не менее 10 мкс. Сама процедура сброса AVR достаточно длительная (не менее 0.2 с) и не рекомендуется ничего посылать в AVR, пока она не завершится.
В памяти микроконтроллера расположены следующие переменные, значения которых задают все доступные режимы работы АЦП, коммутатора и PGA:
Адрес (Hex)
| Обозначение
| Назначение
| 0x5
| adsynchro
| логический номер канала для аналоговой синхронизации
| 0х6
| rate_low
| младший байт 16ти битного значения межканальной задержки соответствующего tмкз=Inter_Kadr_Delay (само 16ти битное значение межканальной задержки задается в единицах 0.1 мкс)
| 0х7
| rate_high
| старший байт 16ти битного значения межканальной задержки соответствующего tмкз=Inter_Kadr_Delay (само 16ти битное значение межканальной задержки задается в единицах 0.1 мкс)
| 0х8
| kadr_low
| младший байт 16ти битного значения интервала запуска АЦП соответствующего tАЦП=1/ADC_Rate (само 16ти битное значение интервала запуска АЦП задается в единицах 0.1 мкс)
| 0х9
| kadr_high
| старший байт 16ти битного значения интервала запуска АЦП соответствующего tАЦП=1/ADC_Rate (само 16ти битное значение интервала запуска АЦП задается в единицах 0.1 мкс)
| 0хА
| topaddr
| Адрес ячейки с последним байтом управляющей таблицы + 1, т.е. topaddr=0x60+Control_Table_Length
| 0хВ
| mode
| Установленные в ‘1’ соответствующие биты данного параметра определяют режимы синхронизации работы АЦП:
5ый бит задает режим аналоговой синхронизации ввода данных с АЦП по заданному в ячейке 0х5 логическому каналу;
6ый бит задает режим ждущей по-кадровой синхронизации;
7ый бит задает режим ждущей синхронизации старта АЦП.
| 0х60÷0хС0
| control_table
| 96 байтовая управляющая таблица , каждый элемент которой содержит значение для последовательного управления портом В (фактически это Control_Table, переданная в AVR)
| Смысл tАЦП, ADC_Rate, tмкз, Inter_Kadr_Delay, Control_Table и Control_Table_Length подробно описан, например, в § 2.1.2.4. “Формат кадра отсчетов”.
При начале работы с AVR первым делом необходимо произвести его сброс. Только после завершения сей процедуры можно загрузить в AVR управляющую таблицу и адрес ее последнего байта. При желании можно задать также частоту работы АЦП и межкадровую задержку (эти два параметра определяются в единицах 0.1 мкс.). Теперь надо запустить, приостановленную записью параметров, основную программу AVR в обычном режиме сбора данных с АЦП, сгенерировав для этого прерывание INT1. Все! Остается только ждать когда АЦП начнет передавать данные в последовательном виде (их должен принимать DSP с помощью своего сериального порта SPORT0). Первым поступят данные с аналогового канала, заданного первым элементом управляющей таблицы, следующим - заданный вторым элементом и т.д. циклически повторяясь.
В режим синхронизации ввода с АЦП основную программу AVR можно перевести, записав в ячейку с адресом 0хВ надлежащее значение. При ждущей синхронизации старта АЦП, данные с него начнут поступать только после прихода прерывания INT0 с внешнего разъема. В случае по-кадровой синхронизации данные одного кадра с АЦП поступят опять же только после прихода прерывания INT0. Перед переходом в режим аналоговой синхронизации Вам необходимо прежде прописать по адресу 0х5 логический номер канала синхронизации (синхроканал). После перехода в этот режим с АЦП начнут поступать данные только с заданного синхроканала. Эти данные теперь можно анализировать на предмет выполнения каких-то заданных Вами критериев синхронизации. После реализации условий таких критериев можно запустить основную программу AVR в обычном режиме работы сбора данных, сгенерировав прерывание INT1.
Для выхода из режима синхронизации не дождавшись момента его наступления, Вы должны прописать в ячейке с адресом 0хВ значение равное 0х0, с последующим генерированием прерыва-ния INT1.
3.2.6.Передача параметров из DSP в AVR Передачу параметров в AVR сигнальный процессор осуществляет с помощью своего сериального порта SPORT0. Для этого необходимо его запрограммировать надлежащим образом, а именно:
длина слова (word length) – 12 бит;
тактовые синхроимпульсы (serial clocks) –внутренние с частотой 614.4 кГц;
кадровая синхронизация передачи каждого слова;
внутренняя кадровая синхронизация передачи;
альтернативная кадровая синхронизация передачи;
кадровый сигнал передачи активен по низкому уровню.
Очень подробное описание конфигурирования сериальных портов DSP можно найти в “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, Chapter 5 “Serial Ports”, стр. 5-1, Analog Devices, Inc., Third Edition, September 1995.
Для посылки параметра в AVR его надо соответствующим образом преобразовать, с учетом обязательного наличия одного стартового и двух стоповых битов. После чего передаваемое значение можно записать в регистр передачи TX0 и порт SPORT0 сам осуществит эту посылку.
Приведем пример подготовки порта SPORT0 для передачи параметров в AVR:
{ Для начала отконфигурируем SPORT0 на передачу }
{ SPORT0 - disable, SPORT1 - enable, SPORT1 - serial port }
AR = 0x0С00; { 0000 1100 0000 0000 }
DM(Sys_Ctrl_Reg)=AR; { 0x3FFF - System Control Register }
{ Serial Clock Divide Modulus }
AR = 23; { SCLK0 - internal }
DM(Sport0_Sclkdiv) = AR; { 0x3FF5 - Serial Clock Divide Modulus }
{ Receive Frame Sync Divide Modulus }
AR = 1000; { may be any number: receive frame is external }
DM(Sport0_Rfsdiv) = AR; {0x3FF4-Receive Frame Sync Divide Modulus}
{ Control word for SPORT0: SCLK0 - internal }
{ low level, alternate external receive frame on each word(12 bit) - not used }
{ low level, alternate internal transmit frame on each word(12 bit) }
AR = 0x7ECB; { 0111 1110 1100 1011 }
DM(Sport0_Ctrl_Reg) = AR; { 0x3FF6 - SPORT0 Control Register }
{ SPORT0 enable, SPORT1 enable, SPORT1 - serial port }
AR = 0x1C00; { 0001 1100 0000 0000 }
DM(Sys_Ctrl_Reg) = AR; { 0x3FFF - System Control Register }
{ Все! Теперь нужно подготовить данные для передачи их в формате UART}
{ и загрузить их в регистр передачи TX0. Эти данные портом SPORT0 }
{ будут переданы в AVR самостоятельно }
3.2.7.АЦП Прием данных, поступающих в последовательном виде с АЦП AD7894 (техническое описание можно найти на сайте www.analog.com), сигнальный процессор осуществляет через посредство своего сериального порта SPORT0. Для этого необходимо его запрограммировать надлежащим образом, а именно:
длина слова (word length) – 14 бит;
тактовые синхроимпульсы (serial clocks) – внешние с периодом 0.1 мкс;
кадровая синхронизация приема каждого слова;
внешняя кадровая синхронизация приема;
нормальная кадровая синхронизация приема;
кадровый сигнал приема активен по низкому уровню.
Очень подробное описание конфигурирования сериальных портов DSP можно найти в “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, Chapter 5 “Serial Ports”, стр. 5-1, Analog Devices, Inc., Third Edition, September 1995.
После приема одного целого слова, сериальный порт, запрограммированный, как указано выше, генерирует прерывание приема SPORT0 Receive. Теперь в регистре приема этого порта RX0 находится значение с АЦП. В фирменном драйвере L761.bio прием данных портом SPORT0 осуществляется в режиме автобуферизации (AutoBuffering). Детали автобуферизации описаны в“ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 5.11 “AutoBuffering”, стр. 5-26, Analog Devices, Inc., Third Edition, September 1995.
Попробуем проиллюстрировать сказанное примером:
{ Для начала отконфигурируем SPORT0 на прием }
{ SPORT0 - disable, SPORT1 - disable, SPORT1 - serial port }
AR=0x0400;
DM(Sys_Ctrl_Reg)=AR; { 0x3FFF - System Control Register }
{ ****************************************************************** }
{ * Set SPORT0 for receive of ADC samples * }
{ * SCLK0 and Receive Frame - external, word = 14 bits * }
{ Serial Clock Divide Modulus }
AR = 9; { may be any: SCLK0 - external }
DM(Sport0_Sclkdiv) = AR; { 0x3FF5 - Serial Clock Divide Modulus }
{ Receive Frame Sync Divide Modulus }
AR = 1000; { may be any number: receive frame is external }
DM(Sport0_Rfsdiv) = AR; {0x3FF4-Receive Frame Sync Divide Modulus}
{ Control word for SPORT0: SCLK0 - external }
{ low level, normal external receive frame on each word(14 bit) }
{ low level, alternate internal transmit frame on each word(14 bit) - not used }
AR = 0x2EDD; { 0010 1110 1101 1101 }
DM(Sport0_Ctrl_Reg) = AR; { 0x3FF6 - SPORT0 Control Register }
{ ****************************************************************** }
{ SPORT0 - enable, SPORT1 - enable, SPORT1 - serial port }
AR = 0x1C00; { 0001 1100 0000 0000 }
DM(Sys_Ctrl_Reg) = AR; { 0x3FFF - System Control Register }
{ Все! Теперь можно ждать прихода прерывания SPORT0 Receive }
{ и при его появлении в регистре приема RX0 будет отсчет с АЦП }
3.2.8.ЦАП Управление микросхемой двухканального 12ти битного ЦАП AD7249 (техническое описание можно найти на сайте www.analog.com), которая может быть установлена на плате по Вашему желанию, сигнальный процессор осуществляет с помощью последовательного порта SPORT1. Для этого необходимо его запрограммировать надлежащим образом, а именно:
длина слова (word length) – 16 бит;
тактовые синхроимпульсы (serial clocks) – внутренние с периодом не менее 0.4 мкс;
кадровая синхронизация приема каждого слова;
внутренняя кадровая синхронизация приема;
альтернативная кадровая синхронизация приема;
кадровый сигнал приема активен по высокому уровню;
кадровая синхронизация передачи каждого слова;
внешняя кадровая синхронизация передачи;
альтернативная кадровая синхронизация передачи;
кадровый сигнал передачи активен по высокому уровню.
Выводы сигнального процессора для кадровой синхронизации приема и передачи (выводы RFS1 и TFS1 соответственно) объединены, т.е. внутренне генерируемые сигналы кадровой синхронизации приема являются сигналами внешней кадровой синхронизации передачи. Частоту генерирования сигналов на выводе RFS1 можно изменять в достаточно широких пределах, устанавливая таким образом частоту вывода данных на ЦАП. Очень подробное описание конфигурирования сериальных портов DSP можно найти в “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, Chapter 5 “Serial Ports”, стр. 5-1, Analog Devices, Inc., Third Edition, September 1995
Формат передаваемых в микросхему ЦАП данных приведен в следующей таблице: Номер бита
| Назначение
| 0÷11
| 12ти битный код ЦАП
| 12
| Выбирает номер ЦАП:
если ‘0’, то запись в первый канал ЦАП;
если ‘1’, то запись во второй канал ЦАП.
| 13÷15
| Не используются
| Приведем пример подготовки порта SPORT1 для управления ЦАП’ами:
{ Для начала отконфигурируем SPORT1 на передачу данных }
{ SPORT0 - disable, SPORT1 - disable, SPORT1 - serial port }
AR=0x0400;
DM(Sys_Ctrl_Reg)=AR; { 0x3FFF - System Control Register }
{ ****************************************************************** }
{ Set SPORT1 for transmit digital codes in DAC }
{ SCLK1 and Receive Frame - internal, word = 16 bits }
{ Transmit Frame - external }
{ Serial Clock Divide Modulus }
AR=5; { SCLK1 – internal, T=406.9 ns }
DM(Sport1_Sclkdiv) = AR; { 0x3FF1 - Serial Clock Divide Modulus }
{Receive Frame Sync Divide Modulus }
AR = 49; { Определяет частоту вывода отсчетов с ЦАП'а }
DM(Sport1_Rfsdiv)=AR; {0x3FF0-Receive Frame Sync Divide Modulus }
{ Control word for SPORT1: SCLK1 - internal }
{ high level, alternate internal receive frame on each word(16 bit) }
{ high level, alternate external transmit frame on each word(16 bit) }
AR = 0x7D0F; { 0111 1101 0000 1111 }
DM(Sport1_Ctrl_Reg) = AR; { 0x3FF2 - SPORT1 Control Register }
{ ****************************************************************** }
{ SPORT0 - enable, SPORT1 - enable, SPORT1 - serial port }
AR = 0x1C00; { 0001 1100 0000 0000 }
DM(Sys_Ctrl_Reg) = AR; { 0x3FFF - System Control Register }
{ Мы установили частоту вывода данных на ЦАП равной }
{ fq/((5+1)*(49+1))=49.512 Кгц, где fq=14745.6 кГц - частота кварца }
{ Теперь с этой частотой будут приходить прерывания SPORT1 Transmit, }
{ обработчик, которого каждый раз должен записывать в регистр }
{ передачи TX1 очередное значение, посылаемое в микросхему ЦАП }
{ Мы же сейчас просто установим нулевой уровень на первом ЦАП’е }
TX1=0x0;
. . . . .
{ А сейчас установим уровень 5.0 В (код 2047) на втором ЦАП’е }
TX1=0x17FF;
3.2.9.Управление ТТЛ линиями Управление цифровыми линиями осуществлять достаточно просто. Любая запись какого-либо числа в пространство ввода-вывода (I/O Memory Space) сигнального процессора устанавливает состояния всех 16ти выходных линий на разъеме PLD-40 в соответствие с битами записываемого значения. Любое чтение из пространства ввода-вывода (I/O Memory Space) сигнального процессора считывает состояние всех 16ти входных линий на разъеме PLD-40. Описание разъема см. § 1.4.6. “Описание разъема на плате для подключения цифровых сигналов”. Описание I/O Memory Space можно найти, например, в оригинальной книге “ADSP-2100 Family User’s Manual (Includes ADSP-2171, ADSP-2181)”, § 10.6.4 “ADSP-2181 I/O Memory Space”, стр. 10-32, Analog Devices, Inc., Third Edition September 1995.
Рассмотрим простенький пример работы с цифровыми линиями:
{ считаем входные цифровые линии }
AR=IO(0x0);
{ установим прочитанные состояния на выходных линиях }
IO(0x0)=AR;
3.2.10.Генерирование прерываний в РС На плате предусмотрена возможность генерирования прерываний в РС. Эту способность можно использовать, когда Вам требуется проинформировать компьютер о наступлении какого-либо события. Например, в фирменном драйвере генерирование прерывания в РС применяется по мере соответствующего заполнения FIFO буфера АЦП, информируя Вас о готовности данных. Номер прерывания для каждой платы назначается BIOS компьютера или WINDOWS и его можно узнать, прочитав, например, поле InterruptNumber в соответствующей структуре типа BOARD_INFO (см. § 2.1.5.1.1 “Структура BOARD_INFO”).
Для генерации прерывания используется флаг сигнального процессора FL2. Так при работе с прерываниями необходимо, чтобы флаг FL2 постоянно находился в состоянии ‘1’, а переход ‘1’-‘0’-‘1’ осуществлялся только тогда, когда надо вызвать прерывание в компьютере. Внимание!!! Прерывание в компьютере будет сгенерировано только в случае, если со стороны РС оно будет разрешено с помощью API функции INIT_INTERRUPT_PLX() (см. § 2.1.5.6.1 “Установка обработчика прерываний”).
Приведем пример генерирования одного прерывания в компьютер:
{ Сбросим флаг FL2 (предполагается, что он установлен в ‘1’) }
RESET FL2;
NOP; NOP;
SET FL2; { вернем флаг FL2 в исходное состояние, т.е. в ‘1’ }
3.2.11.Внешняя синхронизация сигнального процессора При необходимости дополнительной внешней синхронизации можно использовать ТТЛ совместимый вывод INT разъема PLD-40 или AC-032, который подключен к линии прерывания IRQL1 сигнального процессора. Данное прерывание работает по уровню, т.е. линия IRQL1 должна оставаться в активном низком уровне до тех пор, пока процессор не начнет обслуживание прерывания. В обработчике прерывания линию IRQL1 обязательно надо сбрасывать в исходное высокое состояние, чтобы это прерывание не обрабатывалось повторно. В фирменном драйвере эта линия не используется.
|