各位老铁,我使用HC32F4A0芯片做了一个板子,同样的软件,非隔离CAN驱动芯片通讯正常,隔离CAN驱动芯片时总是出现Bit错误。
非隔离CAN驱动芯片电路如下:
隔离CAN驱动芯片电路如下:
软件配置如下:
stc_can_init_t stcCanInit;
stc_can_filter_config_t astcFilter[CAN1_FILTER_NUM] = {
{CAN1_FILTER1_ID, CAN1_FILTER1_ID_MASK, CAN1_FILTER1_ID_TYPE},
// {CAN1_FILTER2_ID, CAN1_FILTER2_ID_MASK, CAN1_FILTER2_ID_TYPE},
// {CAN1_FILTER3_ID, CAN1_FILTER3_ID_MASK, CAN1_FILTER3_ID_TYPE},
};
stc_irq_signin_config_t stcIrq;
CAN_DeInit(CM_CAN1);
/************************* Configure CAN1***************************/
CLK_SetCANClockSrc(CLK_CAN1, CLK_CANCLK_SYSCLK_DIV6); // can1 clock = 240/6 MHz = 40MHz
/* GPIO definition */
GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_06,GPIO_FUNC_60);//CAN1-TX
GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_07,GPIO_FUNC_61);//CAN1-RX
/* Initializes CAN. */
(void)CAN_StructInit(&stcCanInit);
//BaudRate = 40MHz / 20 / (16 + 4)=100K
//SamplePoint = TS1/(TS1+TS2) = 16/(16+4)= 80%
//BaudRate = 40MHz / 40 / (16 + 4)=50K
//SamplePoint = TS1/(TS1+TS2) = 16/(16+4)= 80%
//TS1 >= (TS2+1)
//TS2 >= SJW
stcCanInit.stcBitCfg.u32Prescaler = 20U; // 100kbps,80%
stcCanInit.stcBitCfg.u32TimeSeg1 = 16U;
stcCanInit.stcBitCfg.u32TimeSeg2 = 4U;
stcCanInit.stcBitCfg.u32SJW = 4U;
/*!< Only receives correct frames. */
stcCanInit.u8RxAllFrame = CAN_RX_ALL_FRAME_DISABLE;
/*!< Saves the newly received data and the oldest frame will be overwritten. */
stcCanInit.u8RxOvfMode = CAN_RX_OVF_SAVE_NEW;
stcCanInit.pstcFilter = astcFilter;
stcCanInit.u16FilterSelect = CAN1_FILTER_SEL;
stcCanInit.u8WorkMode = CAN_WORK_MD_ELB;
if(stcCanInit.u8WorkMode == CAN_WORK_MD_NORMAL){
stcCanInit.u8SelfAck = CAN_SELF_ACK_DISABLE;
}else if(stcCanInit.u8WorkMode == CAN_WORK_MD_ELB){
stcCanInit.u8SelfAck = CAN_SELF_ACK_ENABLE;
}
/* Enable peripheral clock of CAN1. */
FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_CAN1, ENABLE);
(void)CAN_Init(CM_CAN1, &stcCanInit);
/* Enable the interrupts, the status flags can be read. */
// CAN_IntCmd(CM_CAN1, CAN_INT_ALL, DISABLE);
// CAN_IntCmd(CM_CAN1, CAN_INT_RX | CAN_INT_ERR_INT, ENABLE);
CAN_IntCmd(CM_CAN1, CAN_INT_ALL, ENABLE);
stcIrq.enIntSrc = CAN1_INT_SRC;
stcIrq.enIRQn = CAN1_INT_IRQn;
stcIrq.pfnCallback = &CAN1_IrqCallback;
INTC_IrqInstalHandler(&stcIrq, DDL_IRQ_PRIO_DEFAULT);
尝试将SMAJ7.0CA和共模电感去掉,仍然无用。实在没有调试方向了,特来求助大佬。
有没有大佬能够给点指点?
|