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

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. 有无任意开发板的Flexcan_Legacyfifo的FLEXCAN_RX_FIFO_ID_FORMAT_B模式和FLEXCAN_RX_FIFO_ID_FORMAT_C模式例程或代码片段

有无任意开发板的Flexcan_Legacyfifo的FLEXCAN_RX_FIFO_ID_FORMAT_B模式和FLEXCAN_RX_FIFO_ID_FORMAT_C模式例程或代码片段

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

    最近使用FLEXCAN_RX_FIFO_ID_FORMAT_B模式发现实际现象与预期效果不一致,能否分享一下demo?如果有的话。谢谢

    1 条回复 最后回复
    0
    • yishui66Y 离线
      yishui66Y 离线
      yishui66
      在 回复了 yt0069 最后由 yishui66 编辑
      #4

      yt0069 感谢支持。以LE05开发板的Flexcan_Legacyfifo_Demo并使用标准帧为例。预期效果:标准帧ID低四位不进行匹配

      ①.现象:使用模式A时,独立掩码设置为0x1FFFFFF0U时,标准帧ID低四位不进行匹配。即可接受ID范围为0x730~0x73F的标准帧。--问题:独立掩码不应该设置成0xFF87FFFEU才能实现标准帧ID低四位不进行匹配吗?( RXIDA(standard = 29-19,extended = 29-1))

      ②.由①实际现象可得,独立掩码设置为0x1FFFFFF0U时 (RXIDB_0(standard = 29-19,extended = 29-16)),模式B也应该可以接受ID范围为0x730~0x73F的标准帧,但是实际上我只能接受0x737这一个标准帧ID。且我尝试修改了独立掩码的其他位,没有找到规律

      以下为我的main.c代码

      /* USER CODE END Header */
      #include "sdk_project_config.h"
      /* Includes ------------------------------------------------------------------*/
      
      /* Private includes ----------------------------------------------------------*/
      /* USER CODE BEGIN Includes */
      /* USER CODE END Includes */
      
      /* Private typedef -----------------------------------------------------------*/
      /* USER CODE BEGIN PTD */
      /* USER CODE END PTD */
      
      /* Private define ------------------------------------------------------------*/
      /* USER CODE BEGIN PD */
      #define CAN_INST (0U)
      
      #define TX_MSG_ID      (0x03UL)
      #define TX_MAILBOX     (0x08UL)
      #define RX_LEGACY_FIFO (0UL) /* can not modify */
      
      #define CAN0_RX_FIFO_FILTER_COUNT (8 * (FLEXCAN_RX_FIFO_ID_FILTERS_8 + 1))
      /* USER CODE END PD */
      
      /* Private macro -------------------------------------------------------------*/
      /* USER CODE BEGIN PM */
      /* USER CODE END PM */
      
      /* Private variables ---------------------------------------------------------*/
      /* USER CODE BEGIN PV */
      //const flexcan_data_info_t rxMbStdInfo = {
      //    .msg_id_type = FLEXCAN_MSG_ID_EXT,
      //    .data_length = 8,
      //    .fd_enable = false,
      //    .fd_padding = 0,
      //    .enable_brs = false,
      //    .is_remote = false,
      //};
      const flexcan_data_info_t txMbStdInfo = {
          .msg_id_type = FLEXCAN_MSG_ID_STD,
          .data_length = 8,
          .fd_enable = false,
          .fd_padding = 0,
          .enable_brs = false,
          .is_remote = false,
      };
      
      const uint32_t rxFifoAccId[CAN0_RX_FIFO_FILTER_COUNT] = {
          0x0C1001F0U, 0x0C1002F0U, 0x0C0803A5U, 0x0C1004F0U, 0x0C1005E0U, 0x0C1006F3U, 0x0C1007F0U, 0x737U,
      };
      /* Define receive buffer */
      flexcan_msgbuff_t rxMsg;
      /* Prepare message to be sent */
      flexcan_msgbuff_t txMsg = {
          .cs = 0U,
          .msgId = TX_MSG_ID,
          .data[0] = 0x00,
          .dataLen = 8U,
      };
      flexcan_id_table_t rxFifoFilterAccInfo[CAN0_RX_FIFO_FILTER_COUNT];
      /* USER CODE END PV */
      
      /* Private function declare --------------------------------------------------*/
      /* USER CODE BEGIN PFDC */
      /* USER CODE END PFDC */
      static void Board_Init(void);
      
      /* Private user code ---------------------------------------------------------*/
      /* USER CODE BEGIN 0 */
      /* USER CODE END 0 */
      
      
      /**
       * @brief  The application entry point.
       * @retval int
       */
      int main(void)
      {
          /* USER CODE BEGIN 1 */
          status_t status = STATUS_SUCCESS;
          int32_t offset = 0;
          uint8_t fifoFrameCnt = 0;
          /* USER CODE END 1 */ 
          Board_Init();
          /* USER CODE BEGIN 2 */
          PRINTF("Build %s %s\r\n", __DATE__, __TIME__);
          PRINTF("<----Flexcan legacy fifo demo---->\r\n");
          /* Init rx fifo filter table acceptence code */
          for (uint8_t i = 0; i < 7; i++)
          {
              rxFifoFilterAccInfo[i].isRemoteFrame = false;
              rxFifoFilterAccInfo[i].isExtendedFrame = true;
              rxFifoFilterAccInfo[i].id = rxFifoAccId[i];
          }
      		
              rxFifoFilterAccInfo[7].isRemoteFrame = false;
              rxFifoFilterAccInfo[7].isExtendedFrame = false;
              rxFifoFilterAccInfo[7].id = rxFifoAccId[7];
          /* Can init */
          status |= FLEXCAN_DRV_Init(CAN_INST, &flexcanInitConfig0_State, &flexcanInitConfig0);
      		
      //		FLEXCAN_DRV_ConfigRxFifo(CAN_INST, FLEXCAN_RX_FIFO_ID_FORMAT_A, rxFifoFilterAccInfo);
      //		FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
      //		for(uint8_t i=0;i<7;i++)
      //	 {
      //		 FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,i, 0x1FFFFFFFU);
      //   }
      //		FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, 7, 0x1FFFFFF0U); //0xFF87FFFEU
      		
          FLEXCAN_DRV_ConfigRxFifo(CAN_INST, FLEXCAN_RX_FIFO_ID_FORMAT_B, rxFifoFilterAccInfo);
          FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
          for(uint8_t i=0;i<7;i++)
          {
             FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,i, 0x1FFFFFFFU);
          }
          FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, 7, 0x1FFFFFF0U);
      		
          /* Configure TX buffer with index TX_MAILBOX*/
          status |= FLEXCAN_DRV_ConfigTxMb(CAN_INST, TX_MAILBOX, &txMbStdInfo, TX_MSG_ID);
          /* Start receiving data in RX_STD_MAILBOX. */
          status |= FLEXCAN_DRV_RxFifo(CAN_INST, &rxMsg);
      		
      		
          while (1)
          {
      //        if (FLEXCAN_DRV_GetTransferStatus(CAN_INST, TX_MAILBOX) != STATUS_BUSY)
      //        {
      //            /* Configure sending data bytes */
      //            for (int i = 0; i < 8; i++)
      //            {
      //                txMsg.data[i] = offset + i;
      //            }
      //            offset++;
      //            /* Send the information via CAN */
      //            status |= FLEXCAN_DRV_Send(CAN_INST, TX_MAILBOX, &txMbStdInfo, TX_MSG_ID, txMsg.data);
      //        }
              if (FLEXCAN_DRV_GetTransferStatus(CAN_INST, RX_LEGACY_FIFO) != STATUS_BUSY)
              {
                  fifoFrameCnt++;
                  /* For concise output on UART, only print data[0] */
                  PRINTF("\nRx length= %d, id = %x, data[0] = %x:\r\n", rxMsg.dataLen, rxMsg.msgId, rxMsg.data[0]);
                  /* start to receive new data */
                  status |= FLEXCAN_DRV_RxFifo(CAN_INST, &rxMsg);
              }
      //        if (fifoFrameCnt >= 10)
      //        {
      //            break;
      //        }
              /* send data every 100ms */
              OSIF_TimeDelay(100);
          }
          PRINTF("\n\n");
          PRINTF("Total %d frames legacy fifo has received.\n", fifoFrameCnt);
          PRINTF("<----Demo end---->\n");
          /* USER CODE END 2 */
      
          /* Infinite loop */
          /* USER CODE BEGIN WHILE */
          while (1)
          {
              if (status != STATUS_SUCCESS)
              {
                  break;
              }
              /* USER CODE END WHILE */
              /* USER CODE BEGIN 3 */
          }
          /* USER CODE END 3 */
      }
      
      static void Board_Init(void)
      {
          CLOCK_SYS_Init(g_clockManConfigsArr,CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr,CLOCK_MANAGER_CALLBACK_CNT);
          CLOCK_SYS_UpdateConfiguration(CLOCK_MANAGER_ACTIVE_INDEX,CLOCK_MANAGER_POLICY_AGREEMENT);
          PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0,g_pin_mux_InitConfigArr0);
          UTILITY_PRINT_Init();
      }
      
      1 条回复 最后回复
      0
      • yishui66Y 离线
        yishui66Y 离线
        yishui66
        写于 最后由 编辑
        #2

        是不是无法使用FLEXCAN_RX_FIFO_ID_FORMAT_B模式?

        1 条回复 最后回复
        0
        • yt0069Y 离线
          yt0069Y 离线
          yt0069 YunTu
          写于 最后由 编辑
          #3

          可以使用format_b模式,能具体描述以下实际现象与预期效果不一致的现象吗

          yishui66Y 1 条回复 最后回复
          0
          • yishui66Y 离线
            yishui66Y 离线
            yishui66
            在 回复了 yt0069 最后由 yishui66 编辑
            #4

            yt0069 感谢支持。以LE05开发板的Flexcan_Legacyfifo_Demo并使用标准帧为例。预期效果:标准帧ID低四位不进行匹配

            ①.现象:使用模式A时,独立掩码设置为0x1FFFFFF0U时,标准帧ID低四位不进行匹配。即可接受ID范围为0x730~0x73F的标准帧。--问题:独立掩码不应该设置成0xFF87FFFEU才能实现标准帧ID低四位不进行匹配吗?( RXIDA(standard = 29-19,extended = 29-1))

            ②.由①实际现象可得,独立掩码设置为0x1FFFFFF0U时 (RXIDB_0(standard = 29-19,extended = 29-16)),模式B也应该可以接受ID范围为0x730~0x73F的标准帧,但是实际上我只能接受0x737这一个标准帧ID。且我尝试修改了独立掩码的其他位,没有找到规律

            以下为我的main.c代码

            /* USER CODE END Header */
            #include "sdk_project_config.h"
            /* Includes ------------------------------------------------------------------*/
            
            /* Private includes ----------------------------------------------------------*/
            /* USER CODE BEGIN Includes */
            /* USER CODE END Includes */
            
            /* Private typedef -----------------------------------------------------------*/
            /* USER CODE BEGIN PTD */
            /* USER CODE END PTD */
            
            /* Private define ------------------------------------------------------------*/
            /* USER CODE BEGIN PD */
            #define CAN_INST (0U)
            
            #define TX_MSG_ID      (0x03UL)
            #define TX_MAILBOX     (0x08UL)
            #define RX_LEGACY_FIFO (0UL) /* can not modify */
            
            #define CAN0_RX_FIFO_FILTER_COUNT (8 * (FLEXCAN_RX_FIFO_ID_FILTERS_8 + 1))
            /* USER CODE END PD */
            
            /* Private macro -------------------------------------------------------------*/
            /* USER CODE BEGIN PM */
            /* USER CODE END PM */
            
            /* Private variables ---------------------------------------------------------*/
            /* USER CODE BEGIN PV */
            //const flexcan_data_info_t rxMbStdInfo = {
            //    .msg_id_type = FLEXCAN_MSG_ID_EXT,
            //    .data_length = 8,
            //    .fd_enable = false,
            //    .fd_padding = 0,
            //    .enable_brs = false,
            //    .is_remote = false,
            //};
            const flexcan_data_info_t txMbStdInfo = {
                .msg_id_type = FLEXCAN_MSG_ID_STD,
                .data_length = 8,
                .fd_enable = false,
                .fd_padding = 0,
                .enable_brs = false,
                .is_remote = false,
            };
            
            const uint32_t rxFifoAccId[CAN0_RX_FIFO_FILTER_COUNT] = {
                0x0C1001F0U, 0x0C1002F0U, 0x0C0803A5U, 0x0C1004F0U, 0x0C1005E0U, 0x0C1006F3U, 0x0C1007F0U, 0x737U,
            };
            /* Define receive buffer */
            flexcan_msgbuff_t rxMsg;
            /* Prepare message to be sent */
            flexcan_msgbuff_t txMsg = {
                .cs = 0U,
                .msgId = TX_MSG_ID,
                .data[0] = 0x00,
                .dataLen = 8U,
            };
            flexcan_id_table_t rxFifoFilterAccInfo[CAN0_RX_FIFO_FILTER_COUNT];
            /* USER CODE END PV */
            
            /* Private function declare --------------------------------------------------*/
            /* USER CODE BEGIN PFDC */
            /* USER CODE END PFDC */
            static void Board_Init(void);
            
            /* Private user code ---------------------------------------------------------*/
            /* USER CODE BEGIN 0 */
            /* USER CODE END 0 */
            
            
            /**
             * @brief  The application entry point.
             * @retval int
             */
            int main(void)
            {
                /* USER CODE BEGIN 1 */
                status_t status = STATUS_SUCCESS;
                int32_t offset = 0;
                uint8_t fifoFrameCnt = 0;
                /* USER CODE END 1 */ 
                Board_Init();
                /* USER CODE BEGIN 2 */
                PRINTF("Build %s %s\r\n", __DATE__, __TIME__);
                PRINTF("<----Flexcan legacy fifo demo---->\r\n");
                /* Init rx fifo filter table acceptence code */
                for (uint8_t i = 0; i < 7; i++)
                {
                    rxFifoFilterAccInfo[i].isRemoteFrame = false;
                    rxFifoFilterAccInfo[i].isExtendedFrame = true;
                    rxFifoFilterAccInfo[i].id = rxFifoAccId[i];
                }
            		
                    rxFifoFilterAccInfo[7].isRemoteFrame = false;
                    rxFifoFilterAccInfo[7].isExtendedFrame = false;
                    rxFifoFilterAccInfo[7].id = rxFifoAccId[7];
                /* Can init */
                status |= FLEXCAN_DRV_Init(CAN_INST, &flexcanInitConfig0_State, &flexcanInitConfig0);
            		
            //		FLEXCAN_DRV_ConfigRxFifo(CAN_INST, FLEXCAN_RX_FIFO_ID_FORMAT_A, rxFifoFilterAccInfo);
            //		FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
            //		for(uint8_t i=0;i<7;i++)
            //	 {
            //		 FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,i, 0x1FFFFFFFU);
            //   }
            //		FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, 7, 0x1FFFFFF0U); //0xFF87FFFEU
            		
                FLEXCAN_DRV_ConfigRxFifo(CAN_INST, FLEXCAN_RX_FIFO_ID_FORMAT_B, rxFifoFilterAccInfo);
                FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL);
                for(uint8_t i=0;i<7;i++)
                {
                   FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,i, 0x1FFFFFFFU);
                }
                FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, 7, 0x1FFFFFF0U);
            		
                /* Configure TX buffer with index TX_MAILBOX*/
                status |= FLEXCAN_DRV_ConfigTxMb(CAN_INST, TX_MAILBOX, &txMbStdInfo, TX_MSG_ID);
                /* Start receiving data in RX_STD_MAILBOX. */
                status |= FLEXCAN_DRV_RxFifo(CAN_INST, &rxMsg);
            		
            		
                while (1)
                {
            //        if (FLEXCAN_DRV_GetTransferStatus(CAN_INST, TX_MAILBOX) != STATUS_BUSY)
            //        {
            //            /* Configure sending data bytes */
            //            for (int i = 0; i < 8; i++)
            //            {
            //                txMsg.data[i] = offset + i;
            //            }
            //            offset++;
            //            /* Send the information via CAN */
            //            status |= FLEXCAN_DRV_Send(CAN_INST, TX_MAILBOX, &txMbStdInfo, TX_MSG_ID, txMsg.data);
            //        }
                    if (FLEXCAN_DRV_GetTransferStatus(CAN_INST, RX_LEGACY_FIFO) != STATUS_BUSY)
                    {
                        fifoFrameCnt++;
                        /* For concise output on UART, only print data[0] */
                        PRINTF("\nRx length= %d, id = %x, data[0] = %x:\r\n", rxMsg.dataLen, rxMsg.msgId, rxMsg.data[0]);
                        /* start to receive new data */
                        status |= FLEXCAN_DRV_RxFifo(CAN_INST, &rxMsg);
                    }
            //        if (fifoFrameCnt >= 10)
            //        {
            //            break;
            //        }
                    /* send data every 100ms */
                    OSIF_TimeDelay(100);
                }
                PRINTF("\n\n");
                PRINTF("Total %d frames legacy fifo has received.\n", fifoFrameCnt);
                PRINTF("<----Demo end---->\n");
                /* USER CODE END 2 */
            
                /* Infinite loop */
                /* USER CODE BEGIN WHILE */
                while (1)
                {
                    if (status != STATUS_SUCCESS)
                    {
                        break;
                    }
                    /* USER CODE END WHILE */
                    /* USER CODE BEGIN 3 */
                }
                /* USER CODE END 3 */
            }
            
            static void Board_Init(void)
            {
                CLOCK_SYS_Init(g_clockManConfigsArr,CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr,CLOCK_MANAGER_CALLBACK_CNT);
                CLOCK_SYS_UpdateConfiguration(CLOCK_MANAGER_ACTIVE_INDEX,CLOCK_MANAGER_POLICY_AGREEMENT);
                PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0,g_pin_mux_InitConfigArr0);
                UTILITY_PRINT_Init();
            }
            
            1 条回复 最后回复
            0
            • HAIYANGH 离线
              HAIYANGH 离线
              HAIYANG YunTu
              写于 最后由 HAIYANG 编辑
              #5

              模式A:一个掩码对应一个接收码,也就是你程序里的这种对应模式;
              模式B:一个掩码对应两个接收码,FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,0, 0x1FFFFFFFU)对应接受滤波器里的前两个ID;
              模式C:一个掩码对应四个接收码,FLEXCAN_DRV_SetRxIndividualMask(CAN_INST,FLEXCAN_MSG_ID_EXT,0, 0x1FFFFFFFU)对应接受滤波器里的前四个ID;
              image.png

              1 条回复 最后回复
              0
              • yishui66Y 离线
                yishui66Y 离线
                yishui66
                写于 最后由 编辑
                #6

                @ytm0267 谢谢,很有帮助。

                1 条回复 最后回复
                0
                • HAIYANGH HAIYANG 在 中 引用了 这个主题
                • ,FrankieF Frankie 将这个主题转为问答主题
                • ,FrankieF Frankie 将这个主题标记为已解决

              • 云途开发生态介绍

                快速上手云途开发生态

              • 云途论坛规则/Yuntu Forum Rules

                发帖前请查看

              • YT CONFIG TOOL调查问卷

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

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

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