This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

IRQ Not Firing

Hello,

I am writing an I2C master transmitter object. The problem I am having is that the IRQ Handler for I2C1 is not firing. According to the manual, it should fire after the start condition is sent and the status register is 0x08. When I step through the code with the debugger, the status code is 0x08. I am using an MCB1700 development board. Why is it not firing? Did I not configure something properly? For tests, All I am doing is toggling an LED on when the interrupt fires. Once I solve this problem, I will write the rest of the code.

#include <stdio.h>
#include <LPC17XX.h>
#include "GPIO1Output.h"

GPIO1Output out(P1_28);

__irq void I2C1_IRQHandler(void)
{
        if (LPC_I2C1->I2STAT == 0x08)
        {
             out.Set();
        }
}

int main(void)
{
        // Initialize I2C.
        LPC_PINCON->PINSEL0 = 0x0F;
        LPC_PINCON->PINMODE_OD0 = 0x03;

        NVIC_EnableIRQ(I2C1_IRQn);
        LPC_I2C1->I2CONSET = 0x40;

        LPC_I2C1->I2CONSET = 0x20;
        int status = LPC_I2C1->I2STAT;
}

Parents
  • There is a reason why an embedded developer should have at least some knowledge about assembler for the target architecture. The way to tell is to locate the interrupt vectors in the startup file, and then follow the path until you either get to your ISR, or somewhere you do not want to reach - like your infinite branch.

    The datasheet for your processor - actually "User Manual" is the name NXP users - does a good job of telling you where the interrupt vectors are.

    Another thing you really have to know about is the difference between single-stepping C source code and single-stepping processor instructions. It is possible to single-step in the startup file too. It's your single-stepping source lines (which indirectly means that the compiler sets a breakpoint on the next source line) that have had you not notice the infinite loop until now. When suspecting interrupt problems, it's often needed to perform instruction-level single-stepping.

Reply
  • There is a reason why an embedded developer should have at least some knowledge about assembler for the target architecture. The way to tell is to locate the interrupt vectors in the startup file, and then follow the path until you either get to your ISR, or somewhere you do not want to reach - like your infinite branch.

    The datasheet for your processor - actually "User Manual" is the name NXP users - does a good job of telling you where the interrupt vectors are.

    Another thing you really have to know about is the difference between single-stepping C source code and single-stepping processor instructions. It is possible to single-step in the startup file too. It's your single-stepping source lines (which indirectly means that the compiler sets a breakpoint on the next source line) that have had you not notice the infinite loop until now. When suspecting interrupt problems, it's often needed to perform instruction-level single-stepping.

Children