OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5110|回复: 2

FDCAN 可变波特率全速模式 问题

[复制链接]

10

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2018-6-13
在线时间
27 小时
发表于 2022-4-23 14:02:06 | 显示全部楼层 |阅读模式
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时钟 微信截图_20220423132749.png
应用手册描述
微信截图_20220423133947.png
外部环回模式波形 (数据段8Mbps)
微信截图_20220423134615.png
正常模式波形+FDCAN自动重发(数据段8Mbps)
微信截图_20220423134901.png




最佳答案

查看完整内容[请看2#楼]

忘记结贴了,是6n137光耦不够快导致 两端ack信号延时过长导致的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2018-6-13
在线时间
27 小时
 楼主| 发表于 2022-4-23 14:02:07 | 显示全部楼层
忘记结贴了,是6n137光耦不够快导致 两端ack信号延时过长导致的
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-4-23 14:56:59 | 显示全部楼层
帮顶            
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表