如上是bus_off测试结果;如下是底层配置代码:
//初始化配置
GPIO_setPinConfig(GPIO_30_CANA_RX);
GPIO_setPinConfig(GPIO_31_CANA_TX);
//初始化CAN模块
CAN_initModule(CANA_BASE);
//设置波特率
// CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);
CanaRegs.CAN_BTR.bit.BRPE = 0;
CanaRegs.CAN_BTR.bit.BRP = 9;
CanaRegs.CAN_BTR.bit.SJW = 3;
CanaRegs.CAN_BTR.bit.TSEG1 = 15;
CanaRegs.CAN_BTR.bit.TSEG2 = 2;
//采样点计算 = TSEG1+1+1/(TSEG1+TSEG2+3)
CAN_clearInterruptStatus(CANA_BASE, CAN_INT_INT0ID_STATUS);
CAN_enableInterrupt(CANA_BASE, CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS);
Interrupt_register(INT_CANA0, &ECAN_ISR_EX);
Interrupt_enable(INT_CANA0);
CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
//启动转换
CAN_startModule(CANA_BASE);
//BUS_OFF判断
void CANBUS_Ecan_isr(CANBUS_handle p)
{
uint32_t status;
status = CAN_getInterruptCause(CANA_BASE);
if(status == CAN_INT_INT0ID_STATUS)
{
status = CAN_getStatus(CANA_BASE);
TEC = CanaRegs.CAN_ERRC.bit.TEC;
REC = CanaRegs.CAN_ERRC.bit.REC;
if(((status & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 7) &&
((status & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 0))
{
p->err_flag = 1;
if(status & CAN_STATUS_BUS_OFF)
{
CAN_disableRetry(CANA_BASE);
p->Busoff_flag = 1;
p->Off_delay_cnt = 0;
}
}
else if(status & CAN_STATUS_TXOK)
{
CAN_clearInterruptStatus(CANA_BASE, TX_MSG_OBJ_ID);
p->err_flag = 0;
p->Busoff_cnt = 0;
}
}
else if(status == TX_MSG_OBJ_ID)
{
CAN_clearInterruptStatus(CANA_BASE, TX_MSG_OBJ_ID);
p->err_flag = 0;
}
else if(status < TX_MSG_OBJ_ID)
{
p->err_flag = 0;
CAN_readMessageWithID(CANA_BASE, status, &canbus.frameType, &rxMsgData.Ram_ID.all, rxMsgData.Data);
CAN_clearInterruptStatus(CANA_BASE, status);
p->Rxd_data_finish_flag = 1; //receive success
}
}