[技术问答] HC32F4A0芯片CAN接口硬件问题

[复制链接]
 楼主| pengjun85 发表于 2025-6-27 21:35 | 显示全部楼层 |阅读模式
各位老铁,我使用HC32F4A0芯片做了一个板子,同样的软件,非隔离CAN驱动芯片通讯正常,隔离CAN驱动芯片时总是出现Bit错误。
非隔离CAN驱动芯片电路如下:
屏幕截图 2025-06-27 212948.png 屏幕截图 2025-06-27 213147.png
隔离CAN驱动芯片电路如下:
屏幕截图 2025-06-27 213049.png 屏幕截图 2025-06-27 213252.png
软件配置如下:
  1.     stc_can_init_t stcCanInit;
  2.     stc_can_filter_config_t astcFilter[CAN1_FILTER_NUM] = {
  3.         {CAN1_FILTER1_ID, CAN1_FILTER1_ID_MASK, CAN1_FILTER1_ID_TYPE},
  4. //        {CAN1_FILTER2_ID, CAN1_FILTER2_ID_MASK, CAN1_FILTER2_ID_TYPE},
  5. //        {CAN1_FILTER3_ID, CAN1_FILTER3_ID_MASK, CAN1_FILTER3_ID_TYPE},
  6.     };
  7.     stc_irq_signin_config_t stcIrq;
  8.    
  9.     CAN_DeInit(CM_CAN1);

  10.     /************************* Configure CAN1***************************/
  11.     CLK_SetCANClockSrc(CLK_CAN1, CLK_CANCLK_SYSCLK_DIV6);  // can1 clock = 240/6 MHz = 40MHz
  12.    
  13.     /* GPIO definition */
  14.     GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_06,GPIO_FUNC_60);//CAN1-TX
  15.     GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_07,GPIO_FUNC_61);//CAN1-RX

  16.     /* Initializes CAN. */
  17.     (void)CAN_StructInit(&stcCanInit);
  18.     //BaudRate = 40MHz / 20 / (16 + 4)=100K
  19.     //SamplePoint = TS1/(TS1+TS2) = 16/(16+4)= 80%
  20.     //BaudRate = 40MHz / 40 / (16 + 4)=50K
  21.     //SamplePoint = TS1/(TS1+TS2) = 16/(16+4)= 80%
  22.     //TS1 >= (TS2+1)
  23.     //TS2 >= SJW
  24.     stcCanInit.stcBitCfg.u32Prescaler = 20U;        // 100kbps,80%   
  25.     stcCanInit.stcBitCfg.u32TimeSeg1  = 16U;        
  26.     stcCanInit.stcBitCfg.u32TimeSeg2  = 4U;
  27.     stcCanInit.stcBitCfg.u32SJW       = 4U;
  28.     /*!< Only receives correct frames. */
  29.     stcCanInit.u8RxAllFrame           = CAN_RX_ALL_FRAME_DISABLE;
  30.     /*!< Saves the newly received data and the oldest frame will be overwritten. */
  31.     stcCanInit.u8RxOvfMode            = CAN_RX_OVF_SAVE_NEW;
  32.     stcCanInit.pstcFilter             = astcFilter;
  33.     stcCanInit.u16FilterSelect        = CAN1_FILTER_SEL;
  34.     stcCanInit.u8WorkMode             = CAN_WORK_MD_ELB;
  35.     if(stcCanInit.u8WorkMode == CAN_WORK_MD_NORMAL){
  36.         stcCanInit.u8SelfAck              = CAN_SELF_ACK_DISABLE;
  37.     }else if(stcCanInit.u8WorkMode == CAN_WORK_MD_ELB){
  38.         stcCanInit.u8SelfAck              = CAN_SELF_ACK_ENABLE;
  39.     }

  40.     /* Enable peripheral clock of CAN1. */
  41.     FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_CAN1, ENABLE);
  42.     (void)CAN_Init(CM_CAN1, &stcCanInit);
  43.     /* Enable the interrupts, the status flags can be read. */
  44. //    CAN_IntCmd(CM_CAN1, CAN_INT_ALL, DISABLE);
  45. //    CAN_IntCmd(CM_CAN1, CAN_INT_RX | CAN_INT_ERR_INT, ENABLE);      
  46.     CAN_IntCmd(CM_CAN1, CAN_INT_ALL, ENABLE);

  47.     stcIrq.enIntSrc    = CAN1_INT_SRC;
  48.     stcIrq.enIRQn      = CAN1_INT_IRQn;
  49.     stcIrq.pfnCallback = &CAN1_IrqCallback;
  50.     INTC_IrqInstalHandler(&stcIrq, DDL_IRQ_PRIO_DEFAULT);
尝试将SMAJ7.0CA和共模电感去掉,仍然无用。实在没有调试方向了,特来求助大佬。
有没有大佬能够给点指点?
 楼主| pengjun85 发表于 2025-6-28 15:34 | 显示全部楼层
查到原因了,把CA-is3062w的47uf更换为10uF就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部