asnowgober 发表于 2013-3-1 21:41:50

LM3S9B96的CAN报文发送?

//*****************************************************************************
// CAN中断服务函数
//*****************************************************************************
void
CANIntHandler(void)
{
    unsigned long ulStatus;
   
    ulStatus = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);//控制器中断寄存器的值并表示中断产生的原因
   
    if(ulStatus == CAN_INT_INTID_STATUS)//中断产生的原因是一个状态中断
    {
      ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);//读取主控制器状态寄存器
      //在读取主控制器状态寄存器时,将清除一个正在挂起的状态中断。      
      
      g_bErrFlag = 1;// 表示有错误发生
    }

    else if(ulStatus == 1)//表示具有高优先级编号1的报文对象正在挂起一个中断
    {
      CANIntClear(CAN0_BASE, 1);//清楚报文对象中断
      g_ulMsgCount++;//中断次数递增
      g_bErrFlag = 0;//清除错误标记
    }

    // Otherwise, something unexpected caused the interrupt.This should
    // never happen.
    else
    {
      // Spurious interrupt handling can go here.
    }
}

//*****************************************************************************
// 主函数.
//*****************************************************************************
int
main(void)
{
    tCANMsgObject sCANMessage; //定义一个tCANMsgObject类型的参数用于配置报文对象
    unsigned char ucMsgData={0,1,2,3};

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_16MHZ);//时钟设置

    InitConsole();//UART显示函数

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

    GPIOPinConfigure(GPIO_PD0_CAN0RX);
    GPIOPinConfigure(GPIO_PD1_CAN0TX);

    GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);

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

    CANInit(CAN0_BASE);//CAN控制器初始化
   
    CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000);//设置波特率

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

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

    CANEnable(CAN0_BASE);//使能CAN控制器
   
    // Initialize the message object that will be used for sending CAN messages.
    sCANMessage.ulMsgID = 0x123;                        // CAN message ID - use 1
    sCANMessage.ulMsgIDMask = 0;                  // no mask needed for TX
    sCANMessage.ulFlags = MSG_OBJ_TX_INT_ENABLE;    // enable interrupt on TX
    sCANMessage.ulMsgLen = sizeof(ucMsgData);       // size of message is 4
    sCANMessage.pucMsgData = ucMsgData;             // ptr to message content

    // Enter loop to send messages.A new message will be sent once per 5
    // seconds.The 4 bytes of message content will be treated as an unsigned
    // long and incremented by one each time.
    for(;;)
    {
      // Print a message to the console showing the message count and the
      // contents of the message being sent.
      UARTprintf("Sending msg: 0x%02X %02X %02X %02X",
                   ucMsgData, ucMsgData, ucMsgData, ucMsgData);

      CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_TX);//配置CAN控制器的一个报文对象
      
      SimpleDelay();// 1秒延时
      
      if(g_bErrFlag) // 检查错误标记,查看是否有错误发生
      {
            UARTprintf(" error - cable connected?\n");
      }

      else
      {
            // 如果没有错误,则显示发送的报文数目
            UARTprintf(" total count = %u\n", g_ulMsgCount);
      }

    }

}
我将LM9B96的CANH、CANL、GND分别与CANUSB的CANH、CANL、GND相连,CAN测试软件没有显示。
通过UART显示如下信息:

不知道程序是不是有问题。
页: [1]
查看完整版本: LM3S9B96的CAN报文发送?