硬汉嵌入式论坛

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

[CAN/FDCAN] canfd fifo 发三个只能接收一个

[复制链接]

3

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2023-11-27 16:51:24 | 显示全部楼层 |阅读模式
void MX_FDCAN1_Init(void)
{

  /* USER CODE BEGIN FDCAN1_Init 0 */
    */
  /* USER CODE END FDCAN1_Init 0 */

  /* USER CODE BEGIN FDCAN1_Init 1 */

  /* USER CODE END FDCAN1_Init 1 */
  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
  hfdcan1.Init.Mode = FDCAN_MODE_INTERNAL_LOOPBACK;
  hfdcan1.Init.AutoRetransmission = ENABLE;
  hfdcan1.Init.TransmitPause = DISABLE;
  hfdcan1.Init.ProtocolException = ENABLE;
  hfdcan1.Init.NominalPrescaler = 5;
  hfdcan1.Init.NominalSyncJumpWidth = 1;
  hfdcan1.Init.NominalTimeSeg1 = 6;
  hfdcan1.Init.NominalTimeSeg2 = 2;
  hfdcan1.Init.DataPrescaler = 2;
  hfdcan1.Init.DataSyncJumpWidth = 1;
  hfdcan1.Init.DataTimeSeg1 = 8;
  hfdcan1.Init.DataTimeSeg2 = 1;
  hfdcan1.Init.MessageRAMOffset = 0;
  hfdcan1.Init.StdFiltersNbr = 4;  //
  hfdcan1.Init.ExtFiltersNbr = 4;
  hfdcan1.Init.RxFifo0ElmtsNbr = 16;
  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.RxFifo1ElmtsNbr = 16;
  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.RxBuffersNbr = 16;
  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.TxEventsNbr = 16;
  hfdcan1.Init.TxBuffersNbr = 16;
  hfdcan1.Init.TxFifoQueueElmtsNbr = 16;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN1_Init 2 */
        /*
                配置过滤器, 过滤器主要用于接收,比如屏蔽位模式。
                FilterID1 = filter
                FilterID2 = mask
               
                FilterID2的mask每个bit含义
                0: 不关心,该位不用于比较;
                1: 必须匹配,接收到的ID必须与滤波器对应的ID位相一致。
               
                举例说明:
                FilterID1 = 0x111  001 0001 0001
                FilterID2 = 0x7FF  111 1111 1111
                表示仅接收ID为0x111的FDCAN帧。
        */
       
        /* 第4步:扩展ID过滤设置 ==================================================================================*/
        sFilterConfig1.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
        sFilterConfig1.FilterIndex = 0;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
        sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;         /* 范围过滤 -----------------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
        sFilterConfig1.FilterID1 = 0x12345678;                  /* 起始ID:0x12345678 */
        sFilterConfig1.FilterID2 = 0x12345680;                                         /* 结束ID:0x12345680 */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
        sFilterConfig1.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
        sFilterConfig1.FilterIndex = 1;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
        sFilterConfig1.FilterType = FDCAN_FILTER_DUAL;          /* 专用ID过滤 --------------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
        sFilterConfig1.FilterID1 = 0x12345681;                  /* 指定ID */
        sFilterConfig1.FilterID2 = 0x12345682;                                         /* 指定ID */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
        sFilterConfig1.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
        sFilterConfig1.FilterIndex = 2;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
        sFilterConfig1.FilterType = FDCAN_FILTER_MASK;          /* 过滤器采样屏蔽位模式 ----*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
        sFilterConfig1.FilterID1 = 0x12345683;                  /* 屏蔽位模式下,FilterID1是消息ID */
        sFilterConfig1.FilterID2 = 0x1FFFFFFF;                                         /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
//        sFilterConfig1.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
//        sFilterConfig1.FilterIndex = 3;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
//        sFilterConfig1.FilterType = FDCAN_FILTER_MASK;          /* 忽略 --------------------*/
//        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXBUFFER; /* 如果过滤匹配,将数据保存到Rx Buffer */
//        sFilterConfig1.FilterID1 = 0x12345684;                  /* 接收指定ID消息 */
//        sFilterConfig1.FilterID2 = 0x1FFFFFFF;                                         /* 忽略 */
//        sFilterConfig1.IsCalibrationMsg = 0;                    /* 正常消息 */
//        sFilterConfig1.RxBufferIndex = 0;                       /* Rx buffer位置 */
//        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */

        /* 第5步:标准ID过滤设置 ==================================================================================*/       
        sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
        sFilterConfig1.FilterIndex = 0;                                                   /* 用于过滤索引,标准ID,范围0到127 */
        sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;         /* 范围过滤 -------------------------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
        sFilterConfig1.FilterID1 = 0x000;                       /* 起始ID:0x000 */
        sFilterConfig1.FilterID2 = 0x010;                                                 /* 结束ID:0x010 */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
        sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
        sFilterConfig1.FilterIndex = 1;                                                   /* 用于过滤索引,标准ID,范围0到127 */
        sFilterConfig1.FilterType = FDCAN_FILTER_DUAL;          /* 专用ID过滤 ----------------------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
        sFilterConfig1.FilterID1 = 0x011;                       /* 指定ID */
        sFilterConfig1.FilterID2 = 0x012;                                                 /* 指定ID */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
        sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
        sFilterConfig1.FilterIndex = 2;                                                   /* 用于过滤索引,标准ID,范围0到127 */
        sFilterConfig1.FilterType = FDCAN_FILTER_MASK;          /* 过滤器采样屏蔽位模式 -----------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
        sFilterConfig1.FilterID1 = 0x013;                       /* 屏蔽位模式下,FilterID1是消息ID */
        sFilterConfig1.FilterID2 = 0x7FF;                                                 /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
//        sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
//        sFilterConfig1.FilterIndex = 3;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
//        sFilterConfig1.FilterType = FDCAN_FILTER_MASK;          /* 忽略 ---------------------------*/
//        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXBUFFER; /* 如果过滤匹配,将数据保存到Rx BUFFER */
//        sFilterConfig1.FilterID1 = 0x014;                       /* 接收指定ID消息 */
//        sFilterConfig1.FilterID2 = 0x7FF;                                             /* 忽略 */
//        sFilterConfig1.IsCalibrationMsg = 0;                    /* 正常消息 */
//        sFilterConfig1.RxBufferIndex = 1;                       /* Rx buffer位置 */
//        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
       
        HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,                  /* 全局过滤设置 */
                                      FDCAN_REJECT,             /* 接收到消息ID与标准ID过滤不匹配,不接受 */
                                                                  FDCAN_REJECT,             /* 接收到消息ID与扩展ID过滤不匹配,不接受 */
                                                                  FDCAN_FILTER_REMOTE,      /* 过滤标准ID远程帧 */
                                                                  FDCAN_FILTER_REMOTE);     /* 过滤扩展ID远程帧 */
       

        /* 第5步:Rx FIFO0中断配置 ===================================================================*/       
        /* 设置Rx FIFO0的阈值为1 ---------------------------------------*/
        HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 1);

        /* 开启RX FIFO0的阈值中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
       
        /* 第6步:Rx FIFO1中断配置 ===================================================================*/       
        /* 开启RX FIFO1的新数据中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
       
        /* 第7步:Rx Buffer中断配置 ==================================================================*/       
        /* Rx Buffer接收到新消息就触发中断 */
