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

STM32H7 CANFD过滤问题  

[复制链接]
oujisang 提问时间:2018-9-22 17:02 /
最近在调试STM32H7的CANFD外设,通信调试都没有问题了,但是使用CANFD滤波进行ID过滤时出现问题了,CANFD的滤波视乎没有起到作用,总线上的任何一个ID都能收到,不知道有没有人研究过这个东西。使用官方提供的例程也是相同的问题,不能过滤CAN总线上的固定ID。有弄明白的大神没有,求赐教!!!!
1 收藏 2 评论78 发布时间:2018-9-22 17:02

举报

78个回答
oujisang 回答时间:2018-10-19 11:07:26
本帖最后由 oujisang 于 2019-1-11 11:03 编辑

代码上传上来了,需要的参考看看!!!

CAN_FD_test.part01.rar

下载

8.5 MB, 下载次数: 1188, 下载积分: ST金币 -1

CAN_FD_test.part02.rar

下载

8.5 MB, 下载次数: 802, 下载积分: ST金币 -1

CAN_FD_test.part03.rar

下载

8.5 MB, 下载次数: 1876, 下载积分: ST金币 -1

CAN_FD_test.part04.rar

下载

1.33 MB, 下载次数: 378, 下载积分: ST金币 -1

vanaua 回答时间:2019-10-25 10:46:13
  1. u8 FDCAN1_Mode_Init(u16 presc,u8 ntsjw,u16 ntsg1,u8 ntsg2,u32 mode)
  2. {
  3.     FDCAN_FilterTypeDef FDCAN1_RXFilter;
  4.         
  5.     //初始化FDCAN1
  6.     HAL_FDCAN_DeInit(&FDCAN1_Handler);                              //先清除以前的设置
  7.     FDCAN1_Handler.Instance=FDCAN1;
  8.     FDCAN1_Handler.Init.FrameFormat=FDCAN_FRAME_CLASSIC;            //传统模式
  9.     FDCAN1_Handler.Init.Mode=mode;                                  //回环测试
  10.     FDCAN1_Handler.Init.AutoRetransmission=DISABLE;                 //关闭自动重传!传统模式下一定要关闭!!!
  11.     FDCAN1_Handler.Init.TransmitPause=DISABLE;                      //关闭传输暂停
  12.     FDCAN1_Handler.Init.ProtocolException=DISABLE;                  //关闭协议异常处理
  13.     FDCAN1_Handler.Init.NominalPrescaler=presc;                     //分频系数
  14.     FDCAN1_Handler.Init.NominalSyncJumpWidth=ntsjw;                 //重新同步跳跃宽度
  15.     FDCAN1_Handler.Init.NominalTimeSeg1=ntsg1;                      //tsg1范围:2~256
  16.     FDCAN1_Handler.Init.NominalTimeSeg2=ntsg2;                      //tsg2范围:2~128
  17.     FDCAN1_Handler.Init.MessageRAMOffset=0;                         //信息RAM偏移
  18.     FDCAN1_Handler.Init.StdFiltersNbr=16;                            //标准信息ID滤波器编号
  19.     FDCAN1_Handler.Init.ExtFiltersNbr=16;                            //扩展信息ID滤波器编号
  20.     FDCAN1_Handler.Init.RxFifo0ElmtsNbr=1;                          //接收FIFO0元素编号
  21.     FDCAN1_Handler.Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_8;         //接收FIFO0元素大小:8字节
  22.     FDCAN1_Handler.Init.RxBuffersNbr=1;                             //接收缓冲编号
  23.           FDCAN1_Handler.Init.RxBufferSize = FDCAN_DATA_BYTES_64;
  24.     FDCAN1_Handler.Init.TxEventsNbr=1;                              //发送事件编号
  25.     FDCAN1_Handler.Init.TxBuffersNbr=1;                             //发送缓冲编号
  26.     FDCAN1_Handler.Init.TxFifoQueueElmtsNbr=16;                      //发送FIFO序列元素编号
  27.     FDCAN1_Handler.Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION;    //发送FIFO序列模式
  28.     FDCAN1_Handler.Init.TxElmtSize=FDCAN_DATA_BYTES_8;              //发送大小:8字节
  29.     if(HAL_FDCAN_Init(&FDCAN1_Handler)!=HAL_OK) return 1;           //初始化FDCAN
  30.   
  31.                 printf("Baudrate is %d \n",(200000/presc/(ntsg1+ntsg2+1)));
  32.     //配置RX滤波器   
  33.     FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
  34.     FDCAN1_RXFilter.FilterIndex=0;                                  //滤波器索引                  
  35.     FDCAN1_RXFilter.FilterType=FDCAN_FILTER_RANGE;                   //滤波器类型
  36.     FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0  
  37.     FDCAN1_RXFilter.FilterID1=0x0012;                               //32位ID
  38.     FDCAN1_RXFilter.FilterID2=0x0012;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
  39.     if(HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter)!=HAL_OK) return 2;//滤波器初始化
  40.                 HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler,FDCAN_REJECT, FDCAN_REJECT, ENABLE, ENABLE);
  41.     HAL_FDCAN_Start(&FDCAN1_Handler);                               //开启FDCAN
  42.     HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
  43.                 //HAL_FDCAN_ActivateNotification(&FDCAN1_Handler, FDCAN_IT_TX_FIFO_EMPTY, 0);
  44.     return 0;
  45. }

  46. //FDCAN1底层驱动,引脚配置,时钟使能
  47. //HAL_FDCAN_Init()调用
  48. //hsdram:FDCAN1句柄
  49. void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
  50. {
  51.     GPIO_InitTypeDef GPIO_Initure;
  52.     RCC_PeriphCLKInitTypeDef FDCAN_PeriphClk;
  53.    
  54.     __HAL_RCC_FDCAN_CLK_ENABLE();                   //使能FDCAN1时钟
  55.     __HAL_RCC_GPIOA_CLK_ENABLE();                                //开启GPIOA时钟
  56.        
  57.     //FDCAN1时钟源配置为PLL1Q
  58.     FDCAN_PeriphClk.PeriphClockSelection=RCC_PERIPHCLK_FDCAN;
  59.     FDCAN_PeriphClk.FdcanClockSelection=RCC_FDCANCLKSOURCE_PLL;
  60.     HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk);
  61.    
  62.     GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12;       //PA11,12
  63.     GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用
  64.     GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
  65.     GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速
  66.     GPIO_Initure.Alternate=GPIO_AF9_FDCAN1;         //复用为CAN1
  67.     HAL_GPIO_Init(GPIOA,&GPIO_Initure);             //初始化
  68.    
  69. #if FDCAN1_RX0_INT_ENABLE     
  70.     HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn,1,2);
  71.     HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
  72. #endif       
  73. }

  74. //此函数会被HAL_FDCAN_DeInit调用
  75. //hfdcan:fdcan句柄
  76. void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
  77. {
  78.     __HAL_RCC_FDCAN_FORCE_RESET();       //复位FDCAN1
  79.     __HAL_RCC_FDCAN_RELEASE_RESET();     //停止复位
  80.    
  81. #if FDCAN1_RX0_INT_ENABLE   
  82.     HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
  83. #endif
  84. }

  85. //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
  86. //len:数据长度(最大为8),可设置为FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8                                     
  87. //msg:数据指针,最大为8个字节.
  88. //返回值:0,成功;
  89. //                 其他,失败;
  90. u8 FDCAN1_Send_Msg(u8* msg,u32 len)
  91. {       
  92.     FDCAN1_TxHeader.Identifier=0x0012;                           //32位ID
  93.     FDCAN1_TxHeader.IdType=FDCAN_STANDARD_ID;                  //标准ID
  94.     FDCAN1_TxHeader.TxFrameType=FDCAN_DATA_FRAME;              //数据帧
  95.     FDCAN1_TxHeader.DataLength=len;                            //数据长度
  96.     FDCAN1_TxHeader.ErrorStateIndicator=FDCAN_ESI_ACTIVE;            
  97.     FDCAN1_TxHeader.BitRateSwitch=FDCAN_BRS_OFF;               //关闭速率切换
  98.     FDCAN1_TxHeader.FDFormat=FDCAN_CLASSIC_CAN;                //传统的CAN模式
  99.     FDCAN1_TxHeader.TxEventFifoControl=FDCAN_NO_TX_EVENTS;     //无发送事件
  100.     FDCAN1_TxHeader.MessageMarker=0;                           
  101.    
  102.     if(HAL_FDCAN_AddMessageToTxFifoQ(&FDCAN1_Handler,&FDCAN1_TxHeader,msg)!=HAL_OK)
  103.                 {       
  104.                         printf("Send massage error!\n");
  105.                         return 1;//发送
  106.                 }
  107.                 printf("Send massage success!\n");
  108.     return 0;       
  109. }

  110. //can口接收数据查询
  111. //buf:数据缓存区;         
  112. //返回值:0,无数据被收到;
  113. //                 其他,接收的数据长度;
  114. u8 FDCAN1_Receive_Msg(u8 *buf)
  115. {       
  116.     if(HAL_FDCAN_GetRxMessage(&FDCAN1_Handler,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,buf)!=HAL_OK)return 0;//接收数据
  117.         return FDCAN1_RxHeader.DataLength>>16;       
  118. }

  119. #if FDCAN1_RX0_INT_ENABLE  
  120. //FDCAN1中断服务函数
  121. void FDCAN1_IT0_IRQHandler(void)
  122. {
  123.        
  124.     HAL_FDCAN_IRQHandler(&FDCAN1_Handler);
  125. }

  126. //FIFO0回调函数
  127. void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
  128. {
  129.     u8 i=0;
  130.     u8 rxdata[8];
  131.     if((RxFifo0ITs&FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET)   //FIFO1新数据中断
  132.     {
  133.         //提取FIFO0中接收到的数据
  134.         HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,rxdata);
  135.         printf("id:%#x\r\n",FDCAN1_RxHeader.Identifier);
  136.         printf("len:%d\r\n",FDCAN1_RxHeader.DataLength>>16);
  137.         for(i=0;i<8;i++)
  138.         printf("rxdata[%d]:%02x\r\n",i,rxdata[i]);
  139.         HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
  140.     }
  141. }
  142. #endif       
