Skip to content

Commit 38a9c84

Browse files
authored
Merge pull request #2988 from martinjaeger/master
Update of can_api.c fixing #2987
2 parents 8a9a246 + eb95c14 commit 38a9c84

File tree

1 file changed

+44
-34
lines changed

1 file changed

+44
-34
lines changed

targets/TARGET_STM/TARGET_STM32F0/can_api.c

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

350347
int 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

371381
static 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

Comments
 (0)