Руководство пользователя по сигнальным процессорам Sharc
.pdfПоследовательные порты 10
Врежиме циклической передачи сигналы DRx, RCLKx и RFSx приемной части SPORT подключаются внутри к сигналам DTx, TCLKx и TFSx передающей части. Сигналы DTx, TCLKx и TFSx активны и доступны на соответствующих выводах, в то время как выводы DRx, RCLKx и RFSx игнорируются ADSP 2106x.
Врежиме циклической передачи могут использоваться только опции тактовой и кадровой синхронизации передачи – вы должны гарантировать, что установки последовательного порта в регистрах управления STCTLx и SRCTLx сделаны правильно. Многоканальный режим запрещен.
10.10. Устройства на выводах SPORT
ADSP 2106x имеет быстродействующие устройства на всех выходах, включая последовательные порты. Если линии, соединяющие выводы данных, сигналов тактовой и кадровой синхронизации, длиннее шести дюймов, вы должны использовать последовательно включенную нагрузку на этих линиях при соединении по схеме «точка к точке». Это может понадобиться даже при использовании более низкой частоты тактовой синхронизации последовательного порта из за растягивания фронтов.
10.11. Примеры программирования SPORT
Существует три способа управления связью через последовательный порт и передачей данных между памятью и SPORT: передача одного слова данных, управляемая ядром процессора без прерываний, передача одного слова данных, управляемая ядром процессора с прерываниями, и передача по DMA с прерываниями. Ниже приведены три примера, которые иллюстрируют каждый из этих методов. В каждом примере SPORT используется для передачи восьми 32 разрядных слов из буфера данных во внутренней памяти.
Любая из трех схем управления может использоваться в многоканальном режиме, а также при любых опциях кадровой и тактовой синхронизации.
10.11.1. Передачи одного слова данных без прерываний
Ядро процессора ADSP 2106x будет остановлено (т. е. зависнет) при попытке записи данных в полный буфер ТХ или чтения данных из пустого буфера RX. Это дает очень простой метод управления последовательным портом – путем размещения в цикле команды, которая записывает данные в ТХ или считывает
381
10 Последовательные порты
данные из RX. Выполнение программы будет остановлено на этой команде до тех пор, пока SPORT не будет готов передавать или принимать новые данные.
В листинге 10.1 приведен код для этого примера, в котором устанавливается цикл для передачи данных из SPORT0. Такая методика обеспечивает очень простое программное решение, но ядро процессора ADSP 2106x не может выполнять обработку любых других задач при ожидании завершения операций последовательного порта. Решение этой проблемы возможно при использовании метода управляемой прерываниями передачи данных, описанного в следующем разделе.
/*__________________________________________________________________________
Пример передачи SPORT: Используется свойство зависания ядра ADSP-2106x при попытке записи в полный регистр ТХ. В этом примере устанавливается цикл для передачи данных в буфер памяти «source».
__________________________________________________________________________*/
#define N 8
#include “def21060.h” /* Использование символических имен регистров. */
.segment/dm dm32_b1;/*Название сегмента данных описано в файле архитектуры. */
.var source[N]= 0x11111111, 0x22222222, 0x33333333, 0x44444444,
0x55555555, |
0x66666666, |
0x77777777, |
0x88888888; |
.endseg; |
|
|
|
.segment/pm |
rst_svc; /* Вектор сброса из файла архитектуры. */ |
||
nop; |
/* Первая ячейка используется для начальной загрузки. */ |
||
jump start; |
|
|
|
.endseg; |
|
|
|
/*______________________основная программа_______________________________ */
.segment/pm pm48_1b0; |
/*Основной сегмент кода из файла архитектуры. */ |
|
start: r0=0x00270007; |
|
/* Регистр TDIV0: TCLKDIV=7,TFSDIV=39, */ |
dm(TDIV0)=r0; |
|
/* частота тактовой синхронизации */ |
|
|
/*последовательного порта sclock=CLKIN/8,*/ |
|
|
/* частота кадровой синхронизации=sclock/20. */ |
r0=0x000064f1; |
/* Регистр STCTL0: */ |
|
dm(STCTL0)=r0; /* |
SPEN=1( активизация SPORT),*/ |
|
|
/* SLEN=15 (16-разрядное слово),*/ |
|
|
/* |
ICLK=1 (внутренняя генерация сигнала */ |
|
/* |
тактовой синхронизации для tx),*/ |
|
/* |
TFSR=1 (требуется TFS),*/ |
|
/* |
ITFS=1 (внутренняя генерация TFS),*/ |
|
/* |
DITFS=0(зависящий от данных сигнал TFS),*/ |
|
/* все другие биты = 0. */ |
|
b0=source; |
/* |
Указатель на источник; i0=b0 автоматически. */ |
l0=@source; |
|
|
lcntr=N, do tx_loop until lce;
382
Последовательные порты 10
r0=dm(i0,1); |
/* Получение данных из буфера источника. */ |
tx_loop: dm(TX0)=r0; |
/* Запись в регистр передачи, */ |
|
/* ядро процессора ожидает, когда */ |
|
/* буфер вывода SPORT станет полным. */ |
idle; |
|
.endseg; |
|
Листинг 10.1 Передача через последовательный порт без прерываний (передача одного слова данных)
10.11.2. Передача одного слова данных с управлением прерываниями
Хотя метод передачи данных последовательным портом без прерываний в предыдущем примере обеспечивает очень простую схему управления, он не предусматривает обработку других дополнительных задач ядром процессора ADSP 2106x во время остановки. В большинстве приложений, работающих в реальном режиме времени, процессор должен обрабатывать данные во время приема новых данных. Возможно, между передачами данных потребуется выполнять фоновые задачи.
Следовательно, в большинстве систем процессор должен иметь возможность постоянно выполнять программу. При этом можно использовать прерывания приема и передачи последовательного порта, которые происходят только тогда, когда было принято новое слово данных или когда новое слово данных может быть передано. По прерыванию программа обработки прерывания выполняет передачу данных между внутренней памятью и буфером RX или ТХ последовательного порта.
В листинге 10.2 приведен код примера для этого случая. Заметим, что здесь используется прерывание канала DMA при передаче через SPORT0 (SPT0I). Когда DMA через последовательный порт заблокирован, это прерывание становится прерыванием передачи одного слова данных.
/*__________________________________________________________________________
Пример управляемой прерываниями передачи ADSP-2106x через SPORT:
В этом примере прерывания используются для сообщения ядру процессора, что для передачи через последовательный порт 0 требуются новые данные. Передается содержимое буфера «source».
___________________________________________________________________________*/
#define N 8 |
|
|
#include “def21060.h” |
/* |
Использование символических имен регистров. */ |
.segment/dm dm32_b1; |
/* |
Имя сегмента данных описано в файле архитектуры. */ |
.var source[N]= 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888;
383
10 Последовательные порты
.endseg; |
|
|
.segment/pm |
rst_svc; |
/* Вектор сброса из файла архитектуры .*/ |
nop; |
/* Первая ячейка используется для начальной загрузки. */ |
|
jump start; |
|
|
.endseg; |
|
|
.segment/pm |
spt0_svc; |
/* Вектор прерывания tx Sport0. */ |
jump s0tx; |
|
|
.endseg; |
|
|
/*_________________________ основная программа _________________________*/
.segment/pm pm48_1b0; |
/*Основной сегмент кода из файла архитектуры. */ |
||
start: |
r0=0x00270007; /* Регистр TDIV0 : TCLKDIV=7,TFSDIV=39, */ |
||
|
dm(TDIV0)=r0; |
|
/* частота тактовой синхронизации */ |
|
|
/*последовательного порта sclock=CLKIN/8,*/ |
|
|
|
/* частота кадровой синхронизации=sclock/20. */ |
|
|
r0=0x000064f1; /* Регистр STCTL0: */ |
||
|
dm(STCTL0)=r0; /* SPEN=1 (активизация SPORT),*/ |
||
|
|
/* SLEN=15 (16-разрядное слово),*/ |
|
|
|
/* ICLK=1 (внутренняя генерация сигнала */ |
|
|
|
/* тактовой синхронизации для tx),*/ |
|
|
|
/* TFSR=1 (требуется TFS),*/ |
|
|
|
/* ITFS=1 (внутренняя генерация TFS),*/ |
|
|
|
/* DITFS=0(зависящий от данных сигнал TFS),*/ |
|
|
|
/* все другие биты = 0. */ |
|
|
b0=source; |
/*Указатель на источник; i0=b0 автоматически. */ |
|
|
l0=@source; |
|
|
|
bit set imask SPT0I; |
/* Разрешение прерывания TX Sport0.*/ |
|
|
bit set mode1 IRPTEN; |
/* Глобальное разрешение прерываний. */ |
|
|
r0=dm(i0,1); /*Запись первого значения в буфер TX0 начинает */ |
||
|
/* передачу через SPORT.*/ |
||
|
dm(TX0)=r0; |
|
|
wait: |
idle; |
/* Ожидание прерывания TX SPORT0.*/ |
|
|
jump wait; |
|
|
/* _________Программа обработки прерывания передачи SPORT0 _______________*/
S0tx: rti (db);
R0 = dm (i0,1); /* Получение данных из буфера «source». */ Dm (TX0) = r0; /* Запись в регистр передачи. */
.endseg;
Листинг 10.2. Управляемая прерываниями передача через SPORT (передача одного слова данных)
384
Последовательные порты 10
10.11.3. Передачи по DMA с прерываниями
Вэтом примере показано, как контроллер DMA ADSP 2106x используется для управления вводом выводом через последовательный порт. Контроллер DMA выполняет передачу данных между внутренней памятью и последовательными портами, обеспечивая наиболее эффективный способ управления вводом и выводом блоков слов данных. После произведенной один раз настройки передачи контроллер DMA работает независимо от ядра процессора ADSP 2106х. Его прерывание генерируется только тогда, когда принимается или передается весь блок данных. Это освобождает ядро процессора для выполнения других задач.
Влистинге 10.3 приведен код примера для этого случая, в котором используется режим циклической передачи последовательного порта. Сначала программа инициализирует каналы DMA SPORT1, загружая значения в регистры параметров DMA, затем записывает в регистры SRCTL1 и STCTL1 и ожидает прерывание.
/* _______________________________________________________________________
Пример управляемой прерываниями передачи по DMA через SPORT в циклическом режиме:
В этом примере инициализируется передача и прием по DMA через последовательный порт 1 в режиме циклической передачи. Содержимое буфера «source» передается посредством DMA через последовательный порт. В режиме циклической передачи DT1, TFS1, и TCLK1 подключаются внутри к DR1, RFS1 и RCLK1. При приеме по DMA данные помещаются в буфер «destination».
________________________________________________________________________*/
#define N 8 |
|
|
|
|
#include “def21060.h” |
/* Использование символических имен регистров */ |
|||
.segment/dm |
dm32_b1; |
/* Имя сегмента данных описано в файле архитектуры. */ |
||
.var source[N]= 0x11111111, 0x22222222, 0x33333333, 0x44444444, |
||||
0x55555555, |
0x66666666, |
0x77777777, |
0x88888888; |
|
.var destination[N]; |
|
|
|
|
.endseg; |
|
|
|
|
.segment/pm |
rst_svc; |
/* Вектор сброса из файла архитектуры. */ |
||
nop; |
/* Первая ячейка используется для начальной загрузки. */ |
|||
jump |
start; |
|
|
|
.endseg; |
|
|
|
|
.segment/pm |
spr1_svc; |
|
/* Вектор прерывания rx SPORT1.*/ |
|
jump s1rx;
.endseg;
/*________________________ Основная программа ________________________*/
.segment/pm pm48_1b0; /* Основной сегмент кода из файла архитектуры .*/
start: r0=source;
dm(II3)=r0; /* Установка индекса tx DMA в начало буфера «source». */
385
10 Последовательные порты
r0=destination;
dm(II1)=r0;/*Установка индекса rx DMA в начало буфера «destination».*/ r0=1;
dm(IM3)=r0; /* Установка модификатора DMA (шага) в 1.*/ dm(IM1)=r0;
r0=@source;
dm(C3)=r0; /* Установка счетчика DMA в значение длины буфера данных.*/ dm(C1)=r0;
r0=0x004421f1; /* Регистр SRCTL1: */ dm(SRCTL1)=r0; /* SPEN=1 (Активизация SPORT1),*/
/* SLEN=31(32-разрядное слово),*/ /* RFSR=1 (требуется RFS),*/
/* SDEN=1 (разрешение rx DMA),*/
/* SPL=1 (подключение DT к DR и TFS к RFS),*/
r0=0x00270007; /* Регистр TDIV0: TCLKDIV=7, TFSDIV=39,*/
dm(TDIV1)=r0; |
/* частота тактовой синхронизации */ |
||
|
/*последовательного |
порта sclock=CLKIN/8,*/ |
|
|
/* частота кадровой синхронизации=sclock/20. */ |
||
r0=0x000465f1; |
/* Регистр STCTL1: */ |
||
dm(STCTL1)=r0; /* SPEN=1 (Активизация SPORT1),*/ |
|||
|
/* SLEN=31(32-разрядное слово),*/ |
||
|
/* ICLK=1 (внутренняя генерация сигнала */ |
||
|
/* тактовой синхронизации для tx), */ |
||
|
/* TFSR=1 (требуется TFS),*/ |
||
|
/* ITFS=1 (внутренняя генерация TFS),*/ |
||
|
/* DITFS=0(зависящий от данных сигнал TFS),*/ |
||
|
/* все другие биты равны 0.*/ |
||
|
/* SDEN=1 (разрешение tx DMA). */ |
||
|
/* это начало передачи по DMA. */ |
||
bit set imask SPR1I; |
|
/* Разрешение прерывания rx SPORT1. */ |
|
bit set mode1 IRPTEN; |
|
/* Глобальное разрешение прерываний. */ |
|
wait: idle; |
|
/* Ожидание прерывания SPORT1 rx. */ |
|
jump wait; |
/* Окончание здесь после завершения передачи /* |
||
|
|
/* ïî |
DMA всего блока данных. */ |
/*____________Программа обработки прерывания приема SPORT1 _______________*/ |
|||
s1rx: rti; |
/* Это прерывание произойдет только один раз. */ |
||
.endseg; |
|
|
|
Листинг 10.3. Пример передачи по DMA через SPORT
386
Проектирование системы
11
11.1. Обзор
В этой главе приведена информация об аппаратном и программном обеспечении и проектировании системы, в которой используются процессоры ADSP 2106x.
11.2. Выводы ADSP-2106x
В этом разделе описаны выводы ADSP 2106x и их использование в системе. На рис. 11.1 показано использование выводов в однопроцессорной системе. На рис. 7.1 в главе Многопроцессорная система изображена структурная схема системы и соединение выводов ADSP 2106x в многопроцессорном кластере.
11.2.1. Описание выводов
Список выводов ASDP 2106x приведен ниже. В процессорах ADSP 21060 и ADSP 21062 все выводы идентичны. Входные сигналы, определенные как синхронные (S), должны удовлетворять требованиям синхронизации относительно сигнала CLKIN (или ТСК для TMS, TDI). Входные сигналы, определенные как асинхронные (А), могут выставляться асинхронно CLKIN
(или ТСК для
).
Неиспользуемые выводы должны быть подключены к питанию или к земле, за исключением выводов ADDR31 0, DATA47 0, FLAG3 0,
и выводов, которые
имеют внутренние «подтягивающие» к питанию или к земле резисторы (
,
АСК, DTx, DRx, TCLKx, RCLKx, LxDAT3 0, LxCLK, LxACK, TMS, TDI), – эти выводы должны оставаться неподключенными. На этих выводах имеются схемы удержания логического уровня, которые предотвращают внутренний дрейф сигналов.
I=вход |
S=синхронный |
Р=питание |
(o/d)=с открытым стоком (open drain) |
O=выход |
А=асинхронный |
G=земля |
(a/d)=активный управляющий (active drive) |
Т=третье состояние (когда выставлен
или когда ADSP 2106x – ведомый)
387
11 Проектирование системы
Рис. 11.1. Основная система ADSP-2106x
Вывод Тип Функция
ADDR31 0 I/O/T Внешняя шина адреса (External Bus Address). По этим выводам процессор выводит адреса для внешней памяти и периферийных устройств. В многопроцессорной системе ведущий процессор выводит адреса для чтения/записи внутренней памяти или регистров устройства ввода вывода (IOP) других ADSP 2106x. ADSP 2106x принимает адреса, когда хост процессор или ведущий в многопроцессорной системе считывает или записывает его внутреннюю память или регистры IOP.
388
Проектирование системы 11
DATA47 0 I/O/T |
Внешняя шина данных (External Bus Data). По этим выводам |
|
|
процессор получает и выводит данные и команды. 32 |
|
|
разрядные данные с фиксированной точкой одиночной |
|
|
точности и 32 разрядные данные с плавающей точкой |
|
|
передаются битами 47 16 шины. 40 разрядные данные с |
|
|
фиксированной точкой повышенной точности передаются |
|
|
битами 47 8 шины. 16 разрядные короткие слова данных |
|
|
передаются битами 31 16. В режиме начальной загрузки из |
|
|
EPROM 8 разрядные данные передаются битами 23 16. |
|
|
«Подтягивающие» резисторы на неиспользуемые выводы |
|
|
DATA не нужны. |
|
O/T |
Линии выбора памяти (Memory Select Lines). Сигнал на этих |
|
|
линиях выставляется (низкий уровень) для выбора кристалла |
|
|
для соответствующего банка внешней памяти. Размер банка |
|
|
памяти должен быть определен в регистре управления |
|
|
системой (SYSCON). Линии |
– это линии |
|
декодированного адреса памяти, состояние которых изменяется |
|
|
в то же самое время, что и у других линий адреса. Когда нет |
|
|
никаких обращений к внешней памяти, линии |
|
|
неактивны. Однако, они активны при выполнении условной |
|
|
команды обращения к памяти, независимо от того, истинно |
|
|
условие или нет. Сигнал |
может использоваться вместе с |
сигналом PAGE для реализации Банка 0 динамической памяти (DRAM). В многопроцессорной системе сигналы на линии
выводятся ведущим процессором.
I/O/T Строб чтения памяти (Memory Read Strobe). Этот сигнал
выставляется (низкий уровень), когда процессор выполняет считывание из внешней памяти или из внутренней памяти других ADSP 2106x. Внешние устройства (включая другие
ADSP 2106x) должны выставлять сигнал
для считывания из внутренней памяти ADSP 2106x. В многопроцессорных системах сигнал
выводится ведущим процессором и принимается всеми остальными ADSP 2106x.
I/O/T Строб записи памяти (Memory Write Strobe). Этот сигнал выставляется (низкий уровень), когда процессор выполняет
389
11 Проектирование системы
запись во внешнюю память или во внутреннюю память других ADSP 2106x. Внешние устройства (включая другие ADSP
|
|
2106x) должны выставлять сигнал |
для записи во |
||
|
|
внутреннюю память ADSP 2106x. В многопроцессорных |
|||
|
|
системах сигнал |
выводится ведущим процессором и |
||
|
|
принимается всеми остальными ADSP 2106x. |
|||
GE |
O/T |
Граница страницы DRAM (DRAM Page Boundary). |
|||
|
|
Процессор выставляет этот сигнал, если граница страницы |
|||
|
|
внешней DRAM пересечена. Размер страницы DRAM должен |
|||
|
|
определяться в регистре управления памятью WAIT. DRAM |
|||
|
|
может быть реализована только в банке внешней памяти |
|||
|
|
Банк 0; сигнал PAGE может активироваться только для |
|||
|
|
обращений в Банк 0. В многопроцессорных системах сигнал |
|||
|
|
PAGE выводится ведущим процессором. |
|||
ADRCLK O/T |
Выход опорного сигнала тактовой синхронизации (Clock |
||||
|
|
Output Reference). В многопроцессорных системах сигнал |
|||
|
|
ADRCLK выводится ведущим процессором. |
|||
|
I/O/T |
Выбор синхронной записи (Synchronous Write Select). Этот |
|||
|
|
сигнал используется для синхронного взаимодействия ADSP |
|||
|
|
2106x с устройствами памяти (включая другие ADSP 2106x). |
|||
|
|
Процессор выставляет сигнал |
|
(низкий уровень), чтобы |
|
|
|
обеспечить предварительное указание того, что скоро будет |
|||
|
|
выполнена запись, которая может и не произойти, если позже |
|||
|
|
не будет установлен сигнал |
(например, в условной |
||
команде записи). В многопроцессорной системе сигнал 
выводится ведущим процессором и принимается остальными ADSP 2106x. Этот сигнал указывает тип обращения в пространство памяти многопроцессорной системы: запись или
|
чтение. Сигнал |
выставляется тогда, когда выводится |
|
адрес. Хост процессор, использующий синхронную запись, |
|
|
должен выставлять этот сигнал при записи в ADSP 2106x. |
|
ACK |
I/O/S Подтверждение доступа к памяти (Memory Acknowledge). |
|
|
Внешнее устройство может сбрасывать сигнал АСК, чтобы |
|
|
добавить состояние ожидания для обращения к внешней |
|
|
памяти. Сигнал АСК используется устройствами ввода |
|
390
