我用KDS3.0生成库代码,生的CAN代码PE_ISR(CAN1_TxInterrupt),
ErrorFlags = MSCAN_PDD_GetRxStatusInterruptFlags(MSCAN_BASE_PTR); /* Read the status register */
if (
((ErrorFlags & MSCAN_PDD_RX_BUS_OFF) != MSCAN_PDD_RX_BUS_OFF)|| ((ErrorFlags & MSCAN_PDD_TX_BUS_OFF) != MSCAN_PDD_TX_BUS_OFF)
)
{ /* Is bus-off detected? */
DeviceDataPrv->Stats.BusOffs++; /* Increase BusOffs interrupt counter */
CAN1_OnBusOff(DeviceDataPrv->UserData); /* Invoke user event */
}
MSCAN_PDD_RX_BUS_OFF为0x30,查看手册中 MSCAN_CANRFLG ,bit5-4中为0b11时总线离线,但代码中判断不为0b11则为离线。
LDD_TError CAN1_GetError(LDD_TDeviceData *DeviceDataPtr, LDD_CAN_TErrorMask *ErrorMaskPtr)
{
CAN1_TDeviceData *DeviceDataPrv = (CAN1_TDeviceData *)DeviceDataPtr;
/* {Default RTOS Adapter} Critical section begin, general PE function is used */
EnterCritical();
*ErrorMaskPtr = DeviceDataPrv->ErrorMask; /* Return last value of error mask */
DeviceDataPrv->ErrorMask = 0x00U;
/* {Default RTOS Adapter} Critical section end, general PE function is used */
ExitCritical();
return ERR_OK;
}
DeviceDataPrv->ErrorMask = 0x00U;,查看代码ErrorMask 为内存中数据,为什么ErrorMask 清零后总线可以立刻恢复。