We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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