@@ -349,23 +349,39 @@ int can_mode(can_t *obj, CanMode mode)
349
349
350
350
int can_filter (can_t * obj , uint32_t id , uint32_t mask , CANFormat format , int32_t handle )
351
351
{
352
- CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
353
- CAN_FilterConfTypeDef sFilterConfig ;
352
+ int retval = 0 ;
354
353
355
- sFilterConfig .FilterNumber = handle ;
356
- sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
357
- sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
358
- sFilterConfig .FilterIdHigh = (uint8_t ) (id >> 8 );
359
- sFilterConfig .FilterIdLow = (uint8_t ) id ;
360
- sFilterConfig .FilterMaskIdHigh = (uint8_t ) (mask >> 8 );
361
- sFilterConfig .FilterMaskIdLow = (uint8_t ) mask ;
362
- sFilterConfig .FilterFIFOAssignment = 0 ;
363
- sFilterConfig .FilterActivation = ENABLE ;
364
- sFilterConfig .BankNumber = 14 ;
365
-
366
- HAL_CAN_ConfigFilter (& CanHandle , & sFilterConfig );
367
-
368
- return 0 ;
354
+ // filter for CANAny format cannot be configured for STM32
355
+ if ((format == CANStandard ) || (format == CANExtended )) {
356
+
357
+ CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
358
+ CAN_FilterConfTypeDef sFilterConfig ;
359
+
360
+ sFilterConfig .FilterNumber = handle ;
361
+ sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
362
+ sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
363
+
364
+ if (format == CANStandard ) {
365
+ sFilterConfig .FilterIdHigh = id << 5 ;
366
+ sFilterConfig .FilterIdLow = 0x0 ;
367
+ sFilterConfig .FilterMaskIdHigh = mask << 5 ;
368
+ sFilterConfig .FilterMaskIdLow = 0x0 ; // allows both remote and data frames
369
+ }
370
+ else if (format == CANExtended ){
371
+ sFilterConfig .FilterIdHigh = id >> 13 ; // EXTID[28:13]
372
+ sFilterConfig .FilterIdLow = (0x00FF & (id << 3 )) | (1 << 2 ); // EXTID[12:0]
373
+ sFilterConfig .FilterMaskIdHigh = mask >> 13 ;
374
+ sFilterConfig .FilterMaskIdLow = (0x00FF & (mask << 3 )) | (1 << 2 );
375
+ }
376
+
377
+ sFilterConfig .FilterFIFOAssignment = 0 ;
378
+ sFilterConfig .FilterActivation = ENABLE ;
379
+ sFilterConfig .BankNumber = 14 + handle ;
380
+
381
+ HAL_CAN_ConfigFilter (& CanHandle , & sFilterConfig );
382
+ retval = handle ;
383
+ }
384
+ return retval ;
369
385
}
370
386
371
387
static void can_irq (CANName name , int id )
0 commit comments