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