[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Чайник 01 августа 2003 г. 19:26
В ответ на: Поделись, плиз, кодом на прерываниях отправлено lisarden 01 августа 2003 г. 16:57

Старт приема:

IOPG = SPI0_Controller_Page; // == 0x4

//=============== Загрузка дескриптора старт SPI =============================

ar = 0x5D08; io(SPICTL0) = ar; // SPI - мастер
nop;
ar = 0xFC02; io(SPIFLG0) = ar; // Разрешаем CLK в альтере SPI0SEL
nop;

ar = IRPTL;
ar = setbit 6 of ar;
IRPTL = ar; // Старт обмена через прерывание SPI

rts;

В прерывании приема:

SPI0_RX:
i0 = dm(SPI0_HEAD + 2); // Текущий адрес
l0 = 0; m0 = 1;
ar = io(RDBR0); // Слово принято
dm(i0,m0) = ar; // Сохранено в буфере
dm(SPI0_HEAD + 2) = i0; // Сохраняем указатель
===========================================================
здесь надо вставить проверку на условие окончания приема
например : ax0 = АДРЕС_КОНЦА_БУФЕРА
ay0 = i0;
ar = ax0 - ay0;
if eq jump END_RX;
rti; или RTS если в векторах был Call


===========================================================
END_RX:
ar = 0xFF02; io(SPIFLG0) = ar; // Запрещаем CLK в альтере SPI0SEL
nop;
ar = 0x1D08; io(SPICTL0) = ar; // Стоп канал ВНИМАНИЕ !!!
nop;
ar = 0x0056; io(SPIST0) = ar; // Сбросить статус
rti; или RTS если в векторах был Call

Старт передачи:


IOPG = SPI0_Controller_Page; // == 0x4

ar = 0x5D09; io(SPICTL0) = ar; // SPI - мастер
nop;
ar = 0xFC02; io(SPIFLG0) = ar; // Разрешаем CLK в альтере SPI0SEL
nop;

ar = IRPTL;
ar = setbit 6 of ar; // Старт обмена через прерывание SPI
IRPTL = ar;

rts;


В прерывании передачи:

SPI0_TX: // Передаем пакет
i0 = dm(SPI0_HEAD + 2); // Текущий адрес
l0 = length (SPI0_BUF_OUT);
ar = SPI0_BUF_OUT;
reg(b0) = ar; // Кольцевой буфер
m0 = 1;
ar = dm(SPI0_HEAD + 3); // Счетчик слов на передачу
ar = ar - 1;
if le jump END_TX;
=================================================================
в отличие от предыдущего фрагмета здесь условие - как в ДМА
счетчик = 0
==================================================================
dm(SPI0_HEAD + 3) = ar;
ar = dm(i0,m0); // Загружаем слово из буфера
io(TDBR0) = ar; // Слово принято
dm(SPI0_HEAD + 2) = i0; // Сохраняем указатель
rti; // или RTS если в векторах был Call

END_TX:

ar = 0xFF02; io(SPIFLG0) = ar; // Запрещаем CLK в альтере SPI0SEL
nop;
ar = 0x1D09; io(SPICTL0) = ar; // Стоп канал ВНИМАНИЕ !!!
nop;
ar = 0x0056; io(SPIST0) = ar; // Сбросить статус
nop;
=========== важная строчка ! "снимает" флаг прерывания в IRPTL
если ее не выполнять - проц "уйдет" в таблицу векторов.

io(TDBR0) = ar; // Слово принято

rti; или RTS если в векторах был Call



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru