这个是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);
}
}
}
通过UART监测说明 错误标记一直为1,CAN测试软件没有显示想发送的数据,不知道什么原因?