Part Number:LAUNCHXL-F280025C
Hello,
參考了"can_ex5_simple_receive", 實作以下一個簡單的CAN bus receive data,
當執行到中斷函式的: status = CAN_getStatus(CANA_BASE);後
status = 5, 請問造成這種error的可能原因是甚麼?
void CAN_Init(void) // CAN 初始化
{
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);
CAN_initModule(CANA_BASE);
CAN_setBitTiming(CANA_BASE, 15, 0, 15, 7, 3); //250K
CAN_enableInterrupt(CANA_BASE, CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS);
Interrupt_initModule();
Interrupt_initVectorTable();
EINT;
ERTM;
Interrupt_register(INT_CANA0,&canaISR);
Interrupt_enable(INT_CANA0);
CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
CAN_startModule(CANA_BASE);
}
void Msg_Init(void) // Message Object 初始化
{
CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID, 0x750,
CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0x00000FF1,
CAN_MSG_OBJ_RX_INT_ENABLE | CAN_MSG_OBJ_USE_ID_FILTER, 0);
}
__interrupt void
canaISR(void) //中斷函式
{
status = CAN_getInterruptCause(CANA_BASE);
if(status == CAN_INT_INT0ID_STATUS)
{
status = CAN_getStatus(CANA_BASE);
if(((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_MSK) &&
((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_NONE))
{
errorFlag = 1;
}
}
else
{
obj = status; // which mailbox was updated
CAN_readMessage(CANA_BASE, obj, rxMsgData, &dlc);
CAN_clearInterruptStatus(CANA_BASE, obj);
}
}
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
您好,
返回值5代表着 CAN 总线上的一个节点正在发送passive error。 debug这种情况没有直接的方式,因为错误有多种形式,如位错误、填充错误、形式错误、CRC 错误或 ACK 错误。 当节点收到此类错误时,内部 CAN 错误计数器会根据错误类型递增。 如果错误计数器的计数值超过127,接收节点将发送passive error,以告知其他节点总线上的帧始终会产生此类错误。
您先检查下有无哪个连接松动了,或将 CANalyzer 连接到总线,以查看可能导致错误的节点。