Поскольку АРМ только начал изучать решил попробовать Keil 3.51
Задача состоит в работе SPI на LPC2294. За основу был взят пример из книги Тревора Мартина слегка переделанный под задачу.
делаем инициализацию:
Код
PINSEL1 = 0x000002A8; //Enable SPI1 pins
IODIR1 = 0x00000000; //Enable Chipselect pin as output
VICVectCntl0 = 0x0000002B; //Select a priority slot for a given interrupt (A - interrupt SPI0)
VICVectAddr0 = (unsigned)SPI_ISR; //Pass the address of the IRQ into the VIC slot
VICIntEnable = 0x00000800; //Enable interrupt SPI1
Функция записи данных контроллером
Код
void TxSPI(unsigned char *pData, unsigned char SPICount)
{
unsigned char i;
CountTxSPI = SPICount; // загрузка счетчика переданных байт
for(i = SPICount; i > 0;) // перегрузка данных в буфер SPI
{
BufSPI[--i] = *pData++;
}
pSPI = &BufSPI[SPICount-1]; // указатель на начало передачи
S1SPCCR = 0xFF;
S1SPCR = (1<<SPIE)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA);
S1SPDR = *pSPI;
}
и собственно обработка прерывания
Код
void SPI_ISR(void) __irq
{
*pSPI = S1SPDR; // чтение данных в буфер
if (CountTxSPI > 1)
{
S1SPDR = *(--pSPI);
CountTxSPI--;
}
else
{
CountTxSPI = 0;
PCONP &= ~(1<<PCSPI1); // выключение SPI
}
S1SPINT = 0x01;
VICVectAddr = 0x00000000;
return;
}
И вот получается что в симуляции все нормально, а в реальном железе прерывание срабатывает только 1 раз.
Пример из которого переделывалось ведет себя аналогично. PLL не использую, кварц 14.7456MHz
Видимо симулятор что то не договаривает, но вот что ?