| 各位老铁,我使用HC32F4A0芯片做了一个板子,同样的软件,非隔离CAN驱动芯片通讯正常,隔离CAN驱动芯片时总是出现Bit错误。 非隔离CAN驱动芯片电路如下:
 
     隔离CAN驱动芯片电路如下:
 
     软件配置如下:
 
 尝试将SMAJ7.0CA和共模电感去掉,仍然无用。实在没有调试方向了,特来求助大佬。    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);
有没有大佬能够给点指点?
 
 |