复制代码
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;
}
oujisang 回答时间:2018-9-25 20:25:33
解决了!!官方历程里没有调用滤波全局设置,只是配置了一个滤波组设置,一直以为滤波组设置完就可以了,调用滤波全局设置一下就可以了。
德华 回答时间:2018-10-5 23:17:26
您好 我的怎么没有反应 标准模式 pb12 pb13 没反应
德华 回答时间:2018-10-5 23:17:45
可否给看一下
oujisang 回答时间:2018-10-7 16:15:05

先做一下回环自测模式,看看能完成收发不。
STM1024 回答时间:2018-10-7 18:19:58
丢出你的代码,让大家学习一下?
oujisang 回答时间:2018-10-14 18:04:58
stm1024 发表于 2018-10-7 18:19
丢出你的代码,让大家学习一下?

好!!明天上班 我把代码传上来,让大家遇到问题提供参考!
jasoncheungb2 回答时间:2018-11-29 11:39:22
感謝, 下載看一下
jasoncheungb2 回答时间:2018-11-29 11:39:56
希望這個driver 可以用吧
stenvens 回答时间:2018-12-6 23:00:27
我现在可以发送不能接收不知道什么原因  求赐教
oujisang 回答时间:2018-12-7 13:13:47
本帖最后由 oujisang 于 2018-12-7 13:50 编辑

你怎么知道你能发送不能接收?是不是你板子发送数据有问题,先用电脑的CANFD盒子接收板子发送的数据,先解决板子发送数据没有问题,你先找个能调试CANFD的盒子,检查一下看看你板子发送的东西对不对,用示波器测试波形看不出问题,然后在用CAN盒子发送数据板子接收这样一步一步调试才能知道问题在哪里。
oujisang 回答时间:2018-12-7 14:04:42
jasoncheungb2 发表于 2018-11-29 11:39
希望這個driver 可以用吧

项目验证过的,可以用!
cxj16888 回答时间:2018-12-8 20:46:46
无法正确解压缩,文件损坏
oujisang 回答时间:2018-12-11 16:02:35
本帖最后由 oujisang 于 2019-1-11 11:03 编辑
cxj16888 发表于 2018-12-8 20:46
无法正确解压缩,文件损坏

我重新下载解压了一下,没问题,应该是你下载过程中出问题了!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版