mirror of https://github.com/ARMmbed/mbed-os.git
[mbed][LPC17XX] Implement CAN::mode for LPC176X
Implement all CAN modes except for GlobalTest and SilentTest on on the LPC17XXpull/1059/head
parent
52f20bfcad
commit
fe04561a7c
|
@ -79,7 +79,45 @@ static inline void can_enable(can_t *obj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int can_mode(can_t *obj, CanMode mode) {
|
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) {
|
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;
|
const unsigned int *buf = (const unsigned int *)&m;
|
||||||
|
|
||||||
CANStatus = obj->dev->SR;
|
CANStatus = obj->dev->SR;
|
||||||
|
|
||||||
|
// Send the message to ourself if in a test mode
|
||||||
|
if (obj->dev->MOD & 0x04) {
|
||||||
|
cc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (CANStatus & 0x00000004) {
|
if (CANStatus & 0x00000004) {
|
||||||
obj->dev->TFI1 = buf[0] & 0xC00F0000;
|
obj->dev->TFI1 = buf[0] & 0xC00F0000;
|
||||||
obj->dev->TID1 = buf[1];
|
obj->dev->TID1 = buf[1];
|
||||||
|
|
Loading…
Reference in New Issue