From 69a347fa7b05291d2de88e87d1bf9f711b33455b Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 2 Feb 2021 14:10:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=B1=82=E8=AE=BE=E7=BD=AEhdr=20=3D=20-1=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E5=B1=82=E6=B2=A1=E6=9C=89=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E9=97=AE=E9=A2=98=EF=BC=8C=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E6=BB=A4=E6=B3=A2=E8=A1=A8=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEFilterBank?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_can.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drv_can.c index c7d0428d48..335ac01f19 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_can.c @@ -303,6 +303,14 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) /* get default filter */ for (int i = 0; i < filter_cfg->count; i++) { + if (filter_cfg->items[i].hdr == -1) + { + drv_can->FilterConfig.FilterBank = i; + } + else + { + drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; + } drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; drv_can->FilterConfig.FilterIdHigh = (filter_cfg->items[i].id >> 13) & 0xFFFF; drv_can->FilterConfig.FilterIdLow = ((filter_cfg->items[i].id << 3) | From 9c811b19ba50ff79463cf9855ce4899b4691c00c Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 2 Feb 2021 14:23:56 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BB=A4=E6=B3=A2?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=97=AE=E9=A2=98=EF=BC=8C=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=A0=87=E5=BF=97=E5=B8=A7=E5=92=8C=E6=89=A9=E5=B1=95=E5=B8=A7?= =?UTF-8?q?=E5=88=A4=E5=88=AB=E6=89=80=E9=9C=80=E4=BD=8D=E7=A7=BB=EF=BC=8C?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=BB=A4=E6=B3=A2=E6=A8=A1=E5=BC=8F=E5=88=A4?= =?UTF-8?q?=E5=88=ABCAN=5FFxR2[3:0]=E8=AE=BE=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_can.c | 76 ++++++++++++++++++++--- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drv_can.c index 335ac01f19..ff5404bbfb 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_can.c @@ -11,6 +11,7 @@ * fix bug.port to BSP [stm32] * 2019-03-27 YLZ support double can channels, support stm32F4xx (only Legacy mode). * 2019-06-17 YLZ port to new STM32F1xx HAL V1.1.3. + * 2021-02-02 YuZhe XU fix bug in filter config */ #include "drv_can.h" @@ -292,6 +293,13 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) } break; case RT_CAN_CMD_SET_FILTER: + { + rt_uint32_t id_h = 0; + rt_uint32_t id_l = 0; + rt_uint32_t mask_h = 0; + rt_uint32_t mask_l = 0; + rt_uint32_t mask_l_tail = 0; //CAN_FxR2 bit [2:0] + if (RT_NULL == arg) { /* default filter config */ @@ -311,19 +319,73 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) { drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; } - drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; - drv_can->FilterConfig.FilterIdHigh = (filter_cfg->items[i].id >> 13) & 0xFFFF; - drv_can->FilterConfig.FilterIdLow = ((filter_cfg->items[i].id << 3) | - (filter_cfg->items[i].ide << 2) | - (filter_cfg->items[i].rtr << 1)) & 0xFFFF; - drv_can->FilterConfig.FilterMaskIdHigh = (filter_cfg->items[i].mask >> 16) & 0xFFFF; - drv_can->FilterConfig.FilterMaskIdLow = filter_cfg->items[i].mask & 0xFFFF; + /** + * struct rt_can_filter_item { + * rt_uint32_t id : 29; // 报文 ID + * rt_uint32_t ide : 1; // 扩展帧标识位 + * rt_uint32_t rtr : 1; // 远程帧标识位 + * rt_uint32_t mode : 1; // 过滤表模式 + * rt_uint32_t mask; // ID 掩码,0 表示对应的位不关心,1 表示对应的位必须匹配 + * rt_int32_t hdr; // -1 表示不指定过滤表号,对应的过滤表控制块也不会被初始化,正数为过滤表号,对应的过滤表控制块会被初始化 + * #ifdef RT_CAN_USING_HDR // 过滤表回调函数 + * rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size); // 回调函数参数 + * void *args; + * #endif + * }; + * ID | CAN_FxR1[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] | + * MASK | CAN_FxR2[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] | + * STD ID | STID[10:3] | STDID[2:0] |<- 21bit ->| + * EXT ID | EXTID[28:21] | EXTID[20:13] | EXTID[12:5] | EXTID[4:0] IDE RTR 0| + * @note the 32bit STD ID must << 21 to fill CAN_FxR1[31:21] and EXT ID must << 3, + * -> but the id bit of struct rt_can_filter_item is 29, + * -> so STD id << 18 and EXT id Don't need << 3, when get the high 16bit. + * -> FilterIdHigh : (((STDid << 18) or (EXT id)) >> 13) & 0xFFFF, + * -> FilterIdLow: ((STDid << 18) or (EXT id << 3)) & 0xFFFF. + * @note the mask bit of struct rt_can_filter_item is 32, + * -> FilterMaskIdHigh: (((STD mask << 21) or (EXT mask <<3)) >> 16) & 0xFFFF + * -> FilterMaskIdLow: ((STD mask << 21) or (EXT mask <<3)) & 0xFFFF + */ + if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDMASK) + { + /* make sure the CAN_FxR1[2:0](IDE RTR) work */ + mask_l_tail = 0x06; + } + else if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDLIST) + { + /* same as CAN_FxR1 */ + mask_l_tail = (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1); + } + if (filter_cfg->items[i].ide == RT_CAN_STDID) + { + id_h = ((filter_cfg->items[i].id << 18) >> 13) & 0xFFFF; + id_l = ((filter_cfg->items[i].id << 18) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)) & 0xFFFF; + mask_h = ((filter_cfg->items[i].mask << 21) >> 16) & 0xFFFF; + mask_l = ((filter_cfg->items[i].mask << 21) | mask_l_tail) & 0xFFFF; + } + else if (filter_cfg->items[i].ide == RT_CAN_EXTID) + { + id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF; + id_l = ((filter_cfg->items[i].id << 3) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)) & 0xFFFF; + mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF; + mask_l = ((filter_cfg->items[i].mask << 3) | mask_l_tail) & 0xFFFF; + } + drv_can->FilterConfig.FilterIdHigh = id_h; + drv_can->FilterConfig.FilterIdLow = id_l; + drv_can->FilterConfig.FilterMaskIdHigh = mask_h; + drv_can->FilterConfig.FilterMaskIdLow = mask_l; + drv_can->FilterConfig.FilterMode = filter_cfg->items[i].mode; /* Filter conf */ HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig); } } break; + } case RT_CAN_CMD_SET_MODE: argval = (rt_uint32_t) arg; if (argval != RT_CAN_MODE_NORMAL && From 55ea4964317ebbc3611a54de6bcb6e5f3ff72480 Mon Sep 17 00:00:00 2001 From: cosmo Date: Tue, 2 Feb 2021 14:28:32 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_can.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drv_can.c index ff5404bbfb..084c0d53cb 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_can.c @@ -368,7 +368,7 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) else if (filter_cfg->items[i].ide == RT_CAN_EXTID) { id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF; - id_l = ((filter_cfg->items[i].id << 3) | + id_l = ((filter_cfg->items[i].id << 3) | (filter_cfg->items[i].ide << 2) | (filter_cfg->items[i].rtr << 1)) & 0xFFFF; mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF; From 28ec21671cfd8992b3ad2d6ea48989968ad23e7c Mon Sep 17 00:00:00 2001 From: cosmo Date: Mon, 22 Mar 2021 14:24:05 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=B8=AD=E4=BB=8Ecan.h=E6=8B=B7=E8=B4=9D=E7=9A=84rt?= =?UTF-8?q?=5Fcan=5Ffilter=5Fitem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_can.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drv_can.c index 084c0d53cb..27d61501e9 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_can.c @@ -320,18 +320,6 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; } /** - * struct rt_can_filter_item { - * rt_uint32_t id : 29; // 报文 ID - * rt_uint32_t ide : 1; // 扩展帧标识位 - * rt_uint32_t rtr : 1; // 远程帧标识位 - * rt_uint32_t mode : 1; // 过滤表模式 - * rt_uint32_t mask; // ID 掩码,0 表示对应的位不关心,1 表示对应的位必须匹配 - * rt_int32_t hdr; // -1 表示不指定过滤表号,对应的过滤表控制块也不会被初始化,正数为过滤表号,对应的过滤表控制块会被初始化 - * #ifdef RT_CAN_USING_HDR // 过滤表回调函数 - * rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size); // 回调函数参数 - * void *args; - * #endif - * }; * ID | CAN_FxR1[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] | * MASK | CAN_FxR2[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] | * STD ID | STID[10:3] | STDID[2:0] |<- 21bit ->|