你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H7 CANFD过滤问题  

[复制链接]
oujisang 提问时间:2018-9-22 17:02 /
阅读主题, 点击返回1楼
1 收藏 2 评论78 发布时间:2018-9-22 17:02
78个回答
sky7 回答时间:2018-12-12 14:03:45

感謝, 下載看一下
vgboy 回答时间:2018-12-14 19:53:00
感谢楼主了,学习一下。
lfc2018 回答时间:2018-12-25 18:19:38
正好这几天也遇到了这样的问题,下来瞧一瞧
lfc2018 回答时间:2018-12-25 19:40:40
按照你那个配置,ID滤波还是不行,
oujisang 回答时间:2018-12-26 13:22:24
lfc2018 发表于 2018-12-25 19:40
按照你那个配置,ID滤波还是不行,

怎么个不行,不妨你把你的程序发给我,我帮你看看,625194384@qq.com
lfc2018 回答时间:2018-12-26 19:44:32
oujisang 发表于 2018-12-26 13:22
怎么个不行,不妨你把你的程序发给我,我帮你看看,

u8 BspMcuCanInit(void)
{   
  FDCAN_FilterTypeDef sFilterConfig;
  
   FDCAN1_Handler.Instance = FDCAN1;   

  __HAL_RCC_FDCAN_CLK_ENABLE();
   
  /* 配置FDCAN参数 */
  FDCAN1_Handler.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  FDCAN1_Handler.Init.Mode = FDCAN_MODE_NORMAL;

  FDCAN1_Handler.Init.AutoRetransmission   = ENABLE;
  FDCAN1_Handler.Init.TransmitPause        = DISABLE;
  FDCAN1_Handler.Init.ProtocolException    = ENABLE;  
  FDCAN1_Handler.Init.NominalPrescaler     = 1U;
  FDCAN1_Handler.Init.NominalSyncJumpWidth = 2U;
  FDCAN1_Handler.Init.NominalTimeSeg1      = 16U;
  FDCAN1_Handler.Init.NominalTimeSeg2      = 8U;
  
  FDCAN1_Handler.Init.StdFiltersNbr        = 1U;
  FDCAN1_Handler.Init.ExtFiltersNbr        = 0U;
  
  FDCAN1_Handler.Init.RxFifo0ElmtsNbr      = 64U;
  FDCAN1_Handler.Init.RxFifo0ElmtSize      = FDCAN_DATA_BYTES_8;
  FDCAN1_Handler.Init.RxFifo1ElmtsNbr      = 0U;
  FDCAN1_Handler.Init.RxBuffersNbr         = 0U;
  FDCAN1_Handler.Init.TxEventsNbr          = 32U;
  FDCAN1_Handler.Init.TxBuffersNbr         = 0U;
  FDCAN1_Handler.Init.TxFifoQueueElmtsNbr  = 32U;
  FDCAN1_Handler.Init.TxFifoQueueMode      = FDCAN_TX_FIFO_OPERATION;
  FDCAN1_Handler.Init.TxElmtSize           = FDCAN_DATA_BYTES_8;
  if (HAL_FDCAN_Init(&FDCAN1_Handler) != HAL_OK)
  {
    //ERROR_HANDLER(); /* 出错处理 */
  }
  else
  {
    /* nothing */
  }
  

      /* 配置接收滤波器 */
      sFilterConfig.IdType = FDCAN_EXTENDED_ID;
      sFilterConfig.FilterIndex  = 1;
      sFilterConfig.FilterType   = FDCAN_FILTER_MASK;
      sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
      sFilterConfig.FilterID1 = 0xFFF11000U;
      sFilterConfig.FilterID2 = 0xFFFFE000U;
      HAL_FDCAN_ConfigFilter(&FDCAN1_Handler, &sFilterConfig);

  /* 启动FDCAN */
  if (HAL_OK != HAL_FDCAN_Start(&FDCAN1_Handler))
  {
    //ERROR_HANDLER(); /* 出错处理 */
  }
  else
  {
    /* nothing */
  }


    /* 使能接收FIFO New Message中断 */
    if (HAL_OK != HAL_FDCAN_ActivateNotification(&FDCAN1_Handler, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0U))
    {
     // ERROR_HANDLER(); /* 出错处理 */
    }
    else
    {
      /* nothing */
    }

    /* 使能发送FIFO Empty中断 */
    if (HAL_OK != HAL_FDCAN_ActivateNotification(&FDCAN1_Handler, FDCAN_IT_TX_FIFO_EMPTY, 0U))
    {
     // ERROR_HANDLER(); /* 出错处理 */
    }
    else
    {
      /* nothing */
    }
   
  return 0;
}
公司的文件是加密,这是我的配置,请你给看看对不对
kqh1120 回答时间:2019-1-7 14:52:37
只能收发15个数据啊。。。
oujisang 回答时间:2019-1-11 11:00:25
lfc2018 发表于 2018-12-26 19:44
u8 BspMcuCanInit(void)
{   
  FDCAN_FilterTypeDef sFilterConfig;

缺少这个函数,全局滤波设置 没有这个函数,总线上任何数据你都能收到。
HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, ENABLE, ENABLE)
shouhong829 回答时间:2019-1-24 15:54:12
帮我看看吧
u8 FDCAN1_Mode_Init(u8 tnsjw,u16 tseg1,u8 tseg2,u16 tnbrp,u8 mode)
{
          FDCAN_ClkCalUnitTypeDef FDCAN1_ClkCalUnit;
                FDCAN_FilterTypeDef FDCAN1_RXFilter;
        
    //初始化FDCAN1
    HAL_FDCAN_DeInit(&FDCAN1_Handler);                          //先清除以前的设置
    FDCAN1_Handler.Instance = FDCAN1;
    FDCAN1_Handler.Init.FrameFormat = FDCAN_FRAME_FD_BRS;        //传统模式
    FDCAN1_Handler.Init.Mode = mode;                                   //模式设置
    FDCAN1_Handler.Init.AutoRetransmission = ENABLE;//DISABLE;                 //关闭自动重传!传统模式下一定要关闭!!!
    FDCAN1_Handler.Init.TransmitPause = DISABLE;                       //关闭传输暂停
    FDCAN1_Handler.Init.ProtocolException = ENABLE;//DISABLE;                  //关闭协议异常处理
   
                //FDCAN的Nominal波特率
                //FDCAN_NBTP
                FDCAN1_Handler.Init.NominalPrescaler = tnbrp;                      //分频系数                    5
    FDCAN1_Handler.Init.NominalSyncJumpWidth = tnsjw;                  //重新同步跳跃宽度范围:2~128  8
    FDCAN1_Handler.Init.NominalTimeSeg1 = tseg1;                       //tseg1范围:2~256             8  
    FDCAN1_Handler.Init.NominalTimeSeg2 = tseg2;                       //tseg2范围:2~128             11
    FDCAN1_Handler.Init.MessageRAMOffset = 0;                                //信息RAM偏移
   
    //FDCAN的波特率Data波特率
                //FDCAN_DBTP
                FDCAN1_Handler.Init.DataPrescaler = 0x1;
                FDCAN1_Handler.Init.DataSyncJumpWidth = 0x4;
                FDCAN1_Handler.Init.DataTimeSeg1 = 0x5; // DataTimeSeg1 = Propagation_segment + Phase_segment_1 //
                FDCAN1_Handler.Init.DataTimeSeg2 = 0x4;       
               
                FDCAN1_Handler.Init.StdFiltersNbr = 1;                            //标准信息ID滤波器编号
    FDCAN1_Handler.Init.ExtFiltersNbr = 1;                            //扩展信息ID滤波器编号
    FDCAN1_Handler.Init.RxFifo0ElmtsNbr = 1;                          //接收FIFO0元素编号
    FDCAN1_Handler.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;         //接收FIFO0元素大小:8字节
    FDCAN1_Handler.Init.RxFifo1ElmtsNbr = 2;
                FDCAN1_Handler.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
                FDCAN1_Handler.Init.RxBuffersNbr = 1;
                FDCAN1_Handler.Init.RxBufferSize = FDCAN_DATA_BYTES_8;                           //接收缓冲编号
               
                FDCAN1_Handler.Init.TxEventsNbr = 2;                              //发送事件编号
    FDCAN1_Handler.Init.TxBuffersNbr = 1;                             //发送缓冲编号
    FDCAN1_Handler.Init.TxFifoQueueElmtsNbr        =        2;                                         //发送FIFO序列元素编号
    FDCAN1_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;                 //发送FIFO序列模式
    FDCAN1_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_8;                          //发送大小:8字节
    HAL_FDCAN_Init(&FDCAN1_Handler);
               
          FDCAN1_ClkCalUnit.ClockCalibration = DISABLE;                                                                                        //不使用时钟校准功能
                //FDCAN_CLOCK_DIV10   10分频,得到20Mhz的fdca_tq_ck
                //FDCAN_CLOCK_DIV4   4分频,得到50Mhz的fdca_tq_ck
                FDCAN1_ClkCalUnit.ClockDivider = FDCAN_CLOCK_DIV10;                                                       
                HAL_FDCAN_ConfigClockCalibration(&FDCAN1_Handler,&FDCAN1_ClkCalUnit);        //设置分频

    //配置RX滤波器   
    FDCAN1_RXFilter.IdType = FDCAN_STANDARD_ID;                       //标准ID
    FDCAN1_RXFilter.FilterIndex = 0;                                  //滤波器索引
                //滤波器类型
                //FDCAN_FILTER_RANGE          Range filter from FilterID1 to FilterID2                        
                //FDCAN_FILTER_DUAL                  Dual ID filter for FilterID1 or FilterID2                       
                //FDCAN_FILTER_MASK                  Classic filter: FilterID1 = filter, FilterID2 = mask            
                //FDCAN_FILTER_RANGE_NO_EIDM         Range filter from FilterID1 to FilterID2, EIDM mask not applied
    FDCAN1_RXFilter.FilterType = FDCAN_FILTER_DUAL;                  
    FDCAN1_RXFilter.FilterConfig =  FDCAN_FILTER_TO_RXFIFO0;//FDCAN_FILTER_TO_RXBUFFER;////过滤器0关联到FIFO0  
                FDCAN1_RXFilter.FilterID1 = 0x0543;                               //32位ID
    FDCAN1_RXFilter.FilterID2 = 0x07ff;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    FDCAN1_RXFilter.RxBufferIndex = 0;
    HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter);
                HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, ENABLE, ENABLE);
