中级会员 
   
	- 积分
 - 203
 
        - 金钱
 - 203 
 
       - 注册时间
 - 2018-6-13
 
      - 在线时间
 - 27 小时
 
 
 
 | 
 
5金钱 
板:两块stm32h750VBcan芯片:microchip MCP2562FD,支持 2,5,8Mbps 
 
两板信号各有2个6N137隔离光耦 
 
问题:FDCAN时钟80Mhz,当FDCAN仲裁段波特率设为1Mbps,数据段波特率设为2Mbps,运行正常,当FDCAN数据段波特率继续上调至5Mbps或者8Mbps时,正常模式出现通讯异常,然后将模式改为外部环回模式,接收板接收到了信号。查看单片机应用手册,外部环回模式会忽视ACK错误。应该是接收板应答问题,有大神能讲解一下吗。对FDCAN这么多寄存器不是很了解,这大概是哪方面导致的。 
 
代码: 
初始化部分 
void MX_FDCAN2_Init(void) 
{ 
  /* USER CODE BEGIN FDCAN2_Init 0 */ 
        FDCAN_FilterTypeDef sFilterConfig; 
  /* USER CODE END FDCAN2_Init 0 */ 
  /* USER CODE BEGIN FDCAN2_Init 1 */ 
  /* USER CODE END FDCAN2_Init 1 */ 
  hfdcan2.Instance = FDCAN2; 
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_BRS; 
  //hfdcan2.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK; 
        hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; 
  hfdcan2.Init.AutoRetransmission = ENABLE; 
  hfdcan2.Init.TransmitPause = DISABLE; 
  hfdcan2.Init.ProtocolException = ENABLE; 
  hfdcan2.Init.NominalPrescaler = 1; 
  hfdcan2.Init.NominalSyncJumpWidth = 15; 
  hfdcan2.Init.NominalTimeSeg1 = 64; 
  hfdcan2.Init.NominalTimeSeg2 = 15; 
  hfdcan2.Init.DataPrescaler = 1; 
  hfdcan2.Init.DataSyncJumpWidth = 2; 
  hfdcan2.Init.DataTimeSeg1 = 7; 
  hfdcan2.Init.DataTimeSeg2 = 2; 
  hfdcan2.Init.MessageRAMOffset = 0; 
  hfdcan2.Init.StdFiltersNbr = 1; 
  hfdcan2.Init.ExtFiltersNbr = 0; 
  hfdcan2.Init.RxFifo0ElmtsNbr = 2; 
  hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; 
  hfdcan2.Init.RxFifo1ElmtsNbr = 0; 
  hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; 
  hfdcan2.Init.RxBuffersNbr = 0; 
  hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8; 
  hfdcan2.Init.TxEventsNbr = 0; 
  hfdcan2.Init.TxBuffersNbr = 0; 
  hfdcan2.Init.TxFifoQueueElmtsNbr = 2; 
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; 
  hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8; 
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) 
  { 
    Error_Handler(); 
  } 
  /* USER CODE BEGIN FDCAN2_Init 2 */ 
        sFilterConfig.IdType = FDCAN_STANDARD_ID; 
        sFilterConfig.FilterIndex = 0; 
        sFilterConfig.FilterType = FDCAN_FILTER_RANGE; 
        sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; 
        sFilterConfig.FilterID1 = 0x00; 
        sFilterConfig.FilterID2 = 0x04; 
        HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig); 
        HAL_FDCAN_ConfigFifoWatermark(&hfdcan2,FDCAN_CFG_RX_FIFO0,1); 
        HAL_FDCAN_ActivateNotification(&hfdcan2,FDCAN_IT_RX_FIFO0_WATERMARK,0); 
        HAL_FDCAN_Start(&hfdcan2); 
  /* USER CODE END FDCAN2_Init 2 */ 
} 
 
发送部分: 
if(len>8) 
                dl = FDCAN_DLC_BYTES_8; 
                else 
                        dl = ((uint32_t)len) << 16; 
                pTxHeader.Identifier = 1; 
                pTxHeader.IdType = FDCAN_STANDARD_ID; 
                pTxHeader.TxFrameType = FDCAN_DATA_FRAME; 
                pTxHeader.DataLength =  dl; 
                pTxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; 
                pTxHeader.BitRateSwitch = FDCAN_BRS_ON; 
                pTxHeader.FDFormat = FDCAN_FD_CAN; 
                pTxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; 
                pTxHeader.MessageMarker = 0; 
                HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &pTxHeader, can_tx_buf); 
 
接收部分: 
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) 
{ 
        FDCAN_RxHeaderTypeDef pRxHeader; 
        if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != 0) 
        { 
                if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &pRxHeader, can_rx_buf) == HAL_OK) 
                { 
                        HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_WATERMARK,0); 
                        cmd = can_rx_buf[0]; 
                        len = pRxHeader.DataLength >> 16; 
                        id = (uint8_t)pRxHeader.Identifier; 
                        switch(cmd) 
                        { 
                                case 1        :        
                                                                                                                break; 
                                case 2        :        
                                                                                                                break; 
                                case 3: 
                                                                                                                break; 
                                case 4        :        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); 
                                                                                                                break; 
                                case 5        :        
                                                                                                                break; 
                                case 9 : 
                                                                                                                break; 
                        } 
                } 
        } 
} 
 
FDCAN时钟
 
 
应用手册描述 
 
 
外部环回模式波形 (数据段8Mbps) 
 
 
正常模式波形+FDCAN自动重发(数据段8Mbps) 
 
 
 
 
 
 
 |   
 
 
 
 
 
 |