各位老铁,我使用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和共模电感去掉,仍然无用。实在没有调试方向了,特来求助大佬。
有没有大佬能够给点指点?
|