您好!
我使用的是 LAUNCHXL-F28377S 开发板。
我修改 了 CAN_EXTERNAL_Transmit 示例、因此仅使用 CANA、因为我打算使用开发板的 CAN 收发器。
我有一个外部节点(Komodo CAN 控制器)、它每秒定期传输数据、TMS320F8377S 应接收数据。
我将获取 CAN_INT_INT0ID_STATUS 的状态中断 CAN_INT_STS_CAUSE、然后在下面 的 ISR 代码中获取 CAN_ES_ES_RXOK 的 CAN_ES_STS_CONTROL。 但我没有收到 RX_MSG_OBJ_ID 的任何状态中断、因此我无法获取任何接收到的数据。 我的代码可能有什么问题?
void CAN_Init (void)
{
CANInit (CANA_base);
CANClkSourceSelect (CANA_base、0);// 1000kHz CAN 时钟
CANBitRateSet (CANA_base、50000000、1000000);
CANIntEnable (CANA_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);
sRXCANMessage.ui32MsgID = 1;
sRXCANMessage.ui32MsgIDMask = 0;
sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage.ui32MsgLen = 4;
sRXCANMessage.pucMsgData = rxMsgData;
CANMessageSet (CANA_base、RX_MSG_obj_ID、sRXCANMessage、
MSG_OBJ_TYPE_RX);
CANEnable (CANA_base);
}
_interrupt void canaISR (void)
{
uint32_t status;
//
//读取 CAN-A 中断状态以查找中断原因
//
状态= CANIntStatus (CANA_base、CAN_INT_STS_CAUST);
//
//如果原因是控制器状态中断,则获取状态
//
if (status =CAN_INT_INT0ID_STATUS)
{
//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。
//
状态= CANStatusGet (CANA_base、CAN_STS_CONTROL);
//
//检查是否发生错误。
//
if (((status &~(CAN_ES_RXOK))!= 7)&&
((STATUS &μ~(CAN_ES_RXOK))!= 0))
{
//
//设置一个标志来指示可能发生的某些错误。
//
errorFlag = 1;
}
}
//
//检查原因是否是 CAN-A 接收报文对象1
//
否则、如果(status == RX_MSG_OBJ_ID)
{
printf ("主 OBC 读取 CAN 总线\n"\});
//
//获取收到的消息
//
CANMessageGet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、true);
//
//到达这一点意味着 RX 中断发生在上
//报文对象1、报文 RX 完成。 清除
//消息目标中断。
//
CANIntClear (CANA_base、RX_MSG_OBJ_ID);
//
//递增计数器以跟踪已有多少消息
//已收到。 在实际应用中、这可用于将标志设置为
//指示何时接收到消息。
//
rxMsgCount++;
//
//由于接收到消息,请清除所有错误标志。
//
错误标志= 0;
Rcvd_data = 1;
}
//
//如果发生意外导致中断的情况,这将对中断进行处理。
//
其他
{
//
//可以在此处执行伪中断处理。
//
}
//
//清除 CAN 中断线的全局中断标志
//
CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0);
//
//确认位于组9中的此中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_group9;
}