4731|6

101

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于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);                  

    }

}



UlStatus的值为0x000000E2, 求解,是不是发送数据配置有问题?希望有个调试完整的例程参考,谢谢。

最新回复

我试过可以下的。 CAN 的 CRC 校验不能关掉硬件自动产生。 不过是否可以考虑硬件之后,再软件做一遍也可以的吧?  详情 回复 发表于 2012-8-27 09:57

点评

可以参考 StellarisWare 中 LM3S9B90 中的 CAN 的例程.  详情 回复 发表于 2012-8-23 11:43
 
点赞 关注

回复
举报

1803

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

回复 楼主 benbending 的帖子

可以参考 StellarisWare 中 LM3S9B90 中的 CAN 的例程.

点评

谢谢,能给个链接地址吗?网上找很难,期待您的回复。:)  详情 回复 发表于 2012-8-23 14:06
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

回复 沙发 Study_Stellaris 的帖子

谢谢,能给个链接地址吗?网上找很难,期待您的回复。

点评

试试下面的链接看能否下载 http://www.ti.com/tool/sw-lm3s  详情 回复 发表于 2012-8-25 21:42
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

4
 

回复 板凳 benbending 的帖子

试试下面的链接看能否下载
http://www.ti.com/tool/sw-lm3s

点评

不好意思,没找的。关于CAN通讯中CRC校验时硬件产生的,可以关掉,自己软件实现吗?  详情 回复 发表于 2012-8-27 09:38
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 4楼 Study_Stellaris 的帖子

不好意思,没找的。关于CAN通讯中CRC校验时硬件产生的,可以关掉,自己软件实现吗?

点评

我试过可以下的。 CAN 的 CRC 校验不能关掉硬件自动产生。 不过是否可以考虑硬件之后,再软件做一遍也可以的吧?  详情 回复 发表于 2012-8-27 09:57
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

6
 

回复 5楼 benbending 的帖子

我试过可以下的。
CAN 的 CRC 校验不能关掉硬件自动产生。
不过是否可以考虑硬件之后,再软件做一遍也可以的吧?

点评

谢谢 [ 本帖最后由 benbending 于 2012-8-28 08:53 编辑 ]  详情 回复 发表于 2012-8-27 13:45
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼 Study_Stellaris 的帖子

谢谢

[ 本帖最后由 benbending 于 2012-8-28 08:53 编辑 ]
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表