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) {
|
||||
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];
|
||||
|
|
Loading…
Reference in New Issue