Есть вопросы по использованию бита 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; }
|