Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC213x, SPI1/SSP: проблемы с прерыванием
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
abcdefg
Есть вопросы по использованию бита 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;
}
abcdefg
В общем, проблема сама куда-то рассосалась, есть подозрения на segger'овский RDI-драйвер, т.к. откатив на версию 3.5 всё заработало... мистика, однако 07.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.