« Return to Thread: MSCAN problem

MSCAN problem

by Johannes Schmid-5 :: Rate this Message:

Reply to Author | View in Thread

Hi everybody!

I have a problem using the CAN-Bus interface of the HCS12 used in the
MicroSquirt(tm) ECU we use on our Formula race car.

Following the various data sheets I came up with the following code:

void CanInit(void)
{
  /* Set up CAN communications */
        /* Enable CAN, set Init mode so can change registers */
        CANCTL1 |= 0x80;
        CANCTL0 |= 0x01;
       
        while(!(CANCTL1 & 0x01))
          ;  // make sure in init mode
       
        /* Set Can enable, use IPBusclk (24 MHz),clear rest */
        CANCTL1 = 0xC0;  
        /* Set timing for .5Mbits/ sec */
        CANBTR0 = 0xC2;  /* SJW=4,BR Prescaler= 3(24MHz CAN clk) */
        CANBTR1 = 0x1C;  /* Set time quanta: tseg2 =2,tseg1=13
                      (16 Tq total including sync seg (=1)) */

        CANIDAC &= ~0x30;   /* no filters */
       
                /* clear init mode */
        CANCTL0 &= 0xFE;  
        /* wait for synch to bus */
        while(!(CANCTL0 & 0x10));
       
        /* no xmit yet */
        CANTIER = 0x00;
        /* clear RX flag to ready for CAN recv interrupt */
        CANRFLG = 0xC3;
        /* set CAN rcv full interrupt bit */
        CANRIER = 0x01;
        return;
}

void CanSend(CAN_message* msg)
{
    unsigned char txbuffer, i;
    static unsigned char flag = 1;
   
    if (!flag)
      return;
    flag = 0;
   
    if (!CANTFLG)
      return; // everything is more important than messages from the
ECU, so just drop out if we cannot send
   
    CANTBSEL = CANTFLG; // Select free buffer to use
    txbuffer = CANTBSEL; // backup buffer
   
    CAN_TB0_IDR0 = (unsigned char) msg->id >> 3; // higher 8 bits of id
    CAN_TB0_IDR1 = (unsigned char) msg->id << 5; // lower 3 bits of id;
    CAN_TB0_IDR1 &= ~(0x18); // Set to standard frames (IDE = 0)
    CAN_TB0_IDR2 = 0;
    CAN_TB0_IDR3 = 0;    
   
    for (i = 0; i < msg->length; i++) {
      *(&CAN_TB0_DSR0 + i) = msg->data[i];
    }
   
    CAN_TB0_DLR = msg->length; // Set length
    CAN_TB0_TBPR = 0; // priority

    // Send message    
    CANTFLG = txbuffer;
}

However, when I send a single CAN message, MSCAN floods the CAN-Bus with
messages (sending probably any us) and never stops. I checked on the
osci and there is an ACK on the bus so I guess everything should be
fine. Do I need to clear some buffer to make it stop sending messages?

Thanks a lot for your help

Johannes


--
Johannes Schmid
High-Octane-Motorsports
Teamleiter Elektronik
johannes.schmid@...
0179 / 1674917

 « Return to Thread: MSCAN problem