mbed library sources

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Thu Apr 30 09:15:06 2015 +0100
Parent:
529:dcb248af6296
Child:
531:47d2b67c511f
Commit message:
Synchronized with git revision 334b3418dfe6e5d09d62fee80232883fcd1cbb1e

Full URL: https://github.com/mbedmicro/mbed/commit/334b3418dfe6e5d09d62fee80232883fcd1cbb1e/

Implement some CAN modes for the LPC1549/LPC11Cxx/LPC1768

Changed in this revision

hal/can_api.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/can_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC15XX/can_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/hal/can_api.h	Thu Apr 30 07:45:07 2015 +0100
+++ b/hal/can_api.h	Thu Apr 30 09:15:06 2015 +0100
@@ -45,8 +45,8 @@
     MODE_RESET,
     MODE_NORMAL,
     MODE_SILENT,
+    MODE_TEST_LOCAL,
     MODE_TEST_GLOBAL,
-    MODE_TEST_LOCAL,
     MODE_TEST_SILENT
 } CanMode;
 
--- a/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/can_api.c	Thu Apr 30 07:45:07 2015 +0100
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/can_api.c	Thu Apr 30 09:15:06 2015 +0100
@@ -45,7 +45,42 @@
 }
 
 int can_mode(can_t *obj, CanMode mode) {
-    return 0; // not implemented
+    int success = 0;
+    switch (mode) {
+        case MODE_RESET:
+            LPC_CAN->CNTL &=~CANCNTL_TEST;
+            can_disable(obj);
+            success = 1;
+            break;
+        case MODE_NORMAL:
+            LPC_CAN->CNTL &=~CANCNTL_TEST;
+            can_enable(obj);
+            success = 1;
+            break;
+        case MODE_SILENT:
+            LPC_CAN->CNTL |= CANCNTL_TEST;
+            LPC_CAN->TEST |= CANTEST_SILENT;
+            LPC_CAN->TEST &=~CANTEST_LBACK;
+            success = 1;
+            break;
+        case MODE_TEST_LOCAL:
+            LPC_CAN->CNTL |= CANCNTL_TEST;
+            LPC_CAN->TEST &=~CANTEST_SILENT;
+            LPC_CAN->TEST |= CANTEST_LBACK;
+            success = 1;
+            break;
+        case MODE_TEST_SILENT:
+            LPC_CAN->CNTL |= CANCNTL_TEST;
+            LPC_CAN->TEST |= (CANCNTL_LBACK | CANTEST_SILENT);
+            success = 1;
+            break;
+        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) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC15XX/can_api.c	Thu Apr 30 07:45:07 2015 +0100
+++ b/targets/hal/TARGET_NXP/TARGET_LPC15XX/can_api.c	Thu Apr 30 09:15:06 2015 +0100
@@ -56,6 +56,21 @@
 #define CANIFn_CMDMSK_RD        (0UL << 7)
 #define CANIFn_CMDREQ_BUSY      (1UL << 15)
 
+#define CANCNTL_INIT                   (1 << 0)           // Initialization
+#define CANCNTL_IE                     (1 << 1)           // Module interrupt enable
+#define CANCNTL_SIE                    (1 << 2)           // Status change interrupt enable
+#define CANCNTL_EIE                    (1 << 3)           // Error interrupt enable
+#define CANCNTL_DAR                    (1 << 5)           // Disable automatic retransmission
+#define CANCNTL_CCE                    (1 << 6)           // Configuration change enable
+#define CANCNTL_TEST                   (1 << 7)           // Test mode enable
+
+#define CANTEST_BASIC                  (1 << 2)           // Basic mode
+#define CANTEST_SILENT                 (1 << 3)           // Silent mode
+#define CANTEST_LBACK                  (1 << 4)           // Loop back mode
+#define CANTEST_TX_MASK                0x0060             // Control of CAN_TXD pins
+#define CANTEST_TX_SHIFT               5                 
+#define CANTEST_RX                     (1 << 7)           // Monitors the actual value of the CAN_RXD pin.
+
 static uint32_t can_irq_id = 0;
 static can_irq_handler irq_handler;
 
@@ -70,7 +85,42 @@
 }
 
 int can_mode(can_t *obj, CanMode mode) {
-    return 0; // not implemented
+    int success = 0;
+    switch (mode) {
+        case MODE_RESET:
+            LPC_C_CAN0->CANCNTL &=~CANCNTL_TEST;
+            can_disable(obj);
+            success = 1;
+            break;
+        case MODE_NORMAL:
+            LPC_C_CAN0->CANCNTL &=~CANCNTL_TEST;
+            can_enable(obj);
+            success = 1;
+            break;
+        case MODE_SILENT:
+            LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
+            LPC_C_CAN0->CANTEST |= CANTEST_SILENT;
+            LPC_C_CAN0->CANTEST &=~ CANTEST_LBACK;
+            success = 1;
+            break;
+        case MODE_TEST_LOCAL:
+            LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
+            LPC_C_CAN0->CANTEST &=~CANTEST_SILENT;
+            LPC_C_CAN0->CANTEST |= CANTEST_LBACK;
+            success = 1;
+            break;
+        case MODE_TEST_SILENT:
+            LPC_C_CAN0->CANCNTL |= CANCNTL_TEST;
+            LPC_C_CAN0->CANTEST |= (CANTEST_LBACK | CANTEST_SILENT);
+            success = 1;
+            break;
+        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) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c	Thu Apr 30 07:45:07 2015 +0100
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/can_api.c	Thu Apr 30 09:15:06 2015 +0100
@@ -79,7 +79,45 @@
 }
 
 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 @@
     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];