Hi all,
I got a simple setup of 2 M5282 eval board connected together with a CAN bus. The passive side is waiting for an incomming CAN message. The other side is supposed to send 5 CAN messages but when attempting to send a message the bus becomes off.
Just after the initialization sequence the registers have these value:
MCF_FlexCAN_CANMCR==0
MCF_FlexCAN_ESTAT==80 // bus is idle
MCF_FlexCAN_IFLAG==0
// Init sequence
// F sys = 64 MHz
// CAN baud rate = 1 Mbps /* Set PASPA2,3 bits to one to assign port to CAN bus function */ MCF_PAD_PASPAR |= (MCF_PAD_PASPAR_PASPA2_CANTX | MCF_PAD_PASPAR_PASPA3_CANRX); MCF_FlexCAN_CANCTRL2 = 0; MCF_FlexCAN_PRESDIV = (uint8) MCF_FlexCAN_PRESDIV_PRES_DIV(
((SYSTEM_CLOCK_MHZ / 8) - 1) ); // Init message buffers //------------------------------------------------ /* Initialize 16 Message Buffers */ /* Descr. used for ID Mask*/ //------------------------------------------------ // BUF0 Rx slot_id 111111xxxxx // BUF1 Rx slot_id 111111xxxxx // BUF2 Rx slot_id 111111xxxxx // BUF3 Rx slot_id 111111xxxxx // BUF4 Rx slot_id 111111xxxxx // BUF5 Rx slot_id 111111xxxxx // BUF6 Rx slot_id 111111xxxxx // BUF7 Rx slot_id 111111xxxxx // BUF8 Rx slot_id 111111xxxxx // BUF9 Rx slot_id 111111xxxxx // BUF10 Rx slot_id 111111xxxxx //------------------------------------------------ // BUF11 Rx 0 111111xxxxx // BUF12 Rx 0 111111xxxxx //------------------------------------------------ // BUF13 Tx xxxxxxx - // BUF14 Tx xxxxxxx - //------------------------------------------------ // BUF15 not used - - //------------------------------------------------ // check ID: 6 bits if(CAN_ID > 63) { return FALSE; } // Rx mailboxes for(i = 0; BSP_RX_mailbox[i] != -1; ++i) { // Make buffer inactive MCF_FlexCAN_MBUF_CTRL( BSP_RX_mailbox[i]) = MB_NOT_ACTIVE; // for RX_BROADCAST_MAILBOX1 AND RX_BROADCAST_MAILBOX2, CAN_ID == 0 MCF_FlexCAN_MBUF_IDH( BSP_RX_mailbox[i]) = 0; // default // All Rx mailboxes except RX_BROADCAST_MAILBOX1 AND RX_BROADCAST_MAILBOX2 if(BSP_RX_mailbox[i] != RX_BROADCAST_MAILBOX1 && BSP_RX_mailbox[i]!= RX_BROADCAST_MAILBOX2) MCF_FlexCAN_MBUF_IDH( BSP_RX_mailbox[i]) = (uint16)(CAN_ID << 10); // Initialise control/status word MCF_FlexCAN_MBUF_CTRL( BSP_RX_mailbox[i]) = MB_RX_EMPTY; } // Tx mailboxes for(i = 0; BSP_TX_mailbox[i] != -1; ++i) { MCF_FlexCAN_MBUF_CTRL( BSP_TX_mailbox[i]) = MB_TX_NOT_READY; /* Initialise control/status word */ } /* Message buffer(s) 15 not in use */ MCF_FlexCAN_MBUF_CTRL(15) = MB_NOT_ACTIVE; /* Make buffer inactive */ MCF_FlexCAN_RXGMASK = (uint32)(0x7e0 << 21) | (0x3ffff << 1); // Init Interrupts init_CAN_interrupts(); MCF_FlexCAN_CANMCR = 0; Init sequence
but when attempting to transmit, the IFLAG is never set, and no message is transmitted.
/* Hold Message Buffer ie. not ready for transmit */
MCF_FlexCAN_MBUF_CTRL(mailbox) = MB_TX_NOT_READY;
// Fill mailbox
MCF_FlexCAN_MBUF_WORD(mailbox, 0) = (uint32)(word0 | (word1 << 16));
MCF_FlexCAN_MBUF_WORD(mailbox, 1) = (uint32)(word2 | (word3 << 16));
/* Activate transmission of Message Buffer */
MCF_FlexCAN_MBUF_CTRL(mailbox) = MB_TX_ONCE;
// wait
count=0;
while(!(MCF_FlexCAN_IFLAG & MCF_FlexCAN_IFLAG_BUF(mailbox)))
{
count++;
//if(count > MAXcount) MAXcount=count;
// stop if too long
if(count >= 32000)
break;
}
Any hints? Bus is terminated on both sides.
FB