Below is the initialization I use:
// start the initialization
Hwi_clearInterrupt(K60CAN_MessageInterruptVectorNumber[obj->DeviceId]);
Hwi_clearInterrupt(K60CAN_BusOffInterruptVectorNumber [obj->DeviceId]);
Hwi_clearInterrupt(K60CAN_ErrorInterruptVectorNumber [obj->DeviceId]);
Hwi_clearInterrupt(K60CAN_TxWarnInterruptVectorNumber [obj->DeviceId]);
Hwi_clearInterrupt(K60CAN_RxWarnInterruptVectorNumber [obj->DeviceId]);
Hwi_clearInterrupt(K60CAN_WakeInterruptVectorNumber [obj->DeviceId]);
// enable the peripheral clock through the system integration module
if (obj->DeviceId == 0)
{
SIM_SCGC6 |= SIM_SCGC6_FLEXCAN0_MASK;
}
else
{
SIM_SCGC3 |= SIM_SCGC3_FLEXCAN1_MASK;
}
// disable the CAN module
//obj->RegPtr->MCR |= CAN_MCR_MDIS_MASK;
// set CAN to use the bus clock
obj->RegPtr->CTRL1 |= CAN_CTRL1_CLKSRC_MASK;
// enable the CAN module
obj->RegPtr->MCR &= ~CAN_MCR_MDIS_MASK;
// wait until out of power power mode
while((obj->RegPtr->MCR & CAN_MCR_LPMACK_MASK) != 0);
// wait until into freeze mode
while((obj->RegPtr->MCR & CAN_MCR_FRZACK_MASK) == 0);
// enable individual Mailbox masks
obj->RegPtr->MCR |= CAN_MCR_IRMQ_MASK;
// disable self reception
obj->RegPtr->MCR |= CAN_MCR_SRXDIS_MASK;
// enable abort
obj->RegPtr->MCR |= CAN_MCR_AEN_MASK;
// enable local priority
obj->RegPtr->MCR |= CAN_MCR_LPRIOEN_MASK;
// get the current clock rate
peripheralClockKHz = Clocking_GetClockkHz(Clocking_BUS_CLK);
// configure the baud rate for the bus
status = K60CAN_SetBaud(obj, peripheralClockKHz * 1000);
// BUS OFF auto recovery ON
obj->RegPtr->CTRL1 &= ~CAN_CTRL1_BOFFREC_MASK;
// Bus Off Interrupt OFF
//obj->RegPtr->CTRL1 &= ~CAN_CTRL1_BOFFMSK_MASK;
// Bus Off Interrupt ON
obj->RegPtr->CTRL1 |= CAN_CTRL1_BOFFMSK_MASK;
// Error Interrupt OFF
//obj->RegPtr->CTRL1 &= ~CAN_CTRL1_ERRMSK_MASK;
// Error Interrupt ON
obj->RegPtr->CTRL1 |= CAN_CTRL1_ERRMSK_MASK;
// TX Warning Interrupt OFF
//obj->RegPtr->CTRL1 &= ~CAN_CTRL1_TWRNMSK_MASK;
// TX Warning Interrupt ON
obj->RegPtr->CTRL1 |= CAN_CTRL1_TWRNMSK_MASK;
// RX Warning Interrupt OFF
//obj->RegPtr->CTRL1 &= ~CAN_CTRL1_RWRNMSK_MASK;
// RX Warning Interrupt ON
obj->RegPtr->CTRL1 |= CAN_CTRL1_RWRNMSK_MASK;
// Wake Interupt OFF
obj->RegPtr->MCR &= ~CAN_MCR_WAKMSK_MASK;
// Wake Interupt ON
//obj->RegPtr->MCR |= CAN_MCR_WAKMSK_MASK;
// take the device out of halt mode
obj->RegPtr->MCR &= ~CAN_MCR_HALT_MASK;
// wait until out of freeze mode
while((obj->RegPtr->MCR & CAN_MCR_FRZACK_MASK) != 0);
// Turn off all interrupts
/// obj->RegPtr->IMASK1 = 0x00000000;
/// obj->RegPtr->IMASK2 = 0x00000000;
// Clear all pending interrupts
/// obj->RegPtr->IFLAG1 = 0x0000FFFF;
/// obj->RegPtr->IFLAG2 = 0x0000FFFF;
Hwi_enableInterrupt(K60CAN_MessageInterruptVectorNumber[obj->DeviceId]);
Hwi_enableInterrupt(K60CAN_BusOffInterruptVectorNumber [obj->DeviceId]);
Hwi_enableInterrupt(K60CAN_ErrorInterruptVectorNumber [obj->DeviceId]);
Hwi_enableInterrupt(K60CAN_TxWarnInterruptVectorNumber [obj->DeviceId]);
Hwi_enableInterrupt(K60CAN_RxWarnInterruptVectorNumber [obj->DeviceId]);