реклама на сайте
подробности

 
 
> LPC213x, SPI1/SSP: проблемы с прерыванием
abcdefg
сообщение Sep 6 2007, 10:38
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Есть вопросы по использованию бита TXRIS/TXMIS. Как я понимаю, в состоянии покоя (нет передачи) он всегда взведен. Прерывание от SSP заведено на IRQ0.
Происходит интересная штука: в начале передачи разрешаю прерывание по опустощению буфера TXIM=1 и т.к. TXRIS=1 вроде бы должен происходить переход в обработчик, НО этого не происходит, хотя бит в RawInt взводится.
Насчет настройки прерывания я на 99% уверен в её правильности (смотрю по отладчику в keil'e, IntEnable=1, адрес правильный), текущий режим arm'а = user/system, флаги I и F = 0.
В приниципе, наверно можно попробовать настроить по другим флагам, но хотелось бы разобраться.
Скорость передачи низкая (по сути uart'овская 9600, .., 57600), поэтому передача реализована на прерываниях.

Вопрос - в чем не прав и что делать?




#define DISABLE_SSP_INT() SSPIMSC = 0x00
#define ENABLE_SSP_INT() SSPIMSC = 0x08

Настройка прерывания:

DISABLE_SSP_INT();

VICIntSelect &= ~BIT(11); // SSP int -> IRQ
VICIntEnable = BIT(11);
VICVectAddr0 = (void*)SSPIntHandler; // SSP -> IRQ0
VICVectCntl0 = 0x20 | 11; // Enable IRQ slot, source = 11


Обработчик:

void SSPIntHandler (void) __irq
{
// Запихивание в FIFO данных

while ((idxTxDFifoTail != idxTxDFifoHead) && (SSPSR & 0x02))
{
wData = rgTxDFifo[idxTxDFifoTail];
idxTxDFifoTail++;
wData = 0x01 | (wData<<1); // start-бит = 0; stop-бит = 1
SSPDR = wData;
}

// Все данные ушли в FIFO
if (idxTxDFifoTail == idxTxDFifoHead)
{
idxTxDFifoTail = 0;
idxTxDFifoHead = 0;
fTxDActive = 0;

DISABLE_SSP_INT();
}

VICVectAddr = 0x00000000;
}


Собственно функция запихивания в локальный буфер, которая вызывается N-раз

int SRS_SendChar (char aSym)
{
while (idxTxDFifoHead == SRS_TXD_SIZE); // ожидание освобождения буфера

rgTxDFifo[idxTxDFifoHead] = aSym; // Сохранение данных в буфере
idxTxDFifoHead++;

if (!fTxDActive) // Если передача неактивна, инициализация
{
fTxDActive = 1;
ENABLE_SSP_INT();
}

return 0;
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016