@@ -36,7 +36,7 @@ void can_init(can_t *obj, PinName rd, PinName td)
36
36
obj -> can = (CANName )pinmap_merge (can_rd , can_td );
37
37
MBED_ASSERT ((int )obj -> can != NC );
38
38
39
- if (obj -> can == CAN_1 ) {
39
+ if (obj -> can == CAN_1 ) {
40
40
__HAL_RCC_CAN1_CLK_ENABLE ();
41
41
obj -> index = 0 ;
42
42
}
@@ -173,11 +173,11 @@ int can_frequency(can_t *obj, int f)
173
173
174
174
if (btr > 0 ) {
175
175
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 ) {
177
177
}
178
178
can -> BTR = btr ;
179
179
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 ) {
181
181
}
182
182
return 1 ;
183
183
} else {
@@ -203,12 +203,9 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
203
203
204
204
if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX ) {
205
205
can -> sTxMailBox [transmitmailbox ].TIR &= CAN_TI0R_TXRQ ;
206
- if (!(msg .format ))
207
- {
206
+ if (!(msg .format )) {
208
207
can -> sTxMailBox [transmitmailbox ].TIR |= ((msg .id << 21 ) | msg .type );
209
- }
210
- else
211
- {
208
+ } else {
212
209
can -> sTxMailBox [transmitmailbox ].TIR |= ((msg .id << 3 ) | CAN_ID_EXT | msg .type );
213
210
}
214
211
@@ -262,7 +259,7 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
262
259
msg -> data [7 ] = (uint8_t )0xFF & (can -> sFIFOMailBox [handle ].RDHR >> 24 );
263
260
264
261
/* Release the FIFO */
265
- if (handle == CAN_FIFO0 ) {
262
+ if (handle == CAN_FIFO0 ) {
266
263
/* Release FIFO0 */
267
264
can -> RF0R = CAN_RF0R_RFOM0 ;
268
265
} else { /* FIFONumber == CAN_FIFO1 */
@@ -315,7 +312,7 @@ int can_mode(can_t *obj, CanMode mode)
315
312
int success = 0 ;
316
313
CAN_TypeDef * can = (CAN_TypeDef * )(obj -> can );
317
314
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 ) {
319
316
}
320
317
switch (mode ) {
321
318
case MODE_NORMAL :
@@ -342,38 +339,51 @@ int can_mode(can_t *obj, CanMode mode)
342
339
break ;
343
340
}
344
341
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 ) {
346
343
}
347
344
return success ;
348
345
}
349
346
350
347
int can_filter (can_t * obj , uint32_t id , uint32_t mask , CANFormat format , int32_t handle )
351
348
{
352
- CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
353
- CAN_FilterConfTypeDef sFilterConfig ;
349
+ int retval = 0 ;
354
350
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 ;
369
379
}
370
380
371
381
static void can_irq (CANName name , int id )
372
382
{
373
383
uint32_t tmp1 = 0 , tmp2 = 0 , tmp3 = 0 ;
374
384
CanHandle .Instance = (CAN_TypeDef * )name ;
375
385
376
- if (__HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_TME )) {
386
+ if (__HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_TME )) {
377
387
tmp1 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_0 );
378
388
tmp2 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_1 );
379
389
tmp3 = __HAL_CAN_TRANSMIT_STATUS (& CanHandle , CAN_TXMAILBOX_2 );
@@ -386,27 +396,27 @@ static void can_irq(CANName name, int id)
386
396
tmp1 = __HAL_CAN_MSG_PENDING (& CanHandle , CAN_FIFO0 );
387
397
tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_FMP0 );
388
398
389
- if ((tmp1 != 0 ) && tmp2 ) {
399
+ if ((tmp1 != 0 ) && tmp2 ) {
390
400
irq_handler (can_irq_ids [id ], IRQ_RX );
391
401
}
392
402
393
403
tmp1 = __HAL_CAN_GET_FLAG (& CanHandle , CAN_FLAG_EPV );
394
404
tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_EPV );
395
405
tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
396
406
397
- if (tmp1 && tmp2 && tmp3 ) {
407
+ if (tmp1 && tmp2 && tmp3 ) {
398
408
irq_handler (can_irq_ids [id ], IRQ_PASSIVE );
399
409
}
400
410
401
411
tmp1 = __HAL_CAN_GET_FLAG (& CanHandle , CAN_FLAG_BOF );
402
412
tmp2 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_BOF );
403
413
tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
404
- if (tmp1 && tmp2 && tmp3 ) {
414
+ if (tmp1 && tmp2 && tmp3 ) {
405
415
irq_handler (can_irq_ids [id ], IRQ_BUS );
406
416
}
407
417
408
418
tmp3 = __HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_ERR );
409
- if (tmp1 && tmp2 && tmp3 ) {
419
+ if (tmp1 && tmp2 && tmp3 ) {
410
420
irq_handler (can_irq_ids [id ], IRQ_ERROR );
411
421
}
412
422
}
@@ -424,7 +434,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
424
434
uint32_t vector = 0 ;
425
435
uint32_t ier ;
426
436
427
- if (obj -> can == CAN_1 ) {
437
+ if (obj -> can == CAN_1 ) {
428
438
switch (type ) {
429
439
case IRQ_RX :
430
440
ier = CAN_IT_FMP0 ;
@@ -447,7 +457,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
447
457
vector = (uint32_t )& CAN_IRQHandler ;
448
458
}
449
459
450
- if (enable ) {
460
+ if (enable ) {
451
461
can -> IER |= ier ;
452
462
} else {
453
463
can -> IER &= ~ier ;
0 commit comments