From fe04561a7cf4fe98f714837d276fe18547d7081b Mon Sep 17 00:00:00 2001 From: Devan Lai Date: Tue, 7 Apr 2015 21:58:45 -0700 Subject: [PATCH] [mbed][LPC17XX] Implement CAN::mode for LPC176X Implement all CAN modes except for GlobalTest and SilentTest on on the LPC17XX --- .../hal/TARGET_NXP/TARGET_LPC176X/can_api.c | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c index 5aab445133..75d6d7e633 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c @@ -79,7 +79,45 @@ static inline void can_enable(can_t *obj) { } int can_mode(can_t *obj, CanMode mode) { - return 0; // not implemented + int success = 0; + switch (mode) { + case MODE_RESET: + // Clear all special modes + can_reset(obj); + obj->dev->MOD &=~ 0x06; + success = 1; + break; + case MODE_NORMAL: + // Clear all special modes + can_disable(obj); + obj->dev->MOD &=~ 0x06; + can_enable(obj); + success = 1; + break; + case MODE_SILENT: + // Set listen-only mode and clear self-test mode + can_disable(obj); + obj->dev->MOD |= 0x02; + obj->dev->MOD &=~ 0x04; + can_enable(obj); + success = 1; + break; + case MODE_TEST_LOCAL: + // Set self-test mode and clear listen-only mode + can_disable(obj); + obj->dev->MOD |= 0x04; + obj->dev->MOD &=~ 0x02; + can_enable(obj); + success = 1; + break; + case MODE_TEST_SILENT: + case MODE_TEST_GLOBAL: + default: + success = 0; + break; + } + + return success; } 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) { const unsigned int *buf = (const unsigned int *)&m; CANStatus = obj->dev->SR; + + // Send the message to ourself if in a test mode + if (obj->dev->MOD & 0x04) { + cc = 1; + } + if (CANStatus & 0x00000004) { obj->dev->TFI1 = buf[0] & 0xC00F0000; obj->dev->TID1 = buf[1];