求简单CAN例程



急求CAN的简单例程,或者接收发送配置的方案。

  • 本程序基于LM3S5K31

    #include "config.h"

    #include "can_deal.h"

    #include "serial_com.h"

    /**/

    tCANMsgObject g_MsgObjectRx;                               // CAN接收报文对象设置

    tCANMsgObject g_MsgObjectTx;                               // CAN发送报文对象设置

    tCANBitClkParms CANBitClkSettings[] =

    {

        {9,6,4,4},  // CANBAUD_125K

        {5,2,2,4},  // CANBAUD_250K

        {5,2,2,2},  // CANBAUD_500K

        {5,2,2,1}   // CANBAUD_1M

    };


    uint8  can_sendbuf[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

    void CANSendInit()                                                              // transmit

    {

      g_MsgObjectTx.ulFlags = MSG_OBJ_EXTENDED_ID;                                  /* 扩展帧*/

      g_MsgObjectTx.ulMsgID = 0x123;                                                /* 取得报文标识符*/

      g_MsgObjectTx.ulMsgLen = 8;                                                   /* 标记数据域长度 */

      g_MsgObjectTx.pucMsgData = can_sendbuf;                                        /* 传递数据存放指针 */

      g_MsgObjectTx.ulFlags |= MSG_OBJ_TX_INT_ENABLE;                               /* 标记发送中断使能*/

      CANRetrySet(CAN0_BASE, 31);                                                   /* 启动发送失败重发 */

      CANMessageSet(CAN0_BASE, 31, &g_MsgObjectTx, MSG_OBJ_TYPE_TX);

                                                                                    /* 配置31号报文对象为发送对象 */      

            

    //       com_flag = 0;

    }

    void InitConsole(void)                               //需要注意  ARM_RXD0 ARM_TXD0

    {

      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

       SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

      GPIOPinConfigure(GPIO_PA0_U0RX);

      GPIOPinConfigure(GPIO_PA1_U0TX);

      GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

      UARTConfigSet(UART0_BASE,9600,UART_CONFIG_WLEN_8|UART_CONFIG_PAR_NONE|UART_CONFIG_STOP_ONE);

             UARTEnable(UART0_BASE);

    }

    void CANConfigure()

    {                                             

      InitConsole();

      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);                               // 使能GPIOD系统外设

      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

      SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);                                // 使能CAN控制器系统外设

      GPIOPinConfigure(GPIO_PA6_CAN0RX);

      GPIOPinConfigure(GPIO_PB5_CAN0TX);

      GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_6 );

      GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_5 );

            

      CANInit(CAN0_BASE);                                                        // 初始化CAN节点

      CANBitTimingSet(CAN0_BASE,

                      (tCANBitClkParms *)&CANBitClkSettings[CANBAUD_250K]);      //  CAN控制器位时序进行配置

      CANEnable(CAN0_BASE);                                              // 使能CAN控制器        

      CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_STATUS | CAN_INT_ERROR ); // 使能CAN控制器中断源

      IntEnable(INT_CAN0);                                                       // 使能CAN控制器中断(to CPU)

      IntMasterEnable();                                                             // 使能中断总开关

    }      

    void CANIntHandler(void)

    {

        unsigned long ulStatus,UlStatus;

        unsigned long ulMsgObjID;

        unsigned long ulNewData;

            

            

        ulStatus   = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);

               ulMsgObjID = CANIntStatus(CAN0_BASE,CAN_INT_STS_OBJECT);

        ulNewData  = CANStatusGet(CAN0_BASE ,CAN_STS_NEWDAT);

            

            

            

               if(ulStatus == CAN_INT_INTID_NONE)                                // No interrupt pending   无挂起中断

        {

                                 CANRetrySet(CAN0_BASE, true);

        }

               else if(ulStatus == CAN_INT_INTID_STATUS)                         // Status Interrupt       状态中断

        {

            UlStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);

                                  CANMessageGet(CAN0_BASE, MSGOBJ_NUM_DATA_RX, &g_MsgObjectRx, true);

                                  CANIntClear(CAN0_BASE, ulStatus);

                               

        }

    // 中断状态分析         

        if(UlStatus == CAN_STATUS_TXOK)                                  //成功发送一帧报文

        {

            CANIntClear(CAN0_BASE, UlStatus);

        }

                       else if(UlStatus == CAN_STATUS_RXOK)

                       {

                                  CANIntClear(CAN0_BASE, UlStatus);

        }

        else                        

        {

            CANIntClear(CAN0_BASE, UlStatus);                  

        }

    }

     

    能够进入中断,但是值不对,为0x000000e2。请问如何配置,哪里出问题了?