请选择 进入手机版 | 继续访问电脑版

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

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, 下载次数: 1185, 下载积分: ST金币 -1

CAN_FD_test.part02.rar

下载

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

CAN_FD_test.part03.rar

下载

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

CAN_FD_test.part04.rar

下载

1.33 MB, 下载次数: 375, 下载积分: 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版