我的MCU是F280041C的在使用C2000的Can通信例程EX2的时候,通过USB-CAN适配器连接到PC上,PC只能单方面的接收但是板子接收不到PC发送的数据。
单步执行的时候发现进不了中断,麻烦有老师帮忙解决一下吗?
代码如下:
void Can_Test()
{
// Initialize device clock and peripherals
Device_init();
Device_initGPIO();
//DEVICE_GPIO_CFG_CANRXA GPIO 5
//DEVICE_GPIO_CFG_CANTXA GPIO 4
//can初始化
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);
//初始化can控制器
CAN_initModule(CANA_BASE);
//设置波特率500k
CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);
//使能can中断
CAN_enableInterrupt(CANA_BASE, CAN_INT_IE0 | CAN_INT_ERROR |
CAN_INT_STATUS);
//配置CanA0
Interrupt_register(INT_CANA0, &canAISR);
//使能
Interrupt_enable(INT_CANA0);
CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
Interrupt_initModule();
Interrupt_initVectorTable();
EINT;
ERTM;
//配置发送接收
CAN_setupMessageObject(CANA_BASE, TX_MSG_OBJ_ID, 0x1, CAN_MSG_FRAME_EXT,
CAN_MSG_OBJ_TYPE_TX, 0, 0,
MSG_DATA_LENGTH);
CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID, 0x1, CAN_MSG_FRAME_EXT,
CAN_MSG_OBJ_TYPE_RX, 0, CAN_MSG_OBJ_RX_INT_ENABLE,
MSG_DATA_LENGTH);
txMsgData[0] = 0x01;
txMsgData[1] = 0x02;
//启动can
CAN_startModule(CANA_BASE);
*(uint16_t *)rxMsgData = 0;
while(1)
{
// Send CAN message data from message object 1
DEVICE_DELAY_US(200000);
GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);
DEVICE_DELAY_US(200000);
CAN_sendMessage(CANA_BASE,1, MSG_DATA_LENGTH, txMsgData);
// CAN_readMessage(CANB_BASE, 2, rxMsgData);
// Delay before receiving the data
DEVICE_DELAY_US(1000000);
}
}
__interrupt void
canAISR(void)
{
uint32_t status;
//读取can状态
status = CAN_getInterruptCause(CANA_BASE);
if(status == CAN_INT_INT0ID_STATUS)
{
status = CAN_getStatus(CANA_BASE);
//
// Check to see if an error occurred.
//
if(((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_MSK) &&
((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_NONE))
{
//
// Set a flag to indicate some errors may have occurred.
CanErrorFlag = 1;
}
}
else if(status == TX_MSG_OBJ_ID)
{
CAN_clearInterruptStatus(CANB_BASE, TX_MSG_OBJ_ID);
CanErrorFlag = 0;
}
//
// Check if the cause is the CAN-A receive message object 1
//
else if(status == RX_MSG_OBJ_ID)
{
CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);
CAN_clearInterruptStatus(CANB_BASE, RX_MSG_OBJ_ID);
CanErrorFlag = 0;
}
else
{
//while(1);
}
CAN_clearInterruptStatus(CANB_BASE, RX_MSG_OBJ_ID);
CAN_clearGlobalInterruptStatus(CANB_BASE, CAN_GLOBAL_INT_CANINT0);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}