//                // Configure extended ID reception filter to Rx FIFO 1
//                FDCAN1_RXFilter.IdType = FDCAN_STANDARD_ID;
//                FDCAN1_RXFilter.FilterIndex = 0;
//                FDCAN1_RXFilter.FilterType = FDCAN_FILTER_DUAL;
//                FDCAN1_RXFilter.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;//FDCAN_FILTER_TO_RXBUFFER;//
//                FDCAN1_RXFilter.FilterID1 = 0x0643;                              
//                FDCAN1_RXFilter.FilterID2 = 0x07ff;                              
//                HAL_FDCAN_ConfigFilter(&FDCAN1_Handler, &FDCAN1_RXFilter);               
//               
//                HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, ENABLE, ENABLE);
               
                HAL_FDCAN_Start(&FDCAN1_Handler);                               //开启FDCAN
    HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);//Enable interrupts.
    return 0;
}
shouhong829 回答时间:2019-1-24 15:56:08
按照你的方法还是收到全部数据
shouhong829 回答时间:2019-1-24 16:03:34
能发送数据,但滤波数据不行大家看看那里不对了

FDCAN实验_20190123.rar

下载

5.25 MB, 下载次数: 68, 下载积分: ST金币 -1

oujisang 回答时间:2019-1-24 19:28:34
HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, ENABLE, ENABLE);

不要用“FDCAN_ACCEPT_IN_RX_FIFO0”这个参量,这个是标识没有匹配到要滤波的ID就放到FIFO里了 要改用“FDCAN_REJECT”参量,没有匹配到滤波的ID就拒绝接收

HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, ENABLE, ENABLE)
syp910 回答时间:2019-2-21 17:12:21
顶一个
zhaoyiwei 回答时间:2019-3-10 12:22:40
挺好的,需要
sky7 回答时间:2019-3-25 15:34:08

顶一个

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版