МПУЭВС. Лекции. Задания / pdf_ПрилПЦиПУ / Приложение _Н_ ПериферМодулиADSP
.pdf11
который сформирован делением частоты опорного внешнего генератора
16,384 МГц.
Если в качестве источника синхронизации выбран внешний генератор
16,384 МГц, то сигнал RFS процессора должен быть входом, для чего в разряд 8 регистра управления 0x3FF6 необходимо записать нуль при инициализации порта SPORT0.
Таблица Н.4 - Регистры конфигурации портов SPORT
Адрес |
|
Назначение регистра |
|
|
|
0x3FFA |
Приемник RX0 |
порта SPORT0 , биты31-16 |
|
|
|
0x3FF9 |
Приемник RX0 |
порта SPORT0 , биты15-10 |
|
|
|
0x3FF8 |
ПередатчикTX0 порта SPORT0 , биты31-16 |
|
|
|
|
0x3FF7 |
ПередатчикTX0 порта SPORT0 , биты15-10 |
|
|
|
|
0x3FF6 |
Регистр управления порта SPORT0: |
|
|
источник битовой синхронизации, кадровая синхронизация, |
|
|
компандирование, длина слова |
|
|
|
|
0x3FF5 |
Делитель битовой частоты SCLKDIV порта SPORT0 |
|
|
|
|
0x3FF4 |
Делитель кадровой частоты RFSDIV порта SPORT0 |
|
|
|
|
0x3FF3 |
Регистр управления автобуферизацией порта SPORT0 |
|
|
|
|
0x3FF2 |
Регистр управления порта SPORT1: |
|
|
выходной сигнал флага, источник битовой синхронизации, |
|
|
кадровая синхронизация, компандирование, длина слова |
|
|
|
|
0x3FF1 |
Делитель битовой частоты SCLKDIV порта SPORT1 |
|
|
|
|
0x3FF0 |
Делитель кадровой частоты RFSDIV порта SPORT1 |
|
|
|
|
0x3FEF |
Регистр управления автобуферизацией порта SPORT1 |
|
|
|
|
Сигнал процессора TFS в рассмотренной схеме при установленной перемычке может быть только входом. Поэтому в разряд 9 регистра управления 0x3FF6 необходимо также записать ноль. Если в схеме перемычку между выводами RFS и TFS убрать (рисунке Н.4), то TFS
необходимо запрограммировать на вывод, записав единицу в разряд 9. В
этом случае сигнал кадровой синхронизации ТFS должен сформировать последовательный порт процессора.
Кадровая синхронизация кодека SDOFS тактирует только приемник порта SPORT. Начало приема и передачи могут не совпадать. Задержка между передачей и приемом зависит от количества команд подпрограммы
12
обработки прерывания. Последний вариант синхронизации более удобен для смешанного режима работы, когда процессор вначале записывает управляющие слова для инициализации кодека, а затем переводит кодек в режим приема и передачи данных. При инициализации кодека передаваемые процессором данные не должны поступать на вход ЦАП, принимаемые данные не должны восприниматься процессором как информация от АЦП.
Пример программирования выводов процессора RFS и TFS при инициализации SPORT0 для смешанного режима работы кодека приведен в листинге 2. При записи числа в регистр управления 0x3FF6 порта SPORT0
используется его имя SPORT0_Control_Reg, объявленное в файле constant.h.
Инициализация последовательного порта SPORT0 в приведенной программе выполняется отдельной командой для каждого разряда.
Рисунок Н.7 - Разряды регистров управления 0x3FF6 порта SPORT0 и 0x3FF2
порта SPORT1
13
Если в выбранный разряд необходимо записать 0, то содержимое регистра умножается на константу с нулем в этом же разряде и единицами во всех остальных разрядах. Это позволяет обнулить только один из 16
разрядов, сохранив предыдущие значения в 15 разрядах, находившихся в регистре управления до умножения на константу (маску). Поразрядное умножение двух чисел с помощью команды ''and''определяет результат умножения в каждом разряде 0*Х = 0, 1*Х = Х, где Х обозначает произвольное состояние бита (0 или 1).
Аналогично для записи единицы в один из 16 разрядов с сохранением остальных 15 разрядов используется поразрядное логическое сложение.
Поразрядное логическое сложение двух чисел с помощью команды ''or''
определяет результат умножения в каждом разряде 0 + Х = Х, 1 + Х = 1.
Единица должна быть в том же разряде константы, в котором необходимо записать единицу в регистр. Остальные 15 разрядов константы равны нулю.
Рисунок Н.8 - Внешняя синхронизация приемника порта SPORT
14
Листинг 1
Программирование сигнала RFS на ввод, TFS - на вывод
#include ''constant.h''; /*подключается файл с именами регистров */
ax0 = dm(SPORT0_Control_Reg); /* читается регистр 0x3FF6 и сохраняется в регистре ax0 */
ay0 = b#1111111011111111; /* маска разряда 8 */
ar = ax0 and ay0; /* поразрядное умножение регистров ax0 и ay0 обнуляет разряд 8 регистра ar и сохраняет остальные 15 разрядов ax0 */ dm(SPORT0_Control_Reg) = ar; /* записывается ar в регистр 0x3FF6 с 0 в
разряде 8, вывод RFS процессора запрограммирован на ввод */
ax0 = dm(SPORT0_Control_Reg); /* читается регистр 0x3FF6 и сохраняется в регистре ax0 */
ay0 = b#0000001000000000; /* маска разряда 9 */
ar = ax0 or ay0; /* поразрядное логическое сложение ax0 и ay0 устанавливает разряд 9 регистра ar и сохраняет 15 разрядов ax0 */ dm(SPORT0_Control_Reg) = ar; /* записывается ar в регистр 0x3FF6 с 1 в
разряде 9, вывод TFS процессора запрограммирован на вывод */
Файл constant.h
#define SPORT1_Autobuf 0x3FEF #define SPORT1_RFSdiv 0x3FF0 #define SPORT1_SCLKdiv 0x3FF1 #define SPORT1_Control_Reg 0x3FF2 #define SPORT0_Autobuf 0x3FF3 #define SPORT0_RFSdiv 0x3FF4 #define SPORT0_SCLKdiv 0x3FF5 #define SPORT0_Control_Reg 0x3FF6 #define SPORT0_TX_Channels0 0x3FF7 #define SPORT0_TX_Channels1 0x3FF8 #define SPORT0_RX_Channels0 0x3FF9 #define SPORT0_RX_Channels1 0x3FFA
15
#define TSCALE 0x3FFB #define TCOUNT 0x3FFC #define TPERIOD 0x3FFD #define DM_Wait_Reg 0x3FFE
#define System_Control_Reg 0x3FFC
В начале программы в секции памяти программ заполняется таблица векторов прерываний, которая связывает вектор с именем программы и подпрограммы прерывания (листинг 2).
Листинг 2
Инициализация векторов прерываний в основной программе
section/pm Interrupts; /* заполняем таблицу в памяти программ */ start:
jump main; rti; rti; rti; /* вектор сброса 0х0000, переход на основную программу с именем main в секции .section/pm_code */
rti; rti; rti; rti; /* вектор 0х0004 сигнала IRQ2 */ rti; rti; rti; rti; /* вектор 0х0008 сигнала IRQL1 */ rti; rti; rti; rti; /* вектор 0х000C сигнала IRQL0 */
rti; rti; rti; rti; /* вектор 0х0010 передатчика порта SPORT0 */
jump fir_start; rti; rti; rti; /* вектор 0х0014 приемника порта SPORT0,
переход на подпрограмму обработки прерывания с именем fir_start */ rti; rti; rti; rti; /* вектор 0х0018 сигнала IRQE */
rti; rti; rti; rti; /* вектор 0х001C контроллера BDMA */ rti; rti; rti; rti; /* вектор 0х0020 передатчика SPORT1 */ rti; rti; rti; rti; /* вектор 0х0024 приемника SPORT1 */ rti; rti; rti; rti; /* вектор 0х0028 таймера */
rti; rti; rti; rti; /* вектор 0х002С снижения потребления */
Сброс процессора вызывает выполнение программы с нулевого адреса.
Программа в листинге 3 определяет безусловный переход с нулевого стартового адреса к основной программе main. Сигнал прерывания
16
приемника последовательного порта SPORT0 вызывает выполнение подпрограммы обработки прерывания fir_start. Команда rti означает окончание подпрограммы обработки прерывания. Поэтому сигналы остальных источников прерываний никаких действий в программе не вызывают. Каждый вектор занимает в таблице 4 адреса. Векторы, которые не используются программой main, заполняются четырьмя командами rti.
Листинг 3 содержит объявление двух циклических буферов в памяти ОЗУ процессора ADSP-2189M с помощью константы taps. Один из них находится в памяти данных dm и содержит 15 последних отсчетов аналогового сигнала в массиве data_buffer, заполняемого с частотой дискретизации FS по ходу выполнения программы. Другой буфер располагается в области программ pm для хранения коэффициентов фильтра в массиве coefficient. Коэффициенты фильтра считываются из файла только при компоновке программы. Эти значения могут изменяться при повторном проходе компоновщика (linker) без дополнительной трансляции ассемблером..
Листинг 3
Объявление буферов для хранения коэффициентов и данных кодека
#define taps 15 /* константа taps = 15 */
#define taps_less_one 14 /* константа taps_less_one = 14 */
.section/dm dm_data;
.var/circ data_buffer[taps]; /* циклический буфер отсчетов в области dm */
.section/pm pm_data;
var/circ coefficient[taps] = ''coeff.dat''; /*циклический буфер коэффициентов
вобласти pm заполняется числами из файла ''coeff.dat'' */
Влистинге 5 приведен пример основной программы main и
подпрограммы обработки прерываний fir_start. В модуле main программы определяются переменные циклических буферов с помощью регистров I
(указатель), L (длина), M (модификатор). Каждое прерывание вызывает
17
перемещение указателя I на один шаг (М = 1) в каждом буфере. С помощью цикла clear все элементы буфера обнуляются. В управляющие регистры заносятся числа, определяющие параметры и режим работы последовательного порта SPORT0. В подпрограмме fir_start заполняется буфер цифровых отсчетов аналогового сигнала с использованием регистра приемника rx0, рассчитывается выходной сигнал КИХ-фильтра N-го порядка и выводится на ЦАП кодека через выходной регистр порта tx0. После проведения процессором инициализации в начале программы схема,
состоящая из процессора, кодека и внешних генераторов на рисунке Н.9,
выполняет циклическую обработку прерываний с периодом дискретизации
TS в следующем порядке:
-преобразование входного напряжения в 16-разрядный двоичный код;
-передача последовательным кодом двух слов по 16 бит АЦП каждого канала с синхронизацией сигналами кодека SCLK и SDOFS;
-формирование последовательным портом SPORT0 сигнала прерывания после приема двух слов от кодека;
-передача контроллером прерывания вектора прерывания 0х0014; -временное прекращение основной программы main и переход на
подпро-грамму обработки прерывания, имя которой fir_start указано в таблице векторов (листинг 2);
-выполнение подпрограммы обработки прерывания fir_start, которая на-чинается чтением регистра приемника с новым отсчетом АЦП (si=rx0) и
завер-шается командой вывода выходного сигнала КИХ-фильтра на ЦАП (tx0
=mrl);
-возвращение в прерванную программу main;
-прием последовательным кодом за 32 такта сигнала синхронизации
SCLK двух 16-разрядных слов в регистр кодека, одно из которых было рассчитано в подпрограмме fir_start;
-преобразование цифрового двоичного кода в пропорциональный выход-
18
ной аналоговый сигнал ЦАП одного или двух каналов.
Листинг 4
Инициализация порта SPORT0 и обработка прерываний
. section /pm pm_code; main:
l0 = length (data_buffer); /* устанавливается длина циклических */
l4 = length (coefficient) /* буферов отсчетов кодека и коэффициентов */ m0 = 1; /* шаг изменения индекса l0 в буфере data_buffer */
m4 = 1; /* шаг изменения индекса l4 в буфере coefficient */ i0 = data_buffer; /* указатель начала буфера отсчетов */
i4 = coefficient; /* указатель начала буфера коэффициентов */ ax0 = 0;
cntr = length (data_buffer); /* устанавливается счетчик циклов cntr */ do clear until ce;
clear: dm(i0,m0) ax0; /* обнуляется буфер отсчетов */ ax0 = 0x2A0F;
dm(SPORT0_Control_Reg) = ax0; /* программируется порт SPORT0: */
/* длина слова 16 бит, компрессия не используется, активные уровни сигналов RFS, TFSвысокие, RFS – вход, TFS – выход, обычная синхронизация каждого слова приемника и передатчика, внешняя битовая синхронизация SCLK, мно-гоканальный режим не используется */
ax0 = 0x1000;
dm(System_Control_Reg) = ax0; /* разрешается работа порта SPORT0 */ icntl = 0x00; /* вложенные прерывания запрещены */
imask = 0x0060; /* разрешаются прерывания только от приемника и передатчика
порта SPORT0 */ mainloop:
idle; /* переход в режим пониженного энергопотребления */
jump mainloop; /* ожидание в цикле поступления сигнала прерывания
19
от порта SPORT0 */
. section /pm seg_code;
Рисунок Н.9 - Электрическая схема устройства обработки сигналов с процессором ADSP-2189M
20
fir_start: /* начало подпрограммы обработки прерывания SPORT0 */ si = rx0; /* читается регистр приемника порта rx0 */
dm(i0,m0) = si; /* передаётся новый отсчет в буфер data_buffer */
mr = 0; my0 = pm(i4,m4); mx0 = dm (i0,m0); /* переписывается коэффициент и отсчет соответственно в регистры my0,mx0 умножителя-накопителя МАС */ cntr = taps_less_one; /* устанавливается счетчик циклов cntr */
do convolution until ce; convolution:
mr = mr + mx0 * my0(ss), my0 = pm(i4,m4), dm (i0,m0); /* умножение с накоплением N-1 раз в блоке МАС */
mr = mr + mx0 * my0(rnd); /* N-ый проход цикла с округлением результата */ if mv sat mr; /* проверка переполнения результата */
tx0 = mrl; /* записывается выходной сигнал фильтра в передатчик tx SPORT0 */
rti; /* выход из подпрограммы обработки прерывания */
Временные диаграммы цифровой фильтрации входного аналогового сигнала приведены на рисунке Н.10.
Графики не отражают действительных задержек, вносимых отдельными блоками устройства цифровой обработки. Они характеризуют последовательность преобразований и поясняют синхронизацию подпрограммы обработки прерываний сигналами кодека и последовательного порта процессора. Время задержки сигнала tЗС определяет минимальную временную задержку прохождения аналогового сигнала от входа АЦП до выхода ЦАП, вносимую кодеком и подпрограммой fir_start.
Задержка tЗС не связана с частотными свойствами КИХ-фильтра и проявляется даже в том случае, когда выходной сигнал ЦАП повторяет входной сигнал АЦП. Фазовая задержка сигнала определяется типом фильтра и его порядком.
Обмен данными между кодеком и процессором выполняется последовательным кодом за 32 такта сигнала синхронизации тактового
