[求助] LM3S9B96 CAN发送数据 求助

喜鹊王子   2013-3-2 12:58 楼主
这个是CAN中断服务函数的一部分:

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;//清除错误标记
    }

以下是主函数:

int
main(void)
{
    tCANMsgObject sCANMessage; //定义一个tCANMsgObject类型的参数用于配置报文对象
    unsigned char ucMsgData[4]={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 0x123
    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[0], ucMsgData[1], ucMsgData[2], ucMsgData[3]);

        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);
        }

    }

}

QQ截图20130301213518.jpg
通过UART监测说明 错误标记一直为1,CAN测试软件没有显示想发送的数据,不知道什么原因?

回复评论 (3)

回复 楼主 喜鹊王子 的帖子

接收方是什么芯片?都配置好了吗?
点赞  2013-3-4 14:36

回复 沙发 Study_Stellaris 的帖子

嗯 这个已经解决了 之前把CAN的引脚弄错了
点赞  2013-3-6 20:06

回复 4楼 s05812229 的帖子

直接用 StellarisWare for C1\examples\peripherals\can 里的例程就可以,先可以看看简单的发送和接收例程。
点赞  2013-3-7 18:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复