//        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_BUFFER_NEW_MESSAGE, 0);       
       
        /* 启动FDCAN */
        HAL_FDCAN_Start(&hfdcan1);       
  /* USER CODE END FDCAN1_Init 2 */

}

void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(fdcanHandle->Instance==FDCAN1)
  {
  /* USER CODE BEGIN FDCAN1_MspInit 0 */

  /* USER CODE END FDCAN1_MspInit 0 */
  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
    PeriphClkInitStruct.PLL2.PLL2M = 5;
    PeriphClkInitStruct.PLL2.PLL2N = 80;
    PeriphClkInitStruct.PLL2.PLL2P = 2;
    PeriphClkInitStruct.PLL2.PLL2Q = 20;
    PeriphClkInitStruct.PLL2.PLL2R = 2;
    PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
    PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* FDCAN1 clock enable */
    __HAL_RCC_FDCAN_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**FDCAN1 GPIO Configuration
    PA12     ------> FDCAN1_TX
    PA11     ------> FDCAN1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* FDCAN1 interrupt Init */
    HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
  /* USER CODE BEGIN FDCAN1_MspInit 1 */

  /* USER CODE END FDCAN1_MspInit 1 */
  }
}

void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{

  if(fdcanHandle->Instance==FDCAN1)
  {
  /* USER CODE BEGIN FDCAN1_MspDeInit 0 */

  /* USER CODE END FDCAN1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_FDCAN_CLK_DISABLE();

    /**FDCAN1 GPIO Configuration
    PA12     ------> FDCAN1_TX
    PA11     ------> FDCAN1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12|GPIO_PIN_11);

    /* FDCAN1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
  /* USER CODE BEGIN FDCAN1_MspDeInit 1 */

  /* USER CODE END FDCAN1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
/*
*********************************************************************************************************
*        函 数 名: HAL_FDCAN_RxFifo0Callback
*        功能说明: Rx FIFO0回调函数
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
        if (hfdcan == &hfdcan1)
        {
                if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
                {
                        /* 从RX FIFO0读取数据 */
                        HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &g_Can1RxHeader, g_Can1RxData);

                        /* 重新使能RX FIFO0阈值中断 */
                        HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);

                        /* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
//                        bsp_PutMsg(MSG_CAN1_RxFIFO0, 0);       
            printf("RxFifo0 recieve data id:0x%x\r\n", g_Can1RxHeader.Identifier);
                }
        }
}

/*
*********************************************************************************************************
*        函 数 名: HAL_FDCAN_RxFifo0Callback
*        功能说明: Rx FIFO0回调函数
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs)
{
        if (hfdcan == &hfdcan1)
        {
         printf("RxFifo1 entry\r\n");
                if ((RxFifo1ITs & FDCAN_IT_RX_FIFO1_NEW_MESSAGE) != RESET)
                {
                        /* 从RX FIFO1读取数据 */
                        HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO1, &g_Can1RxHeader, g_Can1RxData);
                       
                        /* 使能Rx FIFO1收到新数据阈值中断 */
                        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);

                        /* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
//                        bsp_PutMsg(MSG_CAN1_RxFIFO1, 0);       
            printf("RxFifo1 recieve data\r\n");

                }
        }

}

/*
*********************************************************************************************************
*        函 数 名: HAL_FDCAN_RxBufferNewMessageCallback
*        功能说明: Rx Buffer回调函数
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxBufferNewMessageCallback(FDCAN_HandleTypeDef *hfdcan)
{
    printf("HAL_FDCAN_RxBufferNewMessageCallback\r\n");
        HAL_StatusTypeDef Status;
        uint8_t i, off;
       
        if (hfdcan == &hfdcan1)
        {
                for(i = 0; i < 32; i++)
                {
                        off = (hfdcan->Instance->NDAT1 & (1<<i) ) >> i;
                        if(off == 1)
                        {
                                /* 从RX Buffer0读取数据, i值等同于FDCAN_RX_BUFFER */
                                Status = HAL_FDCAN_GetRxMessage(hfdcan, i, &g_Can1RxHeader, g_Can1RxData);

                                if(Status == HAL_OK)
                                {
                                        /* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
//                                        bsp_PutMsg(MSG_CAN1_RxBuffer, 0);                               
                                }               
                        }
                }
               
                for(i = 0; i < 32; i++)
                {
                        off = (hfdcan->Instance->NDAT2 & (1<<i) ) >> i;
                        if(off == 1)
                        {
                                /* 从RX Buffer0读取数据, i值等同于FDCAN_RX_BUFFER */
                                Status = HAL_FDCAN_GetRxMessage(hfdcan, i+31, &g_Can1RxHeader, g_Can1RxData);

                                if(Status == HAL_OK)
                                {
                                        /* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */               
//                                        bsp_PutMsg(MSG_CAN1_RxBuffer, 0);               
                                }               
                        }
                }
        }
       
}

