Problem: LPC2136and multiple interrupts

nobody wrote on Sunday, November 19, 2006:

Hello!

I have a problem using multiple IRQ…
Port: ARM7 (LPC2136)
Devel.suite: Cross Works 1.6

I’m using two IRQs: Timer1, running with 22kHz and I2C (slave) called
every 50ms, receiving 3bytes and seding 1byte.
When testing with only one int, everything works fine. As soon as both
are used, the I2C-IRQ stops working after a short period of time (approx.
10-50 ints). The SI-Flag in I2C0STAT is set, but the handler is not called.

Here the relevant code snipplets:

//Timer1
static void Timer1_Isr(void) __attribute__((naked));

void InitIRQTimer()
{
  VICIntSelect &= ~(TIMER1_VIC_CHANNEL_BIT);
  VICIntEnable |= TIMER1_VIC_CHANNEL_BIT;
  VICVectAddr3 = (unsigned int) &Timer1_Isr;
  VICVectCntl3 = TIMER1_VIC_CHANNEL | TIMER1_VIC_ENABLE;
}

static void Timer1_Isr(void)
{

  portSAVE_CONTEXT();

  T1IR |= T1IR_MR0; // clear TI
  .
  .
  .
  VICVectAddr = 0;
  portRESTORE_CONTEXT();
}

//Now i2c
void I2C0_Isr(void) __attribute__ ((naked));
static void I2C_Init(void)
{
    //I2C-Init
    PINSEL0 |= 0x50; // P0.3 = SDA, P0.2 = SCL
    I2C0ADR = I2C_SLAVE_ADDR<<1; // set I2C slave address
    I2C0CONSET = 0x44; // enable I2C hardwar and set AA (ack)
    VICVectAddr4 = (unsigned int) &I2C0_Isr;
    VICVectCntl4 = 0x29; // Channel1 on Source#9 … enabled
    VICIntEnable |= 0x200; // 9th bit is the I2C
}

void I2C0_Isr(void)
{
  portSAVE_CONTEXT();
  I2C0CONCLR = 0x08; // clear SI
  .
  .
  .
  VICVectAddr = 0;
  portRESTORE_CONTEXT();
}

I have a feeling, I forgot something… :slight_smile:

I’m thankful for any hint!

Thanks,
Th.Kusch