Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МПУЭВС. Лекции. Задания / pdf_ПрилПЦиПУ / Приложение _Н_ ПериферМодулиADSP

.pdf
Скачиваний:
39
Добавлен:
11.05.2015
Размер:
461 Кб
Скачать
☆

11

который сформирован делением частоты опорного внешнего генератора

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 такта сигнала синхронизации тактового