9s12XEQ384
Oscilator freq 5.0 MHz
Bus freq 50 MHz
#define BTR0_500 0x80 // Gives 190us for a packet, expected length is 211 us or 202.8us
#define BTR1_500 0x25
#define CTL1 CANE // To select Oscilator clock = CLKSRC
void CAN0_Dont_care(void) // Setup Acceptance registers
{ // Can only be done in initialization mode !
CAN0IDAR0 = 0xff; CAN0IDAR1 = 0xff; // Acceptance registers [0..7]
CAN0IDAR2 = 0xff; CAN0IDAR3 = 0xff; // Must be done in initialization mode.
CAN0IDMR0 = 0xff; CAN0IDMR1 = 0xff; //
CAN0IDMR2 = 0xff; CAN0IDMR3 = 0xff; // 16 bit filter mode (page 42 of MSCAN V02.14)
CAN0IDAR4 = 0xff; CAN0IDAR5 = 0xff;
CAN0IDAR6 = 0xff; CAN0IDAR7 = 0xff;
CAN0IDMR4 = 0xff; CAN0IDMR5 = 0xff; // DONT_CARE
CAN0IDMR6 = 0xff; CAN0IDMR7 = 0xff;
}
void CAN_Init_UniQ(void) // 9sXEQ384
{
CAN0CTL0 |= INITRQ; // set INITRQ, this will also set INITAK
CAN0_Buffer_put = CAN0_Buffer_get =
CAN1_Buffer_put = CAN1_Buffer_get = 0; // Zero index before we initialise CANs
while ((CAN0CTL1 & INITAK) != 1) ; // wait for init mode to occur
CAN0CTL1 = CTL1; // Set CANE just in case this is the first time after reset
// CANE = 1 = CAN Enable, CLKSRC = 0 = Oscilator clock
CAN0BTR0 = BTR0_500;
CAN0BTR1 = BTR1_500; // CAN_TSEG1 = 0x05
CAN0IDAC = IDAM0; // Four 16 bit acceptance filters
CAN0_Dont_care(); // Setup Acceptance registers
CAN0CTL0 &= ~INITRQ; // clear INITRQ. Restart and synchronise
while ((CAN0CTL1 & INITAK) != 0) ; // Wait for acknowledge
CAN0RIER = CSCIE | RSTATE0 | TSTATE0 | OVRIE | RXFIE; // enable receive interrupt RXFIE
CAN0RFLG = WUPIF | OVRIF | RXF; // Reset Error Flags
}
9s12DG256
Oscilator freq 4.0 MHz
Bus freq 25 MHz
#define CAN_TSEG1 0x03 // BitRate = fTq / ( Time Quanta)
#define CAN_TSEG2 0x02 // Time Quanta = (SYNCH_SEG+(CAN_TSEG1+1)+(CAN_TSEG2+1))
#define BAUDRATE_500 1
#define CAN_SJW2 0x01 << 6 // CAN SJW = 2
void CANInit_UniQ(void) // 9sDG256
{
CAN0_Buffer_put = CAN0_Buffer_get =
CAN1_Buffer_put = CAN1_Buffer_get = 0; // Zero index before we initialise CANs
CAN0CTL0 |= INITRQ; // set INITRQ, this will also set INITAK
while ((CAN0CTL1 & INITAK) != 1) ; // wait for init mode to occur
CAN0CTL1 = CANE; // Set CANE just in case this is the first time after reset
// CANE = 1 = CAN Enable, CLKSRC = 0 = Oscilator clock
CAN0BTR0 = CAN_SJW2 | (BAUDRATE_500 - 1); // 4.0MHz / (0x01 - 1) === 500 kHz
// CAN Baud of 500kbps at 4Mhz crystal (Was 0x43)
CAN0BTR1 = (CAN_TSEG2 << 4) + CAN_TSEG1; // CAN_TSEG1 = 0x03
// CAN_TSEG2 = 0x02
CAN0IDAC = IDAM0; // Four 16 bit acceptance filters
CAN0IDAR0 = 0xff; CAN0IDAR1 = 0xff; // Acceptance registers [0..7]
CAN0IDAR2 = 0xff; CAN0IDAR3 = 0xff; // Must be done in initialization mode.
CAN0IDMR0 = 0xff; CAN0IDMR1 = 0xff;
CAN0IDMR2 = 0xff; CAN0IDMR3 = 0xff; // 16 bit filter mode (page 42 of MSCAN V02.14)
CAN0IDAR4 = 0xff; CAN0IDAR5 = 0xff;
CAN0IDAR6 = 0xff; CAN0IDAR7 = 0xff;
CAN0IDMR4 = 0xff; CAN0IDMR5 = 0xff; // DONT_CARE
CAN0IDMR6 = 0xff; CAN0IDMR7 = 0xff;
CAN0CTL0 &= ~INITRQ; // clear INITRQ
while ((CAN0CTL1 & INITAK) != 0) ; // Wait for acknowledge
CAN0RIER = CSCIE | RSTATE0 | TSTATE0 | OVRIE | RXFIE; // enable receive interrupt RXFIE
CAN0RFLG = WUPIF | OVRIF | RXF; // Reset Error Flags
}
We sell thousands of our product a year so I know that the DG256 initialisation must be correct.
The CANH and CANL pins are wired correctly.
Acceptance filter are set to accept all.
Regards,
Wade