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

LPC2364 CAN 2 operation mode problem

Hi

I'm having trouble with my 2nd CAN block on the LPC2364.
The initialization goes fine (CAN2MOD is set to 0x00 in the end), but when I want to send a CAN message, it disables the CAN block by the transmission request. What could be the cause of it.
The hardware works fine, idem for CAN block 1. When I step trough the code, CAN block 1 don't disable the CAN 1 operation mode. What's the difference with CAN 2?

This is my init and transmist code:

void initCAN()
{
        // turn on power of CAN blocks: bit 13/14 of PCONP
        PCONP |= 1 << 13; // CAN 1
        PCONP |= 1 << 14; // CAN 2

        // P0.21 and P0.22 for CANRx1 and CANTx1 (TD1, RD1) = 11
        PINSEL1 |= 0x3C00;
        // P0.4 and P0.5 for CANRx2 and CANTx2 (TD2, RD2) = 10
        PINSEL0 |= 0xA00;

        CAN1MOD = CAN2MOD = 0x01;               // Reset CAN
        CAN1IER = CAN2IER = 0x00;               // Disable Receive Interrupt
        CAN1GSR = CAN2GSR = 0x00;               // Reset error counter when CANxMOD is in reset

        // Baudrate Prescaler
        CAN1BTR = CAN2BTR = 0x7E0001;           // 500K

        IODIR0 |= 1<<20;  // CAN1_TXEN = output
        IOCLR0 |= 1<<20;  // CAN1_TXEN = low --> activate transceiver
        IODIR0 |= 1<<6;           // CAN2_TXEN = output
        IOCLR0 |= 1<<6;           // CAN2_TXEN = low --> activate transceiver

        CAN1MOD = CAN2MOD = 0x00;               // CAN in operating mode

        installInterruptCAN(0x17, 0xFF, (void *)canHandler);    //0x17 = 0d23
        CAN1IER = CAN2IER = 0x01;               // enable receive interrupts
}

int TransmitHandler(MESSAGE *sendMsg, U8 can)
{
        if(can == 0x01){
                volatile unsigned status = CAN1SR;
                if(status & 0x04)                                   // Transmit buffer 1 released
                        {
                                //RTR, long or short ID & DLC
                                CAN1TFI1 = sendMsg->Frame & 0xC00F0000;
                                CAN1TID1 = sendMsg->canID;
                                CAN1TDA1 = sendMsg->DataA;
                                CAN1TDB1 = sendMsg->DataB;
                                // Transmission Request on TX Buffer 1
                                CAN1CMR  = 0x21;


return 1; } else if(status & 0x400) // Transmit buffer 2 released { //RTR, long or short ID & DLC CAN1TFI2 = sendMsg->Frame & 0xC00F0000; CAN1TID2 = sendMsg->canID; CAN1TDA2 = sendMsg->DataA; CAN1TDB2 = sendMsg->DataB; // Transmission Request on TX Buffer 2 CAN1CMR = 0x41;
return 1; } else if(status & 0x40000) // Transmit buffer 3 released { //RTR, long or short ID & DLC CAN1TFI3 = sendMsg->Frame & 0xC00F0000; CAN1TID3 = sendMsg->canID; CAN1TDA3 = sendMsg->DataA; CAN1TDB3 = sendMsg->DataB; // Transmission Request on TX Buffer 3 CAN1CMR = 0x81;
return 1; } else return 0; } else if(can == 0x02){ volatile unsigned status = CAN2SR; if(status & 0x04) // Transmit buffer 1 released { //RTR, long or short ID & DLC CAN2TFI1 = sendMsg->Frame & 0xC00F0000; CAN2TID1 = sendMsg->canID; CAN2TDA1 = sendMsg->DataA; CAN2TDB1 = sendMsg->DataB; // Transmission Request on TX Buffer 1 CAN2CMR = 0x21;
return 1; } else if(status & 0x400) // Transmit buffer 2 released { //RTR, long or short ID & DLC CAN2TFI2 = sendMsg->Frame & 0xC00F0000; CAN2TID2 = sendMsg->canID; CAN2TDA2 = sendMsg->DataA; CAN2TDB2 = sendMsg->DataB; // Transmission Request on TX Buffer 2 CAN2CMR = 0x41;
return 1; } else if(status & 0x40000) // Transmit buffer 3 released { //RTR, long or short ID & DLC CAN2TFI3 = sendMsg->Frame & 0xC00F0000; CAN2TID3 = sendMsg->canID; CAN2TDA3 = sendMsg->DataA; CAN2TDB3 = sendMsg->DataB; // Transmission Request on TX Buffer 3 CAN2CMR = 0x81;
return 1; } else return 0; } return 0; }

If somenone could help me I will be very thankfull!

Thanks
Genji