打印
[技术问答]

HC32F4A0芯片CAN接口硬件问题

[复制链接]
388|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位老铁,我使用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和共模电感去掉,仍然无用。实在没有调试方向了,特来求助大佬。
有没有大佬能够给点指点?

使用特权

评论回复
沙发
pengjun85|  楼主 | 2025-6-28 15:34 | 只看该作者
查到原因了,把CA-is3062w的47uf更换为10uF就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