[mbed][LPC17XX] Implement CAN::mode for LPC176X

Implement all CAN modes except for GlobalTest and SilentTest on on the LPC17XX
pull/1059/head
Devan Lai 2015-04-07 21:58:45 -07:00
parent 52f20bfcad
commit fe04561a7c
1 changed files with 45 additions and 1 deletions

View File

@ -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];