This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F280041C使用C2000的Can通信例程EX2时只能发不能收

Other Parts Discussed in Thread: C2000WARE

我的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);
}