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.

TMS320F280025: 在配置使用其CAN的BUSOFF测试时,针对ACK位的干扰BUSOFF功能正常,但在针对RTR位的干扰时候,无法进入BUSOFF的状态,导致BUSOFF逻辑失效

Part Number: TMS320F280025

如上是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

}
}