Skip to content

Commit fe04561

Browse files
committed
[mbed][LPC17XX] Implement CAN::mode for LPC176X
Implement all CAN modes except for GlobalTest and SilentTest on on the LPC17XX
1 parent 52f20bf commit fe04561

File tree

1 file changed

+45
-1
lines changed
  • libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X

1 file changed

+45
-1
lines changed

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,45 @@ static inline void can_enable(can_t *obj) {
7979
}
8080

8181
int can_mode(can_t *obj, CanMode mode) {
82-
return 0; // not implemented
82+
int success = 0;
83+
switch (mode) {
84+
case MODE_RESET:
85+
// Clear all special modes
86+
can_reset(obj);
87+
obj->dev->MOD &=~ 0x06;
88+
success = 1;
89+
break;
90+
case MODE_NORMAL:
91+
// Clear all special modes
92+
can_disable(obj);
93+
obj->dev->MOD &=~ 0x06;
94+
can_enable(obj);
95+
success = 1;
96+
break;
97+
case MODE_SILENT:
98+
// Set listen-only mode and clear self-test mode
99+
can_disable(obj);
100+
obj->dev->MOD |= 0x02;
101+
obj->dev->MOD &=~ 0x04;
102+
can_enable(obj);
103+
success = 1;
104+
break;
105+
case MODE_TEST_LOCAL:
106+
// Set self-test mode and clear listen-only mode
107+
can_disable(obj);
108+
obj->dev->MOD |= 0x04;
109+
obj->dev->MOD &=~ 0x02;
110+
can_enable(obj);
111+
success = 1;
112+
break;
113+
case MODE_TEST_SILENT:
114+
case MODE_TEST_GLOBAL:
115+
default:
116+
success = 0;
117+
break;
118+
}
119+
120+
return success;
83121
}
84122

85123
int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t handle) {
@@ -316,6 +354,12 @@ int can_write(can_t *obj, CAN_Message msg, int cc) {
316354
const unsigned int *buf = (const unsigned int *)&m;
317355

318356
CANStatus = obj->dev->SR;
357+
358+
// Send the message to ourself if in a test mode
359+
if (obj->dev->MOD & 0x04) {
360+
cc = 1;
361+
}
362+
319363
if (CANStatus & 0x00000004) {
320364
obj->dev->TFI1 = buf[0] & 0xC00F0000;
321365
obj->dev->TID1 = buf[1];

0 commit comments

Comments
 (0)