« Return to Thread: MSCAN problem

Re: MSCAN problem

by Steve Letkeman-5 :: Rate this Message:

Reply to Author | View in Thread

I didn't look over your code but your comments about the message
continuing to
send caught my attention.  This might be an obvious question, but do you
have
at least two CAN nodes on the network?  CAN is not like RS232 where you
can just send a message to nobody, you must have another node with the
correct
settings for the message to be ACK'd.  It also requires a properly
terminated
network, two 120 ohm resistors on each end and a common ground.  Maybe
these have been covered but they are worth mentioning just in case...
Steve


--
Steven D. Letkeman BSc.
Zanthic Technologies Inc.
www.zanthic.com Embedded micro-controllers and CAN interfaces


Johannes Schmid wrote:

>
>
> 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@... <mailto:johannes.schmid%40octanes.de>
> 0179 / 1674917
>
>

 « Return to Thread: MSCAN problem