@@ -36,7 +36,7 @@ void can_init(can_t *obj, PinName rd, PinName td)
3636 obj -> can = (CANName )pinmap_merge (can_rd , can_td );
3737 MBED_ASSERT ((int )obj -> can != NC );
3838
39- if (obj -> can == CAN_1 ) {
39+ if (obj -> can == CAN_1 ) {
4040 __HAL_RCC_CAN1_CLK_ENABLE ();
4141 obj -> index = 0 ;
4242 }
@@ -173,11 +173,11 @@ int can_frequency(can_t *obj, int f)
173173
174174 if (btr > 0 ) {
175175 can -> MCR |= CAN_MCR_INRQ ;
176- while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
176+ while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
177177 }
178178 can -> BTR = btr ;
179179 can -> MCR &= ~(uint32_t )CAN_MCR_INRQ ;
180- while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
180+ while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
181181 }
182182 return 1 ;
183183 } else {
@@ -203,12 +203,9 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
203203
204204 if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX ) {
205205 can -> sTxMailBox [transmitmailbox ].TIR &= CAN_TI0R_TXRQ ;
206- if (!(msg .format ))
207- {
206+ if (!(msg .format )) {
208207 can -> sTxMailBox [transmitmailbox ].TIR |= ((msg .id << 21 ) | msg .type );
209- }
210- else
211- {
208+ } else {
212209 can -> sTxMailBox [transmitmailbox ].TIR |= ((msg .id << 3 ) | CAN_ID_EXT | msg .type );
213210 }
214211
@@ -262,7 +259,7 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
262259 msg -> data [7 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDHR >> 24 );
263260
264261 /* Release the FIFO */
265- if (handle == CAN_FIFO0 ) {
262+ if (handle == CAN_FIFO0 ) {
266263 /* Release FIFO0 */
267264 can -> RF0R = CAN_RF0R_RFOM0 ;
268265 } else { /* FIFONumber == CAN_FIFO1 */
@@ -315,7 +312,7 @@ int can_mode(can_t *obj, CanMode mode)
315312 int success = 0 ;
316313 CAN_TypeDef * can = (CAN_TypeDef * )(obj -> can );
317314 can -> MCR |= CAN_MCR_INRQ ;
318- while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
315+ while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
319316 }
320317 switch (mode ) {
321318 case MODE_NORMAL :
@@ -342,38 +339,51 @@ int can_mode(can_t *obj, CanMode mode)
342339 break ;
343340 }
344341 can -> MCR &= ~(uint32_t )CAN_MCR_INRQ ;
345- while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
342+ while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
346343 }
347344 return success ;
348345}
349346
350347int can_filter (can_t * obj , uint32_t id , uint32_t mask , CANFormat format , int32_t handle )
351348{
352- CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
353- CAN_FilterConfTypeDef sFilterConfig ;
349+ int retval = 0 ;
354350
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 ;
351+ // filter for CANAny format cannot be configured for STM32
352+ if ((format == CANStandard ) || (format == CANExtended )) {
353+ CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
354+ CAN_FilterConfTypeDef sFilterConfig ;
355+ sFilterConfig .FilterNumber = handle ;
356+ sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
357+ sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
358+
359+ if (format == CANStandard ) {
360+ sFilterConfig .FilterIdHigh = id << 5 ;
361+ sFilterConfig .FilterIdLow = 0x0 ;
362+ sFilterConfig .FilterMaskIdHigh = mask << 5 ;
363+ sFilterConfig .FilterMaskIdLow = 0x0 ; // allows both remote and data frames
364+ } else if (format == CANExtended ) {
365+ sFilterConfig .FilterIdHigh = id >> 13 ; // EXTID[28:13]
366+ sFilterConfig .FilterIdLow = (0x00FF & (id << 3 )) | (1 << 2 ); // EXTID[12:0]
367+ sFilterConfig .FilterMaskIdHigh = mask >> 13 ;
368+ sFilterConfig .FilterMaskIdLow = (0x00FF & (mask << 3 )) | (1 << 2 );
369+ }
370+
371+ sFilterConfig .FilterFIFOAssignment = 0 ;
372+ sFilterConfig .FilterActivation = ENABLE ;
373+ sFilterConfig .BankNumber = 14 + handle ;
374+
375+ HAL_CAN_ConfigFilter (& CanHandle , & sFilterConfig );
376+ retval = handle ;
377+ }
378+ return retval ;
369379}
370380
371381static void can_irq (CANName name , int id )
372382{
373383 uint32_t tmp1 = 0 , tmp2 = 0 , tmp3 = 0 ;
374384 CanHandle .Instance = (CAN_TypeDef * )name ;
375385
376- if (__HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_TME )) {
386+ if (__HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_TME )) {
377387 tmp1 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_0 );
378388 tmp2 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_1 );
379389 tmp3 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_2 );
@@ -386,27 +396,27 @@ static void can_irq(CANName name, int id)
386396 tmp1 = __HAL_CAN_MSG_PENDING (& CanHandle , CAN_FIFO0 );
387397 tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_FMP0 );
388398
389- if ((tmp1 != 0 ) && tmp2 ) {
399+ if ((tmp1 != 0 ) && tmp2 ) {
390400 irq_handler (can_irq_ids [id ], IRQ_RX );
391401 }
392402
393403 tmp1 = __HAL_CAN_GET_FLAG (& CanHandle , CAN_FLAG_EPV );
394404 tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_EPV );
395405 tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
396406
397- if (tmp1 && tmp2 && tmp3 ) {
407+ if (tmp1 && tmp2 && tmp3 ) {
398408 irq_handler (can_irq_ids [id ], IRQ_PASSIVE );
399409 }
400410
401411 tmp1 = __HAL_CAN_GET_FLAG (& CanHandle , CAN_FLAG_BOF );
402412 tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_BOF );
403413 tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
404- if (tmp1 && tmp2 && tmp3 ) {
414+ if (tmp1 && tmp2 && tmp3 ) {
405415 irq_handler (can_irq_ids [id ], IRQ_BUS );
406416 }
407417
408418 tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
409- if (tmp1 && tmp2 && tmp3 ) {
419+ if (tmp1 && tmp2 && tmp3 ) {
410420 irq_handler (can_irq_ids [id ], IRQ_ERROR );
411421 }
412422}
@@ -424,7 +434,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
424434 uint32_t vector = 0 ;
425435 uint32_t ier ;
426436
427- if (obj -> can == CAN_1 ) {
437+ if (obj -> can == CAN_1 ) {
428438 switch (type ) {
429439 case IRQ_RX :
430440 ier = CAN_IT_FMP0 ;
@@ -447,7 +457,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
447457 vector = (uint32_t )& CAN_IRQHandler ;
448458 }
449459
450- if (enable ) {
460+ if (enable ) {
451461 can -> IER |= ier ;
452462 } else {
453463 can -> IER &= ~ier ;
0 commit comments