硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1244|回复: 6
收起左侧

[CAN/FDCAN] FDCAN 全速模式 问题

[复制链接]

16

主题

62

回帖

110

积分

初级会员

积分
110
发表于 2022-4-23 13:54:09 | 显示全部楼层 |阅读模式
板:两块stm32h750VBcan芯片:microchip MCP2562FD,支持 2,5,8Mbps

两板信号各有2个6N137隔离光耦

问题:当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
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-4-23 14:13:57 | 显示全部楼层
这个光耦隔离的收发速度可以吧。

我们TOOL的测试过5Msps,没问题。

实际测试STM32H7的FDCAN数据段5Mbps,仲裁段1Mbps速度没问题
https://www.armbbs.cn/forum.php? ... 0267&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

16

主题

62

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2022-4-23 15:57:02 | 显示全部楼层
eric2013 发表于 2022-4-23 14:13
这个光耦隔离的收发速度可以吧。

我们TOOL的测试过5Msps,没问题。

我第一时间也觉得是光耦,现在不隔离去掉光耦也还有这个问题,硬汉哥看上面FDCAN程序部分有问题吗?有测试过stm32数据段8Mbps可行吗。
回复

使用道具 举报

16

主题

62

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2022-4-23 16:28:20 | 显示全部楼层
eric2013 发表于 2022-4-23 14:13
这个光耦隔离的收发速度可以吧。

我们TOOL的测试过5Msps,没问题。

前面有点测试问题,好像上电之后马上发送,这个can芯片就有点问题,加了个软件延时,然后去掉光耦隔离,5Mbps没问题,但是8Mbps还是不行
微信截图_20220423162514.png
硬汉哥stm32的FDCAN可能上8Mbps吗,现在一帧40us还是不够快、
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-4-23 17:05:06 | 显示全部楼层
opsd999 发表于 2022-4-23 16:28
前面有点测试问题,好像上电之后马上发送,这个can芯片就有点问题,加了个软件延时,然后去掉光耦隔离,5 ...

8Msps好像不行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-4-23 17:10:54 | 显示全部楼层
opsd999 发表于 2022-4-23 16:28
前面有点测试问题,好像上电之后马上发送,这个can芯片就有点问题,加了个软件延时,然后去掉光耦隔离,5 ...

可以试试CAN FD SiC,这个是专门整8Msps用的,干扰小,稳定性好。

https://www.nxp.com/products/int ... mprovement:CAN-FD#/

下一代的CAN XL也行,支持10Msps,不知道现在有产品上市没
回复

使用道具 举报

16

主题

62

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2022-4-24 09:56:08 | 显示全部楼层
eric2013 发表于 2022-4-23 17:10
可以试试CAN FD SiC,这个是专门整8Msps用的,干扰小,稳定性好。

https://www.nxp.com/products/inte ...

好的感谢。重新仔细看了MCP2562FD的手册,被忽悠的感觉。特性上写着,对2、5、8Mbps操作 进行了优化,下面最大bit速率居然是5Mhz
微信截图_20220424095210.png

微信截图_20220424095239.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 01:10 , Processed in 0.322536 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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