硬汉嵌入式论坛

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

[CAN/FDCAN] FDCAN只能发送成功1次

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2024-8-13 17:22:41 | 显示全部楼层 |阅读模式
请问,我用STM32H743IIT6 测试FDCAN时,用的FDCAN1,只能发送成功1次,再次发送时,总是报HAL_FDCAN_ERROR_FIFO_FULL ,不知道是怎么回事,希望高手帮助,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-14 08:58:18 | 显示全部楼层
方便的话,分享配置代码看下。

回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-8-14 09:08:46 | 显示全部楼层
uint8_t fdcan_init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode)
{
    FDCAN_FilterTypeDef fdcan_filterconfig;

    HAL_FDCAN_DeInit(&g_fdcanx_handle);                              /* ÏÈÇå³ýÒÔǰµÄÉèÖà */
    g_fdcanx_handle.Instance = FDCAN1;
    g_fdcanx_handle.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* λËÙÂʱ任FDCANģʽ */
    g_fdcanx_handle.Init.Mode = mode;                                /* ģʽÉèÖà */
    g_fdcanx_handle.Init.AutoRetransmission = DISABLE;                /* ʹÄÜ×Ô¶¯ÖØ´«£¡´«Í³Ä£Ê½ÏÂÒ»¶¨Òª¹Ø±Õ£¡£¡£¡ */
    g_fdcanx_handle.Init.TransmitPause = DISABLE;                     /* ʹÄÜ´«ÊäÔÝÍ£ */
    g_fdcanx_handle.Init.ProtocolException = DISABLE;                /* ¹Ø±ÕЭÒéÒì³£´¦Àí */
    /* FDCANÖÐÖٲöÎλËÙÂÊ×î¸ß1Mbit/s, Êý¾Ý¶ÎλËÙÂÊ×î¸ß8Mbit/s */
    /* Êý¾Ý¶ÎͨÐÅËÙÂÊ£¨½öFDCANģʽÐèÅäÖã© = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */
    g_fdcanx_handle.Init.DataPrescaler = presc;//10;                 /* Êý¾Ý¶Î·ÖƵϵÊý·¶Î§:1~32  */
    g_fdcanx_handle.Init.DataSyncJumpWidth = 16;                     /* Êý¾Ý¶ÎÖØÐÂͬ²½ÌøÔ¾¿í¶È1~16 */
    g_fdcanx_handle.Init.DataTimeSeg1 = 10;//2;                           /* Êý¾Ý¶Îdsg1·¶Î§:1~32  5 */
    g_fdcanx_handle.Init.DataTimeSeg2 = 9;//1;                           /* Êý¾Ý¶Îdsg2·¶Î§:1~16  1 */
   
    /* ÖٲöÎͨÐÅËÙÂÊ£¨FDCANÓ봫ͳCAN¾ùÐèÅäÖã© = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */
    g_fdcanx_handle.Init.NominalPrescaler = presc;                   /* ·ÖƵϵÊý */
    g_fdcanx_handle.Init.NominalSyncJumpWidth = tsjw;                /* ÖØÐÂͬ²½ÌøÔ¾¿í¶È */
    g_fdcanx_handle.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1·¶Î§£º2~256 */
    g_fdcanx_handle.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2·¶Î§£º2~128 */
   
    g_fdcanx_handle.Init.MessageRAMOffset = 0;                       /* ÐÅÏ¢RAMÆ«ÒÆ */
    g_fdcanx_handle.Init.StdFiltersNbr = 28;                         /* ±ê×¼ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
    g_fdcanx_handle.Init.ExtFiltersNbr = 8;                          /* À©Õ¹ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
    g_fdcanx_handle.Init.RxFifo0ElmtsNbr = 1;                        /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
    g_fdcanx_handle.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;       /* ½ÓÊÕFIFO0ÔªËØ´óС£º8×Ö½Ú */
    g_fdcanx_handle.Init.RxBuffersNbr = 0;                           /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
    g_fdcanx_handle.Init.TxEventsNbr = 0;                            /* ·¢ËÍʼþ±àºÅ */
    g_fdcanx_handle.Init.TxBuffersNbr = 0;                           /* ·¢ËÍ»º³å±àºÅ */
    g_fdcanx_handle.Init.TxFifoQueueElmtsNbr = 1;                    /* ·¢ËÍFIFOÐòÁÐÔªËØ±àºÅ */
    g_fdcanx_handle.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* ·¢ËÍFIFOÐòÁÐģʽ */
    g_fdcanx_handle.Init.TxElmtSize = FDCAN_DATA_BYTES_8;            /* ·¢ËÍ´óС:8×Ö½Ú */

    if (HAL_FDCAN_Init(&g_fdcanx_handle) != HAL_OK)
    {
        return 1;   /* ³õʼ»¯ */
    }

    /* ÅäÖÃCAN¹ýÂËÆ÷ */
    fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* ±ê×¼ID */
    fdcan_filterconfig.FilterIndex = 0;                              /* Â˲¨Æ÷Ë÷Òý */
    fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* Â˲¨Æ÷ÀàÐÍ */
    fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;       /* ¹ýÂËÆ÷0¹ØÁªµ½FIFO0 */
    fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32λID */
    fdcan_filterconfig.FilterID2 = 0x0000;                           /* Èç¹ûFDCANÅäÖÃΪ´«Í³Ä£Ê½µÄ»°£¬ÕâÀïÊÇ32λÑÚÂë */
   
    /* ¹ýÂËÆ÷ÅäÖà */
    if (HAL_FDCAN_ConfigFilter(&g_fdcanx_handle, &fdcan_filterconfig) != HAL_OK)
    {
        return 2;                                                    /* Â˲¨Æ÷³õʼ»¯ */
    }
    /* ÅäÖÃÈ«¾Ö¹ýÂËÆ÷,¾ÜÊÕËùÓв»Æ¥ÅäµÄ±ê×¼Ö¡»òÀ©Õ¹Ö¡ */
    if (HAL_FDCAN_ConfigGlobalFilter(&g_fdcanx_handle, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    {
        return 3;
    }
    /* Æô¶¯CANÍâΧÉ豸 */
    if (HAL_FDCAN_Start(&g_fdcanx_handle) != HAL_OK)
    {
        return 4;
    }

    HAL_FDCAN_ActivateNotification(&g_fdcanx_handle, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);

    return 0;
}
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-8-14 09:37:24 | 显示全部楼层
uint8_t fdcan_init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode)
{
    FDCAN_FilterTypeDef fdcan_filterconfig;

    HAL_FDCAN_DeInit(&g_fdcanx_handle);                              /* ÏÈÇå³ýÒÔǰµÄÉèÖà */
    g_fdcanx_handle.Instance = FDCAN1;
    g_fdcanx_handle.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* λËÙÂʱ任FDCANģʽ */
    g_fdcanx_handle.Init.Mode = mode;                                /* ģʽÉèÖà */
    g_fdcanx_handle.Init.AutoRetransmission = DISABLE;                /* ʹÄÜ×Ô¶¯ÖØ´«£¡´«Í³Ä£Ê½ÏÂÒ»¶¨Òª¹Ø±Õ£¡£¡£¡ */
    g_fdcanx_handle.Init.TransmitPause = DISABLE;                     /* ʹÄÜ´«ÊäÔÝÍ£ */
    g_fdcanx_handle.Init.ProtocolException = DISABLE;                /* ¹Ø±ÕЭÒéÒì³£´¦Àí */
    /* FDCANÖÐÖٲöÎλËÙÂÊ×î¸ß1Mbit/s, Êý¾Ý¶ÎλËÙÂÊ×î¸ß8Mbit/s */
    /* Êý¾Ý¶ÎͨÐÅËÙÂÊ£¨½öFDCANģʽÐèÅäÖã© = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */
    g_fdcanx_handle.Init.DataPrescaler = presc;//10;                 /* Êý¾Ý¶Î·ÖƵϵÊý·¶Î§:1~32  */
    g_fdcanx_handle.Init.DataSyncJumpWidth = 16;                     /* Êý¾Ý¶ÎÖØÐÂͬ²½ÌøÔ¾¿í¶È1~16 */
    g_fdcanx_handle.Init.DataTimeSeg1 = 10;//2;                           /* Êý¾Ý¶Îdsg1·¶Î§:1~32  5 */
    g_fdcanx_handle.Init.DataTimeSeg2 = 9;//1;                           /* Êý¾Ý¶Îdsg2·¶Î§:1~16  1 */
   
    /* ÖٲöÎͨÐÅËÙÂÊ£¨FDCANÓ봫ͳCAN¾ùÐèÅäÖã© = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */
    g_fdcanx_handle.Init.NominalPrescaler = presc;                   /* ·ÖƵϵÊý */
    g_fdcanx_handle.Init.NominalSyncJumpWidth = tsjw;                /* ÖØÐÂͬ²½ÌøÔ¾¿í¶È */
    g_fdcanx_handle.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1·¶Î§£º2~256 */
    g_fdcanx_handle.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2·¶Î§£º2~128 */
   
    g_fdcanx_handle.Init.MessageRAMOffset = 0;                       /* ÐÅÏ¢RAMÆ«ÒÆ */
    g_fdcanx_handle.Init.StdFiltersNbr = 28;                         /* ±ê×¼ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
    g_fdcanx_handle.Init.ExtFiltersNbr = 8;                          /* À©Õ¹ÐÅÏ¢IDÂ˲¨Æ÷±àºÅ */
    g_fdcanx_handle.Init.RxFifo0ElmtsNbr = 1;                        /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
    g_fdcanx_handle.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;       /* ½ÓÊÕFIFO0ÔªËØ´óС£º8×Ö½Ú */
    g_fdcanx_handle.Init.RxBuffersNbr = 0;                           /* ½ÓÊÕFIFO0ÔªËØ±àºÅ */
    g_fdcanx_handle.Init.TxEventsNbr = 0;                            /* ·¢ËÍʼþ±àºÅ */
    g_fdcanx_handle.Init.TxBuffersNbr = 0;                           /* ·¢ËÍ»º³å±àºÅ */
    g_fdcanx_handle.Init.TxFifoQueueElmtsNbr = 1;                    /* ·¢ËÍFIFOÐòÁÐÔªËØ±àºÅ */
    g_fdcanx_handle.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* ·¢ËÍFIFOÐòÁÐģʽ */
    g_fdcanx_handle.Init.TxElmtSize = FDCAN_DATA_BYTES_8;            /* ·¢ËÍ´óС:8×Ö½Ú */

    if (HAL_FDCAN_Init(&g_fdcanx_handle) != HAL_OK)
    {
        return 1;   /* ³õʼ»¯ */
    }

    /* ÅäÖÃCAN¹ýÂËÆ÷ */
    fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* ±ê×¼ID */
    fdcan_filterconfig.FilterIndex = 0;                              /* Â˲¨Æ÷Ë÷Òý */
    fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* Â˲¨Æ÷ÀàÐÍ */
    fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;       /* ¹ýÂËÆ÷0¹ØÁªµ½FIFO0 */
    fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32λID */
    fdcan_filterconfig.FilterID2 = 0x0000;                           /* Èç¹ûFDCANÅäÖÃΪ´«Í³Ä£Ê½µÄ»°£¬ÕâÀïÊÇ32λÑÚÂë */
   
    /* ¹ýÂËÆ÷ÅäÖà */
    if (HAL_FDCAN_ConfigFilter(&g_fdcanx_handle, &fdcan_filterconfig) != HAL_OK)
    {
        return 2;                                                    /* Â˲¨Æ÷³õʼ»¯ */
    }
    /* ÅäÖÃÈ«¾Ö¹ýÂËÆ÷,¾ÜÊÕËùÓв»Æ¥ÅäµÄ±ê×¼Ö¡»òÀ©Õ¹Ö¡ */
    if (HAL_FDCAN_ConfigGlobalFilter(&g_fdcanx_handle, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    {
        return 3;
    }
    /* Æô¶¯CANÍâΧÉ豸 */
    if (HAL_FDCAN_Start(&g_fdcanx_handle) != HAL_OK)
    {
        return 4;
    }

    HAL_FDCAN_ActivateNotification(&g_fdcanx_handle, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);

    return 0;
}
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-8-14 09:57:46 | 显示全部楼层
程序用的是论坛上下载的V7-085_双FDCAN之间通信(仲裁500K,通信1M)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-14 15:53:16 | 显示全部楼层
ljccl 发表于 2024-8-14 09:57
程序用的是论坛上下载的V7-085_双FDCAN之间通信(仲裁500K,通信1M)

我看下你的发送代码怎么写的,你可以发送一次,延迟1秒再话,看看是不是正常了,如果正常了,说明是你没有保证上次发送完毕就开启了新的发送。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-8-14 16:54:02 | 显示全部楼层
发送就是用的HAL库函数,程序没改
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-15 09:30:34 | 显示全部楼层
ljccl 发表于 2024-8-14 16:54
发送就是用的HAL库函数,程序没改

关键就是你这个发送代码,你现在是连续发送还是每次发送有个间隔。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-8-15 09:59:23 | 显示全部楼层
我试试加个间隔看看
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-9-24 15:52:50 | 显示全部楼层
问题解决了吗?
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-10-25 17:50:39 | 显示全部楼层
已经解决了,硬件接口芯片的问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-10-26 09:19:00 | 显示全部楼层
ljccl 发表于 2024-10-25 17:50
已经解决了,硬件接口芯片的问题

谢谢告知最终问题原因。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 19:26 , Processed in 0.293227 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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