注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
benbending的个人空间 https://home.eeworld.com.cn/space-uid-376027.html [收藏] [复制] [分享] [RSS]
日志

关于CAN通讯中断

已有 4538 次阅读2012-8-23 10:50

本程序基于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, 求解,是不是发送数据配置有问题?希望有个调试完整的例程参考,谢谢。
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章