跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. FlexCAN初始化注意事项

FlexCAN初始化注意事项

已定时 已固定 已锁定 已移动 已解决 YT SDK
9 帖子 5 发布者 5.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • yt0069Y 离线
    yt0069Y 离线
    yt0069 YunTu
    写于 最后由 编辑
    #1

    SDK中FlexCAN初始化注意事项:
    如果采用中断方式收发,注册回调函数FLEXCAN_DRV_InstallEventCallback和FLEXCAN_DRV_InstallErrorCallback,以及mailbox或fifo,滤波器的初始化需要放在启动接收函数之前
    2b6bee4a-9992-41bc-8e4d-7f507adf0637-image.png
    例如,以下为不太合理的邮箱初始化程序:

    /* Config rx messages mailbox */
            for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++)
            {
                /* Config rx buffer */
                status = CAN_ConfigRxBuff(&can_pal_instance,
                                          index,
                                          &Appl_Can_StdIdBuffCfg,
                                          (uint32_t)Appl_Can_NodeRxMsgPtr[canNodeIndex][index].id);
                /* start to receive message */
                status = CAN_Receive(&can_pal_instance,
                                     index,
                                     (can_message_t *)&Appl_Can_NodeRxMsgPtr[canNodeIndex][index]);
            }
    

    应更改为:

    /* Config rx messages mailbox */
            for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++)
            {
                /* Config rx buffer */
                status = CAN_ConfigRxBuff(&can_pal_instance,
                                          index,
                                          &Appl_Can_StdIdBuffCfg,
                                          (uint32_t)Appl_Can_NodeRxMsgPtr[canNodeIndex][index].id);
            }
            for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++)
            {
                 /* start to receive message */
                status = CAN_Receive(&can_pal_instance,
                                     index,
                                     (can_message_t *)&Appl_Can_NodeRxMsgPtr[canNodeIndex][index]);
            }
    
    EkkoE 1 条回复 最后回复
    1
    • runR 离线
      runR 离线
      run YunTu
      写于 最后由 run 编辑
      #9

      配置顺序:

      1. 先配置所有需要配置的邮箱的独立掩码(如果需要):
        FLEXCAN_DRV_SetRxMaskType(instance, FLEXCAN_RX_MASK_INDIVIDUAL);
        FLEXCAN_DRV_SetRxIndividualMask();

      2. 再配置所有需要配置的邮箱Mailbox
        FLEXCAN_DRV_ConfigRxMb();

      3. 安装中断回调函数
        FLEXCAN_DRV_InstallEventCallback();
        FLEXCAN_DRV_InstallErrorCallback();

      4. 最后启动接收(使能邮箱中断)
        FLEXCAN_DRV_Receive();

      示例:

      /* Set the individual mask type */
      FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
      
      /* Set standard individual mask, bit 0-11 Optional, this example STD_ID 0x700U - 0x7FFU will be receive */
      FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, RX_STD_MAILBOX, 0xF00U);
      /* Set extended individual mask, bit 0-28 Optional, this example EXD_ID 0x18C00100U - 0x18C001FFU will be receive */
      FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_EXT, RX_EXT_MAILBOX, 0x1FFFFF00U);
      
      /* After configure all individual masks, then congigure rx mailbox */
      status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_STD_MAILBOX, &rxMbStdInfo, RX_STD_MSG_ID);
      status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_EXT_MAILBOX, &rxMbExtInfo, RX_EXTMSG_ID);
      
      /* Install rx callback */
      FLEXCAN_DRV_InstallEventCallback(CAN_INST, DRV_CAN_RxEventCall, NULL);
      FLEXCAN_DRV_InstallErrorCallback(CAN_INST, DRV_CAN_ErrorCall, NULL);
      
      /* Start receiving data in RX_STD/EXT_MAILBOX. */
      status |= FLEXCAN_DRV_Receive(CAN_INST, RX_STD_MAILBOX, &rxStdMsg);
      status |= FLEXCAN_DRV_Receive(CAN_INST, RX_EXT_MAILBOX, &rxExtMsg);
      
      1 条回复 最后回复
      0
      • qinhongkuiQ 离线
        qinhongkuiQ 离线
        qinhongkui
        写于 最后由 编辑
        #2

        楼主有CAN中断接收的demo吗?

        YQHY 2 条回复 最后回复
        -1
        • YQHY 离线
          YQHY 离线
          YQH YunTu
          在 回复了 qinhongkui 最后由 编辑
          #3
          此主題已被删除!
          qinhongkuiQ 1 条回复 最后回复
          0
          • qinhongkuiQ 离线
            qinhongkuiQ 离线
            qinhongkui
            在 回复了 YQH 最后由 qinhongkui 编辑
            #4

            YQH 非常谢谢

            1 条回复 最后回复
            0
            • EkkoE 离线
              EkkoE 离线
              Ekko
              在 回复了 yt0069 最后由 编辑
              #5

              yt0069 如果注册回调函数放在接收函数之后,可能会出现什么情况,目前有客户这样做,会偶发出现固定接收不到某一个ID,我帮他修改初始化流程之后,目前还没复现,想确认一下原理。

              YQHY 1 条回复 最后回复
              0
              • YQHY 离线
                YQHY 离线
                YQH YunTu
                在 回复了 Ekko 最后由 编辑
                #6

                Ekko 客户是什么用法,是在总线已有其他节点发报文的情况下再接入自己的控制器时出现某个报文接收不到的情况吗

                EkkoE 1 条回复 最后回复
                0
                • EkkoE 离线
                  EkkoE 离线
                  Ekko
                  在 回复了 YQH 最后由 编辑
                  #7

                  YQH 目前测试情况是通过CANOE一直在发报文,MCU重复上电,偶发出现

                  1 条回复 最后回复
                  0
                  • YQHY 离线
                    YQHY 离线
                    YQH YunTu
                    在 回复了 qinhongkui 最后由 编辑
                    #8

                    qinhongkui
                    CAN_INT_Demo.zip

                    1 条回复 最后回复
                    0
                    • yt0069Y yt0069 在 中 引用了 这个主题
                    • ganyongchaoG ganyongchao 在 中 引用了 这个主题
                    • runR 离线
                      runR 离线
                      run YunTu
                      写于 最后由 run 编辑
                      #9

                      配置顺序:

                      1. 先配置所有需要配置的邮箱的独立掩码(如果需要):
                        FLEXCAN_DRV_SetRxMaskType(instance, FLEXCAN_RX_MASK_INDIVIDUAL);
                        FLEXCAN_DRV_SetRxIndividualMask();

                      2. 再配置所有需要配置的邮箱Mailbox
                        FLEXCAN_DRV_ConfigRxMb();

                      3. 安装中断回调函数
                        FLEXCAN_DRV_InstallEventCallback();
                        FLEXCAN_DRV_InstallErrorCallback();

                      4. 最后启动接收(使能邮箱中断)
                        FLEXCAN_DRV_Receive();

                      示例:

                      /* Set the individual mask type */
                      FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
                      
                      /* Set standard individual mask, bit 0-11 Optional, this example STD_ID 0x700U - 0x7FFU will be receive */
                      FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, RX_STD_MAILBOX, 0xF00U);
                      /* Set extended individual mask, bit 0-28 Optional, this example EXD_ID 0x18C00100U - 0x18C001FFU will be receive */
                      FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_EXT, RX_EXT_MAILBOX, 0x1FFFFF00U);
                      
                      /* After configure all individual masks, then congigure rx mailbox */
                      status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_STD_MAILBOX, &rxMbStdInfo, RX_STD_MSG_ID);
                      status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_EXT_MAILBOX, &rxMbExtInfo, RX_EXTMSG_ID);
                      
                      /* Install rx callback */
                      FLEXCAN_DRV_InstallEventCallback(CAN_INST, DRV_CAN_RxEventCall, NULL);
                      FLEXCAN_DRV_InstallErrorCallback(CAN_INST, DRV_CAN_ErrorCall, NULL);
                      
                      /* Start receiving data in RX_STD/EXT_MAILBOX. */
                      status |= FLEXCAN_DRV_Receive(CAN_INST, RX_STD_MAILBOX, &rxStdMsg);
                      status |= FLEXCAN_DRV_Receive(CAN_INST, RX_EXT_MAILBOX, &rxExtMsg);
                      
                      1 条回复 最后回复
                      0
                      • yt0069Y yt0069 在 中 引用了 这个主题
                      • ,FrankieF Frankie 将这个主题转为问答主题
                      • ,FrankieF Frankie 将这个主题标记为已解决

                    • 云途开发生态介绍

                      快速上手云途开发生态

                    • 云途论坛规则/Yuntu Forum Rules

                      发帖前请查看

                    • YT CONFIG TOOL调查问卷

                      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                    • can
                      26
                      demo
                      23
                      lin stack
                      13
                      uds
                      13
                      md14
                      6
                      yt-link
                      6
                      fbl
                      5
                      adc模块
                      4
                      Online Users
                      • 登录

                      • 登录或注册以进行搜索。
                      • 第一个帖子
                        最后一个帖子
                      0
                      • 版块
                      • 最新
                      • 标签
                      • 热门