关于CAN通讯中断

2019-03-24 13:34发布

本程序基于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, 求解,是不是发送数据配置有问题?希望有个调试完整的例程参考,谢谢。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
Study_Stellaris
1楼-- · 2019-03-24 23:11
< 可以参考 StellarisWare 中 LM3S9B90 中的 CAN 的例程.
benbending
2楼-- · 2019-03-25 01:26
< :TI_MSP430_内容页_SA7 --> 谢谢,能给个链接地址吗?网上找很难,期待您的回复。
Study_Stellaris
3楼-- · 2019-03-25 02:15
 精彩回答 2  元偷偷看……
benbending
4楼-- · 2019-03-25 05:03
不好意思,没找的。关于CAN通讯中CRC校验时硬件产生的,可以关掉,自己软件实现吗?
Study_Stellaris
5楼-- · 2019-03-25 10:22
我试过可以下的。
CAN 的 CRC 校验不能关掉硬件自动产生。
不过是否可以考虑硬件之后,再软件做一遍也可以的吧?
benbending
6楼-- · 2019-03-25 10:57
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章