/*
*********************************************************************************************************
*        函 数 名: HAL_FDCAN_TxFifoEmptyCallback
*        功能说明: Tx FIFO发送完成回调函数
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_TxFifoEmptyCallback(FDCAN_HandleTypeDef *hfdcan)
{
        if (hfdcan == &hfdcan1)
        {
                printf("FDCAN1_TxFifoEmpty\r\n");
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
        }
}

/*
*********************************************************************************************************
*        函 数 名: HAL_FDCAN_TxBufferCompleteCallback
*        功能说明: Tx Buffer发送完成标志
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes)
{
//        if (hfdcan == &hfdcan1)
//        {
//                bsp_PutMsg(MSG_CAN1_TxBuffer, 0);
//        }
//       
//        if (hfdcan == &hfdcan2)
//        {
//                bsp_PutMsg(MSG_CAN2_TxBuffer, 0);               
//        }       
}

/*
*********************************************************************************************************
*        函 数 名: can1_SendPacket
*        功能说明: 发送一包数据
*        形    参:_DataBuf 数据缓冲区
*                          _Len 数据长度
*             FDCAN_DLC_BYTES_0  
*             FDCAN_DLC_BYTES_1  
*             FDCAN_DLC_BYTES_2   
*             FDCAN_DLC_BYTES_3   
*             FDCAN_DLC_BYTES_4
*             FDCAN_DLC_BYTES_5
*             FDCAN_DLC_BYTES_6
*             FDCAN_DLC_BYTES_7
*             FDCAN_DLC_BYTES_8
*             FDCAN_DLC_BYTES_12
*             FDCAN_DLC_BYTES_16
*             FDCAN_DLC_BYTES_20
*             FDCAN_DLC_BYTES_24
*             FDCAN_DLC_BYTES_32
*             FDCAN_DLC_BYTES_48
*             FDCAN_DLC_BYTES_64
*        返 回 值: 无
*********************************************************************************************************
*/
void can1_SendPacket_one(uint8_t *_DataBuf, uint32_t _Len,uint32_t id)
{
    FDCAN_TxHeaderTypeDef TxHeader = {0};

        /* 第1步:配置发送参数 ===================================================================*/
        TxHeader.Identifier = id;                                      /* 设置接收帧消息的ID */
        TxHeader.IdType = FDCAN_STANDARD_ID;                          /* 标准ID */
        TxHeader.TxFrameType = FDCAN_DATA_FRAME;                     /* 数据帧 */
        TxHeader.DataLength = _Len;                                           /* 发送数据长度 */
        TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;     /* 设置错误状态指示 */
        TxHeader.BitRateSwitch = FDCAN_BRS_ON;               /* 开启可变波特率 */
        TxHeader.FDFormat = FDCAN_FD_CAN;                    /* FDCAN格式 */
        TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;    /* 用于发送事件FIFO控制, 不存储 */
        TxHeader.MessageMarker = 0;                          /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
       

    /* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */

    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
        /* 使能Tx FIFO发送空中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);          
}
void can1_SendPacket(uint8_t *_DataBuf, uint32_t _Len)
{               
        FDCAN_TxHeaderTypeDef TxHeader = {0};

        /* 第1步:配置发送参数 ===================================================================*/
        TxHeader.Identifier = 0x001;                                  /* 设置接收帧消息的ID */
        TxHeader.IdType = FDCAN_STANDARD_ID;                          /* 标准ID */
        TxHeader.TxFrameType = FDCAN_DATA_FRAME;                     /* 数据帧 */
        TxHeader.DataLength = _Len;                                           /* 发送数据长度 */
        TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;     /* 设置错误状态指示 */
        TxHeader.BitRateSwitch = FDCAN_BRS_ON;               /* 开启可变波特率 */
        TxHeader.FDFormat = FDCAN_FD_CAN;                    /* FDCAN格式 */
        TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;    /* 用于发送事件FIFO控制, 不存储 */
        TxHeader.MessageMarker = 0;                          /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
       

    /* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
    TxHeader.Identifier = 0x002;
    TxHeader.MessageMarker = 1;   
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
    TxHeader.Identifier = 0x003;
    TxHeader.MessageMarker = 2;   
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
        /* 使能Tx FIFO发送空中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);       


       
//    /* 第2步:添加数据到TX BUFFER, 连续添加三组 ================================================*/
//        TxHeader.Identifier = 0x12345678;                                 
//        TxHeader.IdType = FDCAN_EXTENDED_ID;  
//        TxHeader.MessageMarker = 4;
//        HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER0);/* 根据需要,可以修改_DataBuf数值 */
//        TxHeader.Identifier = 0x12345681;                                 
//        TxHeader.IdType = FDCAN_EXTENDED_ID;
//        TxHeader.MessageMarker = 5;
//        HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER1);/* 根据需要,可以修改_DataBuf数值 */
//        TxHeader.Identifier = 0x12345683;                                 
//        TxHeader.IdType = FDCAN_EXTENDED_ID;
//        TxHeader.MessageMarker = 6;
//        HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER2);/* 根据需要,可以修改_DataBuf数值 */       
//       
//        /* 使能Tx Buffer发送完成中断 */       
//        HAL_FDCAN_EnableTxBufferRequest(&hfdcan1, FDCAN_TX_BUFFER0|FDCAN_TX_BUFFER1|FDCAN_TX_BUFFER2);
//        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE, FDCAN_TX_BUFFER0|FDCAN_TX_BUFFER1|FDCAN_TX_BUFFER2);
}

