Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Дополнительные элементы: отладочный модуль процессора ADSP-BF533 EZ-KIT Lite или ADSP-BF535 EZ-KIT Lite, программная среда Visual DSP 3.5 16-bit, колонки и зкуковой проигрыватель.
Цель работы: В лабораторной работе предлагается изучить и освоить программирование процессора ADSP- BlackFin и его элементов в среде Visual DSP.
Информация: Краткая информация о процессоре. Работа со звуком в EZ-KIT Lite. Пример программ.
Задание на выполнение работы
Результатом выполнения первых двух пунктов лабораторной работы будет звучание сигнала источника звука из колонок.
Файлы проекта:
main.c содержит основную программу и описание переменных.
Initialise.c содержит все подпрограммы инициализации
ISR.c содержит подпрограмму прерывания для SPORT0_RX
Process_data.c содержит процедуру обработки входного звука.
Talkthrough.h файл-заголовок, содержит макросы и прототипы
C_Talkthrough_I2S.dpj файл проекта VisualDSP++ 3.1
Данные программы демонстрируют инициализацию порта SPORT0 для установки связи между ADSP-BF533 и кодеком AD1836.
Через последовательный порт SPI программы переводят кодек в режим I2S (TDM).
Далее порт SPORT0 программируется для передачи и получения аудио сэмплов из кодека. Полученные сэмплы помещаются в буфер DSP в режиме DMA. Далее они обрабатываются процессором ADSP-BF533 и передаются в буфер передачи. В свою очередь, буфер передачи используется , чтобы передать информацию кодеку. Т.к. процедура обработки информации пустая, в результате получается, что принятый звук передаётся через процессор без изменений на выход.
Модуль инициализации содержит процедуры, которые производят настройку:
1. интерфейса внешней шины (EBIU)
2. памяти Flash A
3. последовательного порта SPI (для инициализации кодека AD1836)
4. последовательного порта SPORT0
5. каналов DMA
6. прерываний.
Архитектура ядра процессора Blackfin является архитектурой с единым набором команд, включающей ядро обработки сигналов со сдвоенным блоком умножения-накопления, имеющей ортогональный набор команд, характерный для RISC-микропроцессоров, обладающей гибкостью команд типа SIMD и мультиме-дийными возможностями.
Процессоры Blackfin поддерживают модифицированную Гарвардскую архитектуру с иерархической структурой памяти. Память уровня 1 (L1) обычно работает с полной скоростью процессора с небольшой задержкой или без задержки. Память команд на уровне L1 содержит только команды. Две памяти данных содержат данные, а выделенная сверхоперативная (блокнотная) память хранит информацию стека и локальные переменные.
Вычислительный регистровый файл содержит восемь 32-разрядных регистров. При выполнении вычислительных операций над 16-разрядными операндами регистровый файл функционирует как 16 независимых 16-разрядных регистров. Все операнды вычислительных операций поступают из многопортового регистрового файла или задаются константами в полях команды.
Набор регистров
Ядро процессора содержит два 16-разрядных умножителя, два 40-разрядных аккумулятора, два 40-разрядных арифметико-логических устройства (АЛУ), четыре 8-разрядных видео АЛУ и 40-разрядное устройство сдвига. Вычислительные устройства обрабатывают 8-, 16-и или 32-разрядные данные, поступающие из регистрового файла.
Каждый умножитель-накопитель (MAC) за один такт выполняет умножение двух 16-разрядных чисел и накопление, формируя 40-разрядный результат. Поддерживаются знаковый и беззнаковый форматы чисел, округление и насыщение.
АЛУ выполняет традиционный набор арифметических и логических операций над 16- или 32-разрядными данными. В него включены многие специальные команды, ускоряющие выполнение различных задач обработки сигналов. К ним относятся битовые операции, такие как извлечение поля, подсчёт числа единиц, умножение по модулю 232, примитивы деления, насыщение и округление, и определение знака/порядка. Набор видео-команд включает операции выравнивания и упаковки байтов, сложение 16-разрядных чисел с 8-разрядными с усечением результата, операции 8-разрядного усреднения и операции 8-разрядного вычитания/ взятия абсолютного значения/ накопления (SAA, subtract/ absolute value, accumulate). Также поддерживаются команды сравнения/выбора и векторного поиска. При использовании некоторых команд возможно одновременное выполнение двух 16-разрядных операций АЛУ
Структурная схема вычислительного ядра.
Периферийные устройства системы процессора включают:
• Параллельный периферийный интерфейс (PPI)
• Последовательные порты (SPORT)
• Последовательный периферийный интерфейс (SPI)
• Таймеры общего назначения
• Универсальный асинхронный приёмник-передатчик (UART)
• Часы реального времени (RTC)
• Сторожевой таймер
• Порт ввода/вывода общего назначения (программируемые флаги)
Эти периферийные устройства соединены с ядром несколькими шинами с высокой пропускной способностью.
Среда разработки проектов VisualDSP++ позволяет программистам разрабатывать и выполнять отладку приложений. Эта среда включает лёгкий в использовании ассемблер, основанный на алгебраическом синтаксисе, архиватор(средство создания библиотек), компоновщик, загрузчик, потактовый симулятор уровня команд, компилятор С/С++ и библиотеку исполняемых функций С/С++, включающую математические функции и функции ЦОС. Ключевой особенностью средств разработки программного обеспечения является эффективность кода, написанного на языках С/С++. При отладке как С/С++ программ, так и программ на языке ассемблера в отладчике среды VisualDSP++ программист может:
• просматривать смешанный код на С/С++ и языке ассемблера (с перемежением исходной и объектной информации);
• устанавливать точки останова;
• устанавливать условные точки останова по содержимому регистров, памяти и стеков;
• производить трассировку выполнения команд;
выполнять линейное или статистическое профилирование выполнения программы;
• заполнять, выгружать и графически отображать содержимое памяти;
• выполнять отладку на уровне исходной программы;
• создавать собственные окна отладчика.
Структурная схема EZ-KIT Lite на базе BF535
Структурная схема EZ-KIT Lite на базе BF533
Работа со звуком в EZ-KIT Lite.
На плате EZ-KIT Lite установлен аудио кодек AD1836, который поддерживает 3 выходных стерео канала и 2 мультиканальных входа по 96 kHz. Последовательный порт процессора SPORT0 подключён к стерео входам и выходам кодека. Процессор может передавать данные на кодек в двух режимах: мультиплексная передача с временным разделением (TDM) или в режиме I2S. Режим I2S позволяет кодеку работать со звуком 96 kHz, но только с двумя выходными каналами. В режиме TDM можно работать со звуком 48 kHz, зато этот режим позволяет использовать все каналы входа и выхода одновременно. Для того чтобы работать в режиме I2S, необходимо замкнуть пины TSCLK0 и RSCLK0, а так же TFS0 и RFS0.
Внутренняя конфигурация регистров кодека AD1836 происходит через последовательный порт процессора SPI. Для этого необходимо установить флаг процессора PF4. Для более подробной информации о настройке мультиканального кодека читайте 344740003AD1836_prc.pdf. Для того чтобы сбросить кодек, используется пин регистра общего назначения PA0.
Для более подробного знакомства с особенностями работы с аудио кодеком смотрите текст программы Talkthru. Эта программа представляет собой пример работы с процессором ADSP-BF533. Она написана в двух вариантах: оба демонстрируют иницализацию связи между последовательным поротом процессора SPORT0 и кодеком AD1836, только первый вариант устанавливает связь с кодеком в режиме I2S, а второй в режиме TDM.
Информация о цифровых сигнальных процессорах
Более полную информацию о цифровых сигнальных процессорах вы можете найти, посетив сайт http://www.analog.com/dsp.
Информацию о программном обеспечении разработки проектов и процессорах производства компании Analog Devices можно найти в следующих изданиях:
• VisualDSP++ Users Guide for 16-Bit Processors
• VisualDSP++ C/C++ Compiler and Library Manual for Blackfin Processors
• VisualDSP++ Assembler
and Preprocessor Manual for Blackfin Processors
• VisualDSP++ Linker and Utilities Manual for 16-Bit Processors
• VisualDSP++ Kernel (VDK) Users Guide for 16-Bit Processor VisualDSP++ Component Software Engineering Users Guide for 16-Bit Processors
• ADSP-BF531/ADSP-BF532/ADSP-BF533 Embedded Processor Data Sheet
• ADSP-BF535 Embedded Processor Data Sheet
• ADSP-BF53x Blackfin Processor Instruction Set Reference
Пример программ
1. Функция main.
//--------------------------------------------------------------------------//
// Название: Talkthrough for the ADSP-BF533 EZ-KIT Lite //
//--------------------------------------------------------------------------//
// (C) Copyright 2003 - Analog Devices, Inc. Все права защищены. //
// Имя проекта: BF533 C Talkthrough TDM //
// Изменён: 04/03/03 HD Rev 1.0 //
// Переведён 25/05/04 shady@pisem.net //
// Программное обеспечение: VisualDSP++3.1 //
// Платформа: плата ADSP-BF533 EZ-KIT //
// Соединения: Подсоедините источник звука (например радио) в гнездо //
// аудио входа и наушники (колонки) в гнездо аудио выхода //
// Назначение: Эта программа инициализирует порт SPI на ADSP-BF533 для //
// того, чтобы настроить кодек AD1836. После инициализации //
// порт SPI отключается. Данные передаются в/из кодека //
// черед последовательный порт SPORT0 в режиме TDM //
//--------------------------------------------------------------------------//
#include "Talkthrough.h"
//--------------------------------------------------------------------------//
// Переменные //
// Описание: Переменные iChannelxLeftIn и iChannelxRightIn содержат //
// данные, поступающие из кодека AD1836. "Обработанные" //
// данные записываются в переменные iChannelxLeftOut и //
// iChannelxRightOut соответственно, и полсе пересылаются //
// обратно на кодек через SPORT0. //
// Значения в массиве iCodec1836TxRegs могут быть изменены //
// для того чтобы по-другому запрограммировать кодек //
// (см. описание кодека AD1885) //
//--------------------------------------------------------------------------//
// входные данные с левых каналов ad1836
int iChannel0LeftIn, iChannel1LeftIn;
// входные данные с правых каналов ad1836
int iChannel0RightIn, iChannel1RightIn;
// выходные данные для левых каналов ad1836
int iChannel0LeftOut, iChannel1LeftOut;
// выходные данные для правых каналов ad1836
int iChannel0RightOut, iChannel1RightOut;
//int iChannel0RightOut, iChannel1RightOut;
// массив регистров для настройки ad1836
// имена орпеделены в файле "Talkthrough.h"
volatile short sCodec1836TxRegs[CODEC_1836_REGS_LENGTH] =
{
DAC_CONTROL_1 | 0x000,
DAC_CONTROL_2 | 0x000,
DAC_VOLUME_0 | 0x3ff,
DAC_VOLUME_1 | 0x3ff,
DAC_VOLUME_2 | 0x3ff,
DAC_VOLUME_3 | 0x3ff,
DAC_VOLUME_4 | 0x000,
DAC_VOLUME_5 | 0x000,
ADC_CONTROL_1 | 0x000,
ADC_CONTROL_2 | 0x180,
ADC_CONTROL_3 | 0x000
};
// SPORT0 DMA буфер передачи
volatile int iTxBuffer1[8];
// SPORT0 DMA буфер входных данных
volatile int iRxBuffer1[8];
//--------------------------------------------------------------------------//
// Функция: main //
// Описание: После вызова нескольких инициализирующих процедур, main() //
// уходит в бесконечный цикл. Код обработки входных данных //
// можно записать в функцию Process_Data() в файле //
// "Process_Data.c". //
//--------------------------------------------------------------------------//
void main(void)
{
Init_EBIU();
Init_Flash();
Init1836();
Init_Sport0();
Init_DMA();
Init_Sport_Interrupts();
Enable_DMA_Sport0();
while(1);
}
2. Файл Initialise.
#include "Talkthrough.h"
//
// Функция: Init_EBIU //
// Описание: Эта функция инициализирует и включает банки асинхронной //
// памяти интерфейся внешней шины для доступа к памяти Flash A//
//--------------------------------------------------------------------------//
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}
//--------------------------------------------------------------------------//
// Функция: Init_Flash //
// Описание: Эта функция настраивает пины Port A памяти Flash A //
// на выход. Вход AD1836_RESET на плате ADSP-BF533 EZ-KIT //
// подключён к Port A. //
//--------------------------------------------------------------------------//
void Init_Flash(void)
{
*pFlashA_PortA_Dir = 0x1;
}
//--------------------------------------------------------------------------//
// Функция: Init1836() //
// Описание: Эта функция включает порт SPI port для настройки AD1836. //
// Содержимое массива sCodec1836TxRegs посылается в кодек //
//--------------------------------------------------------------------------//
void Init1836(void)
{
int i;
int j;
static unsigned char ucActive_LED = 0x01;
// пишем в Port A, чтобы сбросить AD1836
*pFlashA_PortA_Data = 0x00;
// пишем в Port A, чтобы включить AD1836
*pFlashA_PortA_Data = ucActive_LED;
// ждём, пока кодек перезагрузится после сброса
for (i=0; i<0xf000; i++);
// Устанавливаем флаг PF4
*pSPI_FLG = FLS4;
// Устанавливаем скороть передачи данных SCK = HCLK/(2*SPIBAUD) SCK = 2MHz
*pSPI_BAUD = 16;
// настраиваем spi порт
// SPI DMA запись, 16-битные данные, MSB первый, SPI мастер
*pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR;
// настраиваем DMA5 для передачи данных
// натраиваем DMA5 на SPI
*pDMA5_PERIPHERAL_MAP = 0x5000;
// 16-битная передача
*pDMA5_CONFIG = WDSIZE_16;
// Адрес начала буфера данных
*pDMA5_START_ADDR = sCodec1836TxRegs;
// размер внутреннего цикла DMA
*pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH;
// Инкремент адреса на каждом шаге внутреннего цикла
*pDMA5_X_MODIFY = 2;
// включаем DMA
*pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN);
// включаем spi
*pSPI_CTL = (*pSPI_CTL | SPE);
// ждём окончания DMA передачи в spi
for (j=0; j<0xaff; j++);
// отключаем spi
*pSPI_CTL = 0x0000;
}
//--------------------------------------------------------------------------//
// Функция: Init_Sport0 //
// Описание: Переводит Sport0 в режим TDM, для отправки/приёма данных //
// в/из AD1836. Настраиваем SPORT на внешние такты //
// синхронизации. //
//--------------------------------------------------------------------------//
void Init_Sport0(void)
{
// Sport0 конфигурация приёма
// Внешние такты (CLK), внешняя кадровая синхронизация, MSB первый,
// 32-битные данные
*pSPORT0_RCR1 = RFSR;
*pSPORT0_RCR2 = SLEN_32;
// Sport0 конфигурация передачи
// Внешние такты (CLK), внешняя кадровая синхронизация, MSB первый,
// 32-битные данные
*pSPORT0_TCR1 = TFSR;
*pSPORT0_TCR2 = SLEN_32;
// Настраиваем MCM 8 на каналы передачи и приёма
*pSPORT0_MTCS0 = 0x000000FF;
*pSPORT0_MRCS0 = 0x000000FF;
// Настраиваем регистр конфигурации MCM и влючаем режим MCM
*pSPORT0_MCMC1 = 0x0000;
*pSPORT0_MCMC2 = 0x101c;
}
//--------------------------------------------------------------------------//
// Функция: Init_DMA //
// Описание: Инициализирует DMA1 в режиме автоматического буфера для //
// приёма данных и DMA2 для передачи //
//--------------------------------------------------------------------------//
void Init_DMA(void)
{
// Настроим DMA1 на приём данных
// из Sport0 RX
*pDMA1_PERIPHERAL_MAP = 0x1000;
// Настройка DMA1
// 32-битная передача, прерывание при завершении, режим автобуфера
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;
// Адрес начала буфера данных
*pDMA1_START_ADDR = iRxBuffer1;
// размер внутреннего цикла DMA
*pDMA1_X_COUNT = 8;
// Инркремент адреса на каждом шаге внутреннего цикла
*pDMA1_X_MODIFY = 4;
// Настроим DMA2 на передачу данных
// в Sport0 TX
*pDMA2_PERIPHERAL_MAP = 0x2000;
// Настройка DMA2
// 32-битная передача, режим автобуфера
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
// Адрес начала буфера данных
*pDMA2_START_ADDR = iTxBuffer1;
// размер внутреннего цикла DMA
*pDMA2_X_COUNT = 8;
// Инкремент адреса на каждом шаге внутреннего цикла
*pDMA2_X_MODIFY = 4;
}
//--------------------------------------------------------------------------//
// Функция: Init_Interrupts //
// Описание: Инициализирует прерывание для Sport0 RX //
//--------------------------------------------------------------------------//
void Init_Sport_Interrupts(void)
{
// Устанавливаем приоритет прерывания Sport0 RX (DMA1) на 2 = IVG9
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffff2f;
*pSIC_IAR2 = 0xffffffff;
// назначаем ISR для векторов прерывания
// Sport0 RX ISR -> IVG 9
register_handler(ik_ivg9, Sport0_RX_ISR);
// включаем прерывание Sport0 RX
*pSIC_IMASK = 0x00000200;
ssync();
}
//--------------------------------------------------------------------------//
// Функция: Enable_DMA_Sport //
// Описание: Включает каналы DMA1, DMA2, порты Sport0 TX и Sport0 RX //
//--------------------------------------------------------------------------//
void Enable_DMA_Sport0(void)
{
// включаем DMA
*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN);
*pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN);
// открываем порты Sport0 TX и RX
*pSPORT0_TCR1 = (*pSPORT0_TCR1 | TSPEN);
*pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN);
}
PAGE 1