Skip to content

Commit c233c88

Browse files
committed
[mbed][CAN] Implement CAN::mode for C_CAN controllers
Implement all CAN modes except for GlobalTest on on the LPC11CXX and LPC15XX targets which use the C_CAN controller Fix swapped ordering between MODE_TEST_LOCAL and MODE_TEST_GLOBAL in the HAL definition of CanMode.
1 parent 29ab478 commit c233c88

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

libraries/mbed/hal/can_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ typedef enum {
4545
MODE_RESET,
4646
MODE_NORMAL,
4747
MODE_SILENT,
48-
MODE_TEST_GLOBAL,
4948
MODE_TEST_LOCAL,
49+
MODE_TEST_GLOBAL,
5050
MODE_TEST_SILENT
5151
} CanMode;
5252

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/can_api.c

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

4747
int can_mode(can_t *obj, CanMode mode) {
48-
return 0; // not implemented
48+
int success = 0;
49+
switch (mode) {
50+
case MODE_RESET:
51+
LPC_CAN->CNTL &=~CANCNTL_TEST;
52+
can_disable(obj);
53+
success = 1;
54+
break;
55+
case MODE_NORMAL:
56+
LPC_CAN->CNTL &=~CANCNTL_TEST;
57+
can_enable(obj);
58+
success = 1;
59+
break;
60+
case MODE_SILENT:
61+
LPC_CAN->CNTL |= CANCNTL_TEST;
62+
LPC_CAN->TEST |= CANTEST_SILENT;
63+
LPC_CAN->TEST &=~CANTEST_LBACK;
64+
success = 1;
65+
break;
66+
case MODE_TEST_LOCAL:
67+
LPC_CAN->CNTL |= CANCNTL_TEST;
68+
LPC_CAN->TEST &=~CANTEST_SILENT;
69+
LPC_CAN->TEST |= CANTEST_LBACK;
70+
success = 1;
71+
break;
72+
case MODE_TEST_SILENT:
73+
LPC_CAN->CNTL |= CANCNTL_TEST;
74+
LPC_CAN->TEST |= (CANCNTL_LBACK | CANTEST_SILENT);
75+
success = 1;
76+
break;
77+
case MODE_TEST_GLOBAL:
78+
default:
79+
success = 0;
80+
break;
81+
}
82+
83+
return success;
4984
}
5085

5186
int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t handle) {

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

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@
5656
#define CANIFn_CMDMSK_RD (0UL << 7)
5757
#define CANIFn_CMDREQ_BUSY (1UL << 15)
5858

59+
#define CANCNTL_INIT (1 << 0) // Initialization
60+
#define CANCNTL_IE (1 << 1) // Module interrupt enable
61+
#define CANCNTL_SIE (1 << 2) // Status change interrupt enable
62+
#define CANCNTL_EIE (1 << 3) // Error interrupt enable
63+
#define CANCNTL_DAR (1 << 5) // Disable automatic retransmission
64+
#define CANCNTL_CCE (1 << 6) // Configuration change enable
65+
#define CANCNTL_TEST (1 << 7) // Test mode enable
66+
67+
#define CANTEST_BASIC (1 << 2) // Basic mode
68+
#define CANTEST_SILENT (1 << 3) // Silent mode
69+
#define CANTEST_LBACK (1 << 4) // Loop back mode
70+
#define CANTEST_TX_MASK 0x0060 // Control of CAN_TXD pins
71+
#define CANTEST_TX_SHIFT 5
72+
#define CANTEST_RX (1 << 7) // Monitors the actual value of the CAN_RXD pin.
73+
5974
static uint32_t can_irq_id = 0;
6075
static can_irq_handler irq_handler;
6176

@@ -70,7 +85,42 @@ static inline void can_enable(can_t *obj) {
7085
}
7186

7287
int can_mode(can_t *obj, CanMode mode) {
73-
return 0; // not implemented
88+
int success = 0;
89+
switch (mode) {
90+
case MODE_RESET:
91+
LPC_C_CAN0->CANCNTL &=~CANCNTL_TEST;
92+
can_disable(obj);
93+
success = 1;
94+
break;
95+
case MODE_NORMAL:
96+
LPC_C_CAN0->CANCNTL &=~CANCNTL_TEST;
97+
can_enable(obj);
98+
success = 1;
99+
break;
100+
case MODE_SILENT:
101+
LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
102+
LPC_C_CAN0->CANTEST |= CANTEST_SILENT;
103+
LPC_C_CAN0->CANTEST &=~ CANTEST_LBACK;
104+
success = 1;
105+
break;
106+
case MODE_TEST_LOCAL:
107+
LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
108+
LPC_C_CAN0->CANTEST &=~CANTEST_SILENT;
109+
LPC_C_CAN0->CANTEST |= CANTEST_LBACK;
110+
success = 1;
111+
break;
112+
case MODE_TEST_SILENT:
113+
LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
114+
LPC_C_CAN0->CANTEST |= (CANTEST_LBACK | CANTEST_SILENT);
115+
success = 1;
116+
break;
117+
case MODE_TEST_GLOBAL:
118+
default:
119+
success = 0;
120+
break;
121+
}
122+
123+
return success;
74124
}
75125

76126
int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t handle) {

0 commit comments

Comments
 (0)