Идея в следующем: Используються прерывания Timer0 Uart0 EINT0 I2C SPI0
Все прерывания проходят кроме SPI0 Причём первый байт принимаеться правильно флаг прерывания разрешён и выставляеться но по вектору прерывания не обращается....
значение регистров после принятия данных...
S0SPCR = 0x90; S0SPSR =0xA0; S0SPDR =0x35; // превильно принятый байт
S0SPINT=0x01;
ниже выборка кода
/ VIC Channel Assignments #define VIC_WDT 0 #define VIC_TIMER0 4 #define VIC_TIMER1 5 #define VIC_UART0 6 #define VIC_UART1 7 #define VIC_PWM 8 #define VIC_PWM0 8 #define VIC_I2C 9 #define VIC_SPI 10 #define VIC_SPI0 10 #define VIC_SPI1 11 #define VIC_PLL 12 #define VIC_RTC 13 #define VIC_EINT0 14 #define VIC_EINT1 15 #define VIC_EINT2 16 #define VIC_EINT3 17 #define VIC_ADC 18
#define VIC_TIMER0_bit (1 << VIC_TIMER0) #define VIC_TIMER1_bit (1 << VIC_TIMER1) #define VIC_UART0_bit (1 << VIC_UART0) #define VIC_UART1_bit (1 << VIC_UART1) #define VIC_I2C_bit (1 << VIC_I2C) #define VIC_EINT0_bit (1 << VIC_EINT0) #define VIC_EINT1_bit (1 << VIC_EINT1) #define VIC_EINT2_bit (1 << VIC_EINT2) #define VIC_SPI_bit (1 << VIC_SPI0)
void VIC_EnableInt(unsigned int IntType); void VIC_DisableInt(unsigned int IntType); void Vic_Init(void);
/**** INIT INTERRUPTS ****/ void InitTIMER0Interrupt(void); void InitTIMER1Interrupt(void); void InitUART0Interrupt(void); void InitUART1Interrupt(void); void InitI2CInterrupt(void); void InitEINT0Interrupt(void); void InitEINT1Interrupt(void); void InitEINT2Interrupt(void); void InitSPIInterrupt(void);
static void TIMER0Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void TIMER1Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void UART0Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void UART1Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void I2CInterrupt(void) __attribute__ ((interrupt ("IRQ"))); static void EINT0Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void EINT1Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void EINT2Interrupt(void) __attribute__ ((interrupt ("IRQ"))); static void SPIInterrupt(void) __attribute__ ((interrupt ("IRQ")));
static void InterruptDef(void) __attribute__ ((interrupt ("IRQ")));
//****************************************************************************** void InterruptDef(void) { void (*interrupt_function)(); unsigned int vector;
vector = VICVectAddr; // Get interrupt vector. interrupt_function = (void(*)())vector; (*interrupt_function)(); // Call vectored interrupt function.
VICVectAddr = 0; // Clear interrupt in VIC. }
//****************************************************************************** void VIC_EnableInt(unsigned int IntType) { VICIntEnable |= IntType; //Enable inerrupt } //****************************************************************************** void VIC_DisableInt(unsigned int IntType) { VICIntEnClr |= IntType; //Disable interrupt } //****************************************************************************** void Vic_Init(void) { VICProtection = 0; // Setup interrupt controller. VICIntEnClr = 0xffffffff; // Disable all interrupts VICDefVectAddr=(unsigned int)InterruptDef; }
//****************************************************************************** void InitSPIInterrupt(void) {
VICIntSelect &= ~VIC_SPI_bit; // IRQ on RTC line. VICVectAddr8 = (unsigned int)SPIInterrupt; VICVectCntl8 = 0x20 | VIC_SPI; // Enable vector interrupt for RTC. VICIntEnable |= VIC_SPI_bit; // Enable RTC interrupt.
}
void InitSPI0 (void) { unsigned char temp; S0SPCCR = 0x0a; //
PINSEL0 |= 0x00005500; // configure SPI0 pins S0SPCR = 0x90;
}
//****************************************************************************** unsigned char SlaveRcv = 0xAA; unsigned char SlaveSnd; //****************************************************************************** static void SPIInterrupt(void) { if (S0SPSR) ; // (dummy) read status register
SlaveRcv = S0SPDR; // read data received S0SPDR = SlaveSnd; // next data to transmit S0SPINT = 0x01; // reset interrupt flag
VICVectAddr = 0; // reset VIC }
|