/* USER CODE END 1 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


回复

使用道具 举报

3

主题

2

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-11-27 17:08:17 | 显示全部楼层
用的回环模式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2023-11-28 07:57:32 | 显示全部楼层
简单看了下配置,没发现什么问题,直接两个独立CAN测试下是否正常。
回复

使用道具 举报

8

主题

43

回帖

67

积分

初级会员

积分
67
发表于 2023-11-28 09:06:13 | 显示全部楼层
        if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) == HAL_OK)/* 代表没有挂起的发送报文  */
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX0);
        else if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) != HAL_OK)
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX1);
        else if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) != HAL_OK)
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX2);
        else
                return HAL_ERROR;
        while(HAL_CAN_GetTxMailboxesFreeLevel(&hCAN) == 0){}                        /* 如果空闲发送邮箱为0,则死循环,等待发送邮箱不为空,有可用的邮箱 */
                                                                                                                                        /* 添加一组大括号,避免报警告没有返回状态 */
回复

使用道具 举报

8

主题

43

回帖

67

积分

初级会员

积分
67
发表于 2023-11-28 09:07:59 | 显示全部楼层
        if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) == HAL_OK)/* 代表没有挂起的发送报文  */
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX0);
        else if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) != HAL_OK)
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX1);
        else if(HAL_CAN_IsTxMessagePending(&hCAN,CAN_TX_MAILBOX0) != HAL_OK)
                HAL_CAN_AddTxMessage(&hCAN,&can_tx_msg,_buf,(uint32_t*)CAN_TX_MAILBOX2);
        else
                return HAL_ERROR;
        while(HAL_CAN_GetTxMailboxesFreeLevel(&hCAN) == 0){}                        /* 如果空闲发送邮箱为0,则死循环,等待发送邮箱不为空,有可用的邮箱 */
                                                                                                                                        /* 添加一组大括号,避免报警告没有返回状态 */
之前也遇到过类似的问题,后面参考了ST的can demo,可以看下上面这几行代码,我用的是f407的芯片
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 13:40 , Processed in 0.165350 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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