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

Please help me...

Please help me...
i am trying to write driver for CAN interface of LPC2129
Everything but the receive message ISR is working fine..
I am unable to hit ISR.
Please let me know where i am going wrong in the following code...

U16 CAN_Init (U16 can_port,U16 can_isrvect,U32 can_btr)
{

        U32 *pSFR;                                              // pointer into SFR space
        U32 *pSFR2;                                     // pointer into SFR space
        U32 offset;                                                             // offset added to pSFR

        //Check can_isrvect value
        if (can_isrvect > 15)
        {
                return 0;                                                       // Illegal value for can_isrvect
        }

        //Check can_port value
        if(can_port < 1 || can_port > MAX_CANPORTS)
        {
                return 0;                                                       //Illegal value for can_port
        }

        //Enable pins for Selected can interface
        switch(can_port)
        {
                case 1:
                        PINSEL1 |= 0x00040000;                  // Set bit 18
                        offset = 0x00000000;
                        break;

                case 2:
                        PINSEL1 |= 0x00014000;                  // Set bits 14 to Enable RD2 and 16 to Enable TD2
                        offset = 0x00001000;
                        break;

                default:
                        return 0;                                               // Illegal value returned
        }

        // Reset and disable all message filters

        CANFilter = 0;

        // Acceptance Filter mode register - Off

        AFMR = 0x00000001;

        pSFR = (U32 *) &C1MOD + offset;     // Select canmod Register
        *pSFR = 0x00000001;                                                     // Go To Reset Mode

        pSFR = (U32 *) &C1IER + offset;     // Select Interrupt Enable Register
        *pSFR = 0;                                                                      // Disable All Interrupts

        pSFR = (U32 *) &C1GSR + offset;     // Select Status Register
        *pSFR = 0;                                                                      // Clear Status register

        pSFR = (U32 *) &C1BTR + offset;     // Select BTR Register
        *pSFR = can_btr;                                                        // Set bit timing

        pSFR = (U32 *) &C1MOD + offset;
        *pSFR = 0x00;

        pSFR2 = (U32 *) &VICVectCntl0;
        pSFR2 += can_isrvect; // Set to desired interrupt control

        // Set and enable receive interrupt
        pSFR = (U32 *) &VICVectAddr0;
        pSFR += can_isrvect; // Set to desired interrupt vector

        switch(can_port)
        {
                case 1:
                        //Set interrupt vector
                        *pSFR = (U32) CANISR_RX1;
                        //Use this interrupt for CAN RX1
                        *pSFR2 = 0x20 | 26;
                        //Enable CAN RX1 interrupt
                        VICIntEnable |= 0x04000000;
                        break;

                case 2:
                        //Set interrupt vector
                        *pSFR = (U32) CANISR_RX2;
                        //Use this interrupt for CAN RX2
                        *pSFR2 = 0x20 | 27;
                        //Enable CAN RX2 interrupt
                        VICIntEnable |= 0x08000000;
                        break;

                default:
                        return 0;                                                               // Invalid value used
        }

        pSFR = (U32 *) &C1IER + offset;                                     // Select Interrupt Register
        *pSFR = 1;                                                                              // Enable Interrupt Register

        pSFR = (U32 *) &C1MOD + offset;                                     // Select mode register
        *pSFR = 0;

        pSFR = (U32 *) &C1CMR + offset;
        *pSFR = 0;                                                                              // Operating mode

        pSFR = (U32 *) &C1MOD + offset;
        *pSFR = 0x00;


        // Successful Return
        return 1;
}

0