Skip to content

Commit 8357f6f

Browse files
committed
STM32: CAN: store the mode in object context
In order to apply the same mode in case of reset, we store the current requested mode in the HAL structure. To make storage in a single place, we also change can_monitor to call can_mode function as they actually acting on same registers.
1 parent 57222b6 commit 8357f6f

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

targets/TARGET_STM/can_api.c

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -347,21 +347,31 @@ unsigned char can_tderror(can_t *obj)
347347

348348
void can_monitor(can_t *obj, int silent)
349349
{
350-
CAN_TypeDef *can = obj->CanHandle.Instance;
351-
352-
can->MCR |= CAN_MCR_INRQ ;
353-
while ((can->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) {
354-
}
355-
356-
if (silent) {
357-
can->BTR |= ((uint32_t)1 << 31);
350+
CanMode mode = MODE_NORMAL;
351+
/* Update current state w/ or w/o silent */
352+
if(silent) {
353+
switch (obj->CanHandle.Init.Mode) {
354+
case CAN_MODE_LOOPBACK:
355+
case CAN_MODE_SILENT_LOOPBACK:
356+
mode = MODE_TEST_SILENT;
357+
break;
358+
default:
359+
mode = MODE_SILENT;
360+
break;
361+
}
358362
} else {
359-
can->BTR &= ~((uint32_t)1 << 31);
363+
switch (obj->CanHandle.Init.Mode) {
364+
case CAN_MODE_LOOPBACK:
365+
case CAN_MODE_SILENT_LOOPBACK:
366+
mode = MODE_TEST_LOCAL;
367+
break;
368+
default:
369+
mode = MODE_NORMAL;
370+
break;
371+
}
360372
}
361373

362-
can->MCR &= ~(uint32_t)CAN_MCR_INRQ;
363-
while ((can->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) {
364-
}
374+
can_mode(obj, mode);
365375
}
366376

367377
int can_mode(can_t *obj, CanMode mode)
@@ -375,21 +385,25 @@ int can_mode(can_t *obj, CanMode mode)
375385

376386
switch (mode) {
377387
case MODE_NORMAL:
388+
obj->CanHandle.Init.Mode = CAN_MODE_NORMAL;
378389
can->BTR &= ~(CAN_BTR_SILM | CAN_BTR_LBKM);
379390
success = 1;
380391
break;
381392
case MODE_SILENT:
393+
obj->CanHandle.Init.Mode = CAN_MODE_SILENT;
382394
can->BTR |= CAN_BTR_SILM;
383395
can->BTR &= ~CAN_BTR_LBKM;
384396
success = 1;
385397
break;
386398
case MODE_TEST_GLOBAL:
387399
case MODE_TEST_LOCAL:
400+
obj->CanHandle.Init.Mode = CAN_MODE_LOOPBACK;
388401
can->BTR |= CAN_BTR_LBKM;
389402
can->BTR &= ~CAN_BTR_SILM;
390403
success = 1;
391404
break;
392405
case MODE_TEST_SILENT:
406+
obj->CanHandle.Init.Mode = CAN_MODE_SILENT_LOOPBACK;
393407
can->BTR |= (CAN_BTR_SILM | CAN_BTR_LBKM);
394408
success = 1;
395409
break;

0 commit comments

Comments
 (0)