s12g128 CAN bus example doesn work

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

s12g128 CAN bus example doesn work

757 Views
sinanatilla
Contributor II

I'm trying CAN bus communication on s12g128.I tried http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4455SW.zip CAN example but i didnt work.

 

/******************************************************************************

Function Name  : main

Engineer       : r28318

Date           : 09/06/09

Parameters     : NONE

Returns        : NONE

Notes          : main routine called by Startup.c.

******************************************************************************/

 

 

 

 

void main(void)

{

    byte txbuffer;

   

    ECLKCTL_NECLK = 0;                  /* Enable ECLK = Bus Clock */                  

 

 

    /* initialise the system clock PEE - 64MHz VCO, 32MHz Bus CLK, from 8MHz Crystal */

 

 

    CPMUSYNR = 0x47;                    /* SYNDIV = 7, VCO frequency 48 - 64 MHz */      

 

 

    CPMUREFDIV = 0x80;                  /* REFDIV = 0 REFCLK frequency 6 - 12 MHz */    

 

 

    CPMUPOSTDIV = 0x01;                 /* POSTDIV = 1 */

 

 

    CPMUCLKS_PLLSEL = 1;                /* PLLSEL = 1 */

 

 

    while (!CPMUCLKS_PLLSEL);           /* Verify CPMUCLKS configuration */

 

 

    CPMUOSC_OSCE = 1;                   /* Enable Oscillator OSCE = 1 */

 

 

    while(!CPMUFLG_UPOSC);              /* wait for OSC to stabilise */

 

 

    while(!CPMUFLG_LOCK);               /* wait for PLL to lock */              

 

    /* LEDs */

    PTT = 0xF0;                         /* Initialise PORT T all high; turn off LEDs */

    DDRT = 0xF0;                        /* PORTT 7:4 as outputs */

 

 

    /* Push Buttons */   

  PER1AD = 0xF0;           /* Enable Port PAD Pulls */

  PPS1AD = 0x00;            /* Eanble as Pull-Ups */

  ATDDIEN = 0x00F0;    /* Enable PAD[7:4] as inputs */

 

 

    /* Initialise the CAN */

    CANCTL1_CANE = 1;                   /* enable CAN module */

    CANCTL0 = 0x01;                     /* enter init mode */

    while(!(CANCTL1_INITAK));        /* wait for init mode */

 

 

    CANCTL1 = 0xA0;                    /* enable CAN module, Loopback Mode, Ext OSC */

    CANBTR0 = 0xC3;                    /* sync jump - 4 Tq clocks, prescalar = 3 */

    CANBTR1 = 0x3A;                    /* Tseg = 3, Tseg1 = 10, 1 sample per bit */

    CANIDAC = 0x10;                   /* four 16-bit filters */

 

 

    CANIDAR0 = 0x20;                    /* Filter 0, ID=0x100 Standard Identifier */

    CANIDMR0 = 0x00;

    CANIDAR1 = 0x00;

    CANIDMR1 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

 

 

    CANIDAR2 = 0x00;                    /* Filter 1, ID=0x0000 */

    CANIDMR2 = 0x00;

    CANIDAR3 = 0x00;

    CANIDMR3 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

 

 

    CANIDAR4 = 0x00;                /* Filter 2, ID=0x0000 */

    CANIDMR4 = 0x00;

    CANIDAR5 = 0x00;

    CANIDMR5 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

 

 

    CANIDAR6 = 0x00;                   /* Filter 3, ID=0x0000 */

    CANIDMR6 = 0x00;

    CANIDAR7 = 0x00;

    CANIDMR7 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

 

 

    CANCTL0 = 0x00;                    /* exit init mode */

    while(CANCTL1_INITAK);    /* wait until module exits init mode */

 

 

    while(!(CANCTL0_SYNCH));    /* wait for CAN module to synch */

 

 

    CANRFLG = 0xC3;    /* reset Rx flags */

 

 

    for(;;)

    {

        while (!CANTFLG);               /* Wait for empty Tx Buffer */

        CANTBSEL = CANTFLG;            /* Select the empty Tx Buffer */

        txbuffer = CANTBSEL;            /* Save the empty buffer */

 

 

        CANTXIDR0 = 0x20;               /* load message id value to ID regs */

        CANTXIDR1 = 0x00;

        CANTXIDR2 = 0x00;

        CANTXIDR3 = 0x00;

 

 

       // while(PT1AD == 0xFF);

       

        CANTXDSR0 = 0x55;            /* load data to send */

 

 

        CANTXDLR = 0xFF;    /* set data length */

        CANTXTBPR = 0x80;        /* set data buffer priority */

 

 

        CANTFLG = txbuffer;             /* start transmission */

 

 

        while(!(CANTFLG & txbuffer));   /* wait for Tx to complete */

 

 

        if(CANRFLG_RXF)                 /* has a message been received ? */

        {

            PTT = CANRXDSR0;            /* Display transmitted PORTB on LEDs */

            CANRFLG_RXF = 1;            /* Clear RXF */

        }

    }

 

 

}

 

 

#pragma CODE_SEG DEFAULT

Labels (1)
3 Replies

417 Views
iggi
NXP Employee
NXP Employee

Hi,

what does it mean exactly "it didn't work"? At what line code the problem occurs?

What board do you use? Is it a tower board?

Note that in the CAN example, the Loopback Self Test Mode is enabled which means the MSCAN performs an internal loopback which can be used for self test operation. The bit stream output of the transmitter is fed back to the receiver internally.
The RXCAN input is ignored and the TXCAN output goes to the recessive state (logic 1). The MSCAN behaves as it does normally when transmitting and treats its own transmitted message as a message received from a remote node.

In this state, the MSCAN ignores the bit sent during the ACK slot in the CAN frame acknowledge field to ensure proper reception of its own message. Both transmit and receive interrupts are generated.

Regards,

iggi

417 Views
sinanatilla
Contributor II

Hİ iggi,

"it didnt work" means; I can't see any chancing on oscilloscope.There is no bit stream.

I use own design.I attached schmatic.

cannn.png

417 Views
zerrinderebeyli
Contributor I

I don't know :/ but I know something else :smileywink:

Sent from my iPhone

Zerrin

0 Kudos