Руководство пользователя по сигнальным процессорам Sharc
.pdfЛинк-порты 9
/*________ Программа обработки прерывания буфера 2 линк-портов ___________*/
lp2_orig_slave:
/*__Разрешение задержки «подтягивания» к земле на выводе LxACK ведомого __*/
bit clr imask LSRQI; /*Запрещение прерывания запроса обслуживания линкпорта*/
r0=0x10;
dm(LSRQ)=r0; /* Демаскирование состояния запроса передачи lport0 в LSRQ */
r0=0x00000000; |
|
dm(LCTL)=r0; |
/* LCTL: блокировка всех LBUF */ |
disabled2: |
|
r0=dm(LSRQ); |
/* Проверка, чтобы гарантировать, что LxACK сброшен */ |
/*с помощью «подтягивающего» к земле резистора на его выводе */ |
|
r0=FEXT r0 BY 20:1; /* И первоначально */ |
|
r0=pass r0; |
/*ведомый, и первоначально ведущий будут */ |
if NE jump disabled2; /* синхронизированы. Следующее выставление LxACK */ /* будет указывать ведущему, что ведомый */ /* запрашивает маркер */
/*________________________________________________________________________*/
bit clr imask LP2I; |
/* Запрещение прерывания буфера 2 линк-портов */ |
r0=0x3fe3f; |
|
dm(LAR)=r0; |
/*Регистр LAR: LBUF2->Port 0 */ |
r0=0x00000100; |
|
dm(LCTL)=r0; |
/*разрешение LBUF2 (ведомый), без DMA */ |
bit clr mode1 NESTM; |
/*Запрещение вложенности прерываний, */ |
|
/*чтобы избежать срыва синхронизации */ |
r0=dm(LBUF2); |
/* Разрешения считывания маркера для ведущего */ |
/*Следующие строки – это проверка, является ли первое слово после DMA словом*/ /* освобождения маркера. Если нет, ведомый считывает другие фиктивные слова */ /*и продолжает оставаться ведомым. Если это – слово освобождения маркера, */ /*ведущий продолжает передавать, а ведомый будет решать, */ /* примет ли он это слово */
r1=trw; |
/*Слово освобождения маркера |
*/ |
||
r0 |
= r0 - r1; |
/*Проверка принимаемого слова |
и установка флага ALU */ |
|
if |
NE jump second_slave_mode; |
/* Нет разрешения передачи маркера */ |
||
nop;
341
9 Линк-порты
nop;
/*Следующие 3 строки показывают, как отклонить маркер */ /* Если их закомментировать, этот ведомый станет ведущим */
/*Если их не комментировать, этот ведомый останется ведомым */
LCNTR=20, DO reject_token UNTIL LCE; reject_token: nop;
jump second_slave_mode;
nop; |
/* Задержка считывания приходящего сообщения */ |
nop; |
|
master_mode: |
|
r0=dm(LBUF2); |
/* Считывание 3 раза, чтобы очистить */ |
r0=dm(LBUF2); |
/* LBUF предыдущего ведущего. Т. о., предыдущий ведущий */ |
r0=dm(LBUF2); |
/* освободит маркер */ |
/*_________Защита от одновременной передачи двумя линк-портами _________*/
bit clr imask LSRQI; /* Запрет прерывания запроса обслуживания линк-порта */
r0=0x10;
dm(LSRQ)=r0; /* Демаскирование состояния запроса передачи lport в LSRQ */
r0=0x00000000; |
|
|
dm(LCTL)=r0; |
/* LCTL: блокировка всех LBUF */ |
|
disabled3: |
|
|
r0=dm(LSRQ); |
/* Проверка, чтобы гарантировать, что LxACK сброшен */ |
|
/*с помощью «подтягивающего» к земле резистора на его выводе */ |
||
r0=FEXT r0 BY 20:1; /* И первоначальный ведомый, */ |
||
r0=pass r0; |
/* и первоначальный ведущий будут синхронизированы */ |
|
if NE jump disabled3; |
/* Следующее выставление LxACK будет указывать */ |
|
|
|
/* ведущему, что ведомый запрашивает маркер. */ |
slave_enabled: |
|
|
r0=dm(LSRQ); |
/*Проверка, чтобы гарантировать, что первоначальный */ |
|
r0=FEXT r0 BY 20:1; |
/* ведущий стал ведомым, увидев, что */ |
|
r0=pass r0; |
/* выставление LxACK сгенерировало LxRRQ */ |
|
if EQ jump slave_enabled;
/*________________________________________________________________________*/
r0=0x3f1ff; |
|
|
dm(LAR)=r0; |
/*Регистр LAR: LBUF3->Port |
0 */ |
r0=0x00009000; |
|
|
dm(LCTL)=r0; |
/* Разрешение LBUF3 без DMA */ |
|
r0=@source_3; |
/*Размер блока для передачи по DMA */ |
|
dm(LBUF3)=r0; |
/*Посылка размера блока DMA */ |
|
342
Линк-порты 9
r0=0xc0; |
|
|
wait: r1=dm(LCOM); |
/*Проверка, пуст ли LBUF3 */ |
|
r0=r0 AND r1; |
|
|
if NE jump wait; |
|
/* Если размер DMA не верен, ожидание */ |
nop; |
|
|
r0=source_3; |
|
|
dm(II5)=r0; |
|
/* Установка индекса DMA на начало буфера источника */ |
r0=1; |
|
|
dm(IM5)=r0; |
|
/*Установка модификатора в 1 */ |
r0=@source_3; |
|
|
dm(C5)=r0; |
/*Установка счетчика DMA равным длине буфера данных */ |
|
r0=0x0000b000; /*Регистр LCTL: 32-разрядные данные, */ /*LBUF3 настроен на передачу */
dm(LCTL)=r0; |
/*Разрешение DMA |
â |
LBUF3 |
*/ |
/*Это начало передачи по DMA */ |
|
|
|
|
/* Всегда записывайте LCTL |
после |
LAR */ |
||
bit clr irptl LP3I;/*Очистка отложенного прерывания буфера 3 линк-портов */ bit set imask LP3I; /*Разрешение прерывания буфера 3 линк-портов */
rti;
second_slave_mode:
r0=dm(LBUF2); |
/* Считывание 3 раза, чтобы очистить */ |
r0=dm(LBUF2); |
/* LBUF предыдущего ведущего. Т. о., предыдущий ведущий */ |
r0=dm(LBUF2); |
/* освободит маркер */ |
r0=0x3f1ff; |
|
dm(LAR)=r0; |
/*Регистр LAR: LBUF3->Port 0 */ |
r0=0x00001000; |
|
dm(LCTL)=r0; |
/*Разрешение LBUF3 без DMA */ |
r1=dm(LBUF3); /*Считывание нового размера блока, передаваемого по DMA */ r0=destination_2;
dm(II5)=r0; |
/*Установка индекса DMA на начало буфера адресата */ |
r0=1; |
|
dm(IM5)=r0; |
/*Установка модификатора в 1 */ |
r0=@destination_2; |
|
dm(C5)=r1; |
/*Реальный размер блока DMA должен быть взят из ведущего */ |
r0=0x00003000; |
/*Регистр LCTL:32-разрядные данные, */ |
/* LBUF3 настроен для приема */ |
|
dm(LCTL)=r0; |
/*Разрешение DMA в LBUF3 */ |
/*Это начало передачи по DMA */
/* Всегда записывайте LCTL после LAR */
343
9 Линк-порты
bit |
clr |
irptl LP3I;/*Очистка отложенного прерывания буфера 3 линк-портов */ |
|
bit |
set |
imask LP3I; |
/* Разрешение прерывания буфера 3 линк-портов */ |
rti;
/*_____________Начало программы первоначально ведомого _______________*/
start_as_slave: |
|
r0=destination_1; |
|
dm(II4)=r0; |
/* Установка индекса DMA на начало буфера адресата */ |
r0=1; |
|
dm(IM4)=r0; |
/* Установка модификатора DMA (шаг) в 1 */ |
r0=@destination_1; |
|
dm(C4)=r0; |
/* Реальный размер DMA должен быть взят из ведущего */ |
r0=0xc000; |
/*Регистр LCOM: удвоенная частота, */ |
dm(LCOM)=r0; /*Замечание: используйте r0=0x10000 для */ |
|
/*версии кристалла 0.х */ |
|
/* первоначально: 0x0000c000 */ |
|
r0=0x3fe3f; |
/*Регистр LAR: LBUF2->Port 0 */ |
dm(LAR)=r0; |
/*Все остальные неактивны */ |
bit set imask LP2I; |
|
/*Разрешение прерывания буфера 2 линк-портов */ |
bit set mode1 IRPTEN; |
/* Глобальное разрешение прерываний */ |
|
r0=0x00000300; |
/*Регистр LCTL:32-разрядные данные, /* |
|
/* LBUF2 настроен для приема */ |
||
dm(LCTL)=r0; |
/* Разрешение DMA в LBUF2 */ |
|
/*Это – начало передачи DMA */ |
||
/* Всегда записывайте LCTL после LAR */ |
||
wait_2: idle; |
|
/*Ожидание прерывания буфера 2 линк-портов */ |
jump wait_2; /* Здесь окончание после выполнения DMA */ |
||
nop; |
/*Все прерывания ведомого возвращаются сюда */ |
|
nop; |
|
|
.ENDSEG;
344
Последовательные порты
10
10.1. Обзор
ADSP 2106x имеет два независимых синхронных последовательных порта SPORT0 и SPORT1, которые обеспечивают интерфейс ввода вывода (I/O) с различными периферийными устройствами. Каждый последовательный порт имеет собственные регистры управления и буферы данных. Возможность использования различных вариантов тактовой и кадровой синхронизации позволяет поддерживать ряд протоколов обмена данными через последовательный порт и обеспечивать аппаратный интерфейс со многими преобразователями данных и кодеками промышленного стандарта.
Каждый последовательный порт может работать на полной тактовой частоте процессора, поддерживая скорость передачи данных n Мбит/с, где n – тактовая частота процессора. Возможность независимых приема и передачи данных обеспечивает значительную гибкость при организации коммуникаций через последовательные порты. Данные последовательного порта могут автоматически передаваться во внутреннюю память и из нее с использованием режима передачи с прямым доступом к памяти (DMA – Direct Memory Access). Каждый последовательный порт поддерживает многоканальный режим с временным разделением каналов (TDM – Time Division Multiplexing).
Сигналы тактовой и кадровой синхронизации последовательного порта могут генерироваться внутри процессора или приниматься от внешнего источника. Последовательные порты могут работать с длиной слова от 3 до 32 бит и с различными форматами передачи данных: передача начинается со старших бит или с младших. Они обеспечивают различные режимы синхронизации и передачи, а также компандирование по m закону или А закону.
Последовательные порты имеют следующие характеристики:
♦независимые функции приема и передачи;
♦передача слов данных длиной до 32 бит, начиная со старших бит или с младших бит;
♦двойная буферизация данных – в каждой части последовательного порта (и принимающей и передающей) имеется регистр данных, а также регистр
345
10 Последовательные порты
сдвига; двойная буферизация сокращает время обслуживания последовательного порта;
♦аппаратное компандирование принимаемых и передаваемых данных по µ закону и А закону;
♦сигналы тактовой и кадровой синхронизации могут генерироваться внутри процессора в широком диапазоне частот или приниматься от внешнего источника;
♦управляемые прерываниями передачи одиночных слов данных во внутреннюю память и из нее, которые контролируются ядром процессора ADSP 2106x;
♦передачи по DMA во внутреннюю память и из нее – каждый SPORT может автоматически принимать и/или передавать целый блок данных;
♦цепочка операций DMA для передачи нескольких блоков данных;
♦многоканальный режим с временным разделением каналов – каждый SPORT может избирательно принимать и передавать данные из потока последовательно передаваемых бит с использованием временного разделения каналов; этот режим полезен для интерфейсов Т1.
В табл. 10.1 приведены сигнальные выводы для каждого последовательного порта:
Функция |
Выводы SPORT0 |
Выводы SPORT1 |
Передача данных |
DT0 |
DT1 |
Сигнал тактовой синхронизации передачи |
TCLK0 |
TCLK1 |
Сигнал кадровой синхронизации передачи |
TFS0 |
TFS1 |
Прием данных |
DR0 |
DR1 |
Сигнал тактовой синхронизации приема |
RCLK0 |
RCLK1 |
Сигнал кадровой синхронизации приема |
RFS0 |
RFS1 |
Таблица 10.1. Выводы последовательного порта
Последовательный порт принимает последовательно передаваемые данные на входе DR и последовательно передает данные на выходе DT. Работая в дуплексном режиме, он может одновременно принимать и передавать данные.
Связь через последовательный порт синхронизируется сигналом тактовой синхронизации – каждый бит данных должен сопровождаться импульсом тактовой синхронизации. Каждый последовательный порт может генерировать или принимать собственный сигнал тактовой синхронизации передачи (TCLK) и принимать сигнал тактовой синхронизации приема (RCLK). Частота сигнала тактовой синхронизации, генерируемого процессором самостоятельно, задается в регистрах TDIV и RDIV.
346
Последовательные порты 10
Помимо этого, данные могут передаваться с использованием сигнала кадровой синхронизации. Сигнал кадровой синхронизации может генерироваться либо в начале передачи или приема отдельного слова данных, либо в начале блока слов. Выбор вида генерации сигнала кадровой синхронизации зависит от типа устройства, подключенного к ADSP 2106х через последовательный порт. Каждый последовательный порт может генерировать или принимать собственный сигнал кадровой синхронизации передачи (TFS) и сигнал кадровой синхронизации приема (RFS). Частота внутреннего сигнала кадровой синхронизации задается в регистрах TDIV и RDIV.
На рис. 10.1 изображена блок схема последовательного порта. Данные, предназначенные для передачи, записываются в буфер TX. Эти данные сжимаются (опционально) в схеме компандирования, а затем автоматически пересылаются в передающий регистр сдвига. Из регистра сдвига данные сдвигаются на вывод DT последовательного порта синхронно с сигналом TCLK. Если используется кадровая синхронизация, то сигнал TFS указывает на начало побитовой передачи каждого слова данных. Если последовательный порт активизирован (SPEN=1 в регистре управления STCTL), вывод DT всегда управляется, т. е. не переводится в третье состояние. Исключением является работа последовательного порта в многоканальном режиме. Когда канал не
Рис. 10.1. Блок-схема последовательного порта
347
10 Последовательные порты
используется для передачи, то вывод DT находится в третьем состоянии (см. раздел 10.7 «Работа в многоканальном режиме»).
В приемной части SPORT данные сдвигаются с выхода DR синхронно с сигналом RCLK. При использовании кадровой синхронизации сигнал RFS указывает на начало принимаемого слова данных. После приема целого слова данные расширяются (опционально), а затем автоматически передаются в буфер RX.
Примечание: SPORT ADSP 2106х не является универсальным асинхронным приемопередатчиком (UART) и не может использоваться для связи с устройствами стандарта RS 232 или использовать любые другие протоколы асинхронной связи. Однако, существует один способ реализовать связь ADSP 2106 х с устройствами стандарта RS 232. В этом случае два вывода FLAG можно использовать как асинхронные сигналы приема и передачи данных. Пример реализации этого способа рассмотрен в главе Программирование UART в Digital Signal Processing Applications Using The ADSP 2100 Family, Volume 2.
10.1.1. Прерывания SPORT
Каждый последовательный порт генерирует прерывание передачи по DMA и прерывание приема по DMA. Когда режим DMA через последовательный порт запрещен, прерывания генерируются для каждого принимаемого и передаваемого слова данных. Приоритет прерываний последовательного порта приведен в табл. 10.2.
Имя прерывания* |
Прерывание |
|
|
SPR0I |
0 |
канал DMA, прием через SPORT0 |
ВЫСШИЙ ПРИОРИТЕТ |
SPR1I |
1 |
канал DMA, прием через SPORT1 |
|
SPT0I |
2 |
канал DMA, передача через SPORT0 |
|
SPT1I |
3 |
канал DMA, передача через SPORT1 |
НИЗШИЙ ПРИОРИТЕТ |
*Эти имена определены в заголовочном файле def21060.h, поставляемом с программным обеспечением для процессоров семейства ADSP 21000.
Таблица 10.2. Прерывания SPORT
Прерывания SPORT генерируются во втором цикле тактовой синхронизации после того, как последний бит слова зафиксирован или выведен.
10.2. Сигнал сброса последовательного порта
Существует два способа перевода последовательных портов в состояние сброса: аппаратный сброс, использующий вывод процессора
, и программный сброс, когда обнуляется бит активизации последовательного порта (SPEN) в
348
Последовательные порты 10
регистрах управления STCTL и SRCTL. Каждый способ по разному влияет на последовательный порт.
Аппаратный сброс блокирует последовательные порты, обнуляя все биты регистров управления STCTL и SRCTL (включая бит активизации SPEN) и регистров деления частоты кадровой синхронизации TDIV и RDIV. Все выполняющиеся операции прерываются.
Программный сброс с помощью бита SPEN блокирует последовательные порты и прерывает все выполняющиеся операции. Также обнуляются биты состояния.
Последовательные порты будут готовы к началу передачи и приема данных через два процессорных цикла после того, как они будут активизированы (в регистрах управления STCTL и SRCTL).
10.3. Регистры управления и буферы данных SPORT
Регистры, которые используются для управления и задания конфигурации последовательного порта, являются частью набора регистров устройства ввода вывода (Input Output Processor – IOP). Каждый SPORT имеет собственный набор регистров управления и буферов данных:
Название
регистра*
STCTLx TXx TDIVx
MTCSx
MTCCSx
SRCTLx
RXx
RDIVx
MRCSx
MRCCSx
SPATHx
KEYWDx KEYMASKx * x=0,1
** только в ADSP 21061
349
10 Последовательные порты
В табл. 10.3 приведены адреса отображенных в карте памяти регистров SPORT и их содержимое при инициализации после сброса. Все регистры 32 разрядные, за исключением 16 разрядного регистра SPATH и ячейки 0xFFFF (Заметим, что для обычной работы последовательного порта (не в режиме многопроцессорной сети) значения регистра SPATH и ячейки 0xFFFF должны оставаться равными значениям инициализации после сброса, т. е. 0х0001).
Программирование регистров управления SPORT осуществляется путем записи значений по соответствующему адресу в памяти. Символические имена регистров и отдельных битов управления могут использоваться в программах ADSP 2106х – определения #define этих имен содержатся в заголовочном файле def21060.h, который находится в каталоге INCLUDE Программного обеспечения процессоров семейства ADSP 21000. Файл def21060.h приведен в приложении Регистры управления/состояния этого руководства. Все биты управления и состояния считаются активными, если равны 1 (если другой вариант не оговаривается специально).
Адрес |
Название |
Инициализация Определение |
|
памяти |
регистра |
после сброса |
|
0x00E0 |
STCTL0 |
0x0000 0000 |
Регистр управления передачей SPORT0 |
0x00E1 |
SRCTL0 |
0x0000 0000 |
Регистр управления приемом SPORT0 |
0x00E2 |
TX0 |
ni |
Буфер передачи данных SPORT0 |
0x00E3 |
RX0 |
ni |
Буфер приема данных SPORT0 |
0x00E4 |
TDIV0 |
ni |
Коэффициент деления частот тактовой и кадровой |
|
|
|
синхронизации при передаче через SPORT0 |
0x00E5 |
|
|
Зарезервирован |
0x00E6 |
RDIV0 |
ni |
Коэффициент деления частот тактовой и кадровой |
|
|
|
синхронизации при приеме через SPORT0 |
0x00E7 |
|
|
Зарезервирован |
0x00E8 |
MTCS0 |
ni |
Выбор режима многоканальной передачи SPORT0 |
0x00E9 |
MRCS0 |
ni |
Выбор режима многоканального приема SPORT0 |
0x00EA |
MTCCS0 |
ni |
Выбор компандирования в режиме многоканальной |
|
|
|
передачи через SPORT0 |
0x00EB |
MRCCS0 |
ni |
Выбор компандирования в режиме |
|
|
|
многоканального приема через SPORT0 |
0x00EC |
KEYWD |
ni |
Сравнение при приеме через SPORT0 (ADSP 21061) |
0x00ED |
KEYMASKni |
Маска сравнения при приеме через SPORT0 |
|
|
|
|
(ADSP 21061) |
0x00EE |
SPATH0 |
0x0001 |
Длина пути SPORT0 (для многопроцессорной сети) |
0x00EF |
|
0x0001 |
Зарезервирован |
0x00F0 |
STCTL1 |
0x0000 0000 |
Регистр управления передачей SPORT1 |
0x00F1 |
SRCTL1 |
0x0000 0000 |
Регистр управления приемом SPORT1 |
0x00F2 |
TX1 |
ni |
Буфер передачи данных SPORT1 |
0x00F3 |
RX1 |
ni |
Буфер приема данных SPORT1 |
0x00F4 |
TDIV1 |
ni |
Коэффициент деления частот тактовой и кадровой |
|
|
|
синхронизации при передаче через SPORT1 |
350
