Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mbed_blinky-bmd-200 bmd-200_accel_demo firstRig
Fork of mbed-src by
Revision 534:2939f5396008, committed 2015-04-30
- Comitter:
- mbed_official
- Date:
- Thu Apr 30 09:15:06 2015 +0100
- Parent:
- 533:dcb248af6296
- Child:
- 535: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
--- 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];
