User | Revision | Line number | New contents of line |
sinrab |
0:5464d5e415e5
|
1
|
/* mbed Microcontroller Library
|
sinrab |
0:5464d5e415e5
|
2
|
* Copyright (c) 2006-2013 ARM Limited
|
sinrab |
0:5464d5e415e5
|
3
|
*
|
sinrab |
0:5464d5e415e5
|
4
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
sinrab |
0:5464d5e415e5
|
5
|
* you may not use this file except in compliance with the License.
|
sinrab |
0:5464d5e415e5
|
6
|
* You may obtain a copy of the License at
|
sinrab |
0:5464d5e415e5
|
7
|
*
|
sinrab |
0:5464d5e415e5
|
8
|
* http://www.apache.org/licenses/LICENSE-2.0
|
sinrab |
0:5464d5e415e5
|
9
|
*
|
sinrab |
0:5464d5e415e5
|
10
|
* Unless required by applicable law or agreed to in writing, software
|
sinrab |
0:5464d5e415e5
|
11
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
sinrab |
0:5464d5e415e5
|
12
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
sinrab |
0:5464d5e415e5
|
13
|
* See the License for the specific language governing permissions and
|
sinrab |
0:5464d5e415e5
|
14
|
* limitations under the License.
|
sinrab |
0:5464d5e415e5
|
15
|
*/
|
sinrab |
0:5464d5e415e5
|
16
|
#include "CAN.h"
|
sinrab |
0:5464d5e415e5
|
17
|
|
sinrab |
0:5464d5e415e5
|
18
|
#if DEVICE_CAN
|
sinrab |
0:5464d5e415e5
|
19
|
|
sinrab |
0:5464d5e415e5
|
20
|
#include "cmsis.h"
|
sinrab |
0:5464d5e415e5
|
21
|
|
sinrab |
0:5464d5e415e5
|
22
|
namespace mbed {
|
sinrab |
0:5464d5e415e5
|
23
|
|
sinrab |
0:5464d5e415e5
|
24
|
CAN::CAN(PinName rd, PinName td) : _can(), _irq() {
|
sinrab |
0:5464d5e415e5
|
25
|
can_init(&_can, rd, td);
|
sinrab |
0:5464d5e415e5
|
26
|
can_irq_init(&_can, (&CAN::_irq_handler), (uint32_t)this);
|
sinrab |
0:5464d5e415e5
|
27
|
}
|
sinrab |
0:5464d5e415e5
|
28
|
|
sinrab |
0:5464d5e415e5
|
29
|
CAN::~CAN() {
|
sinrab |
0:5464d5e415e5
|
30
|
can_irq_free(&_can);
|
sinrab |
0:5464d5e415e5
|
31
|
can_free(&_can);
|
sinrab |
0:5464d5e415e5
|
32
|
}
|
sinrab |
0:5464d5e415e5
|
33
|
|
sinrab |
0:5464d5e415e5
|
34
|
int CAN::frequency(int f) {
|
sinrab |
0:5464d5e415e5
|
35
|
return can_frequency(&_can, f);
|
sinrab |
0:5464d5e415e5
|
36
|
}
|
sinrab |
0:5464d5e415e5
|
37
|
|
sinrab |
0:5464d5e415e5
|
38
|
int CAN::write(CANMessage msg) {
|
sinrab |
0:5464d5e415e5
|
39
|
return can_write(&_can, msg, 0);
|
sinrab |
0:5464d5e415e5
|
40
|
}
|
sinrab |
0:5464d5e415e5
|
41
|
|
sinrab |
0:5464d5e415e5
|
42
|
int CAN::read(CANMessage &msg, int handle) {
|
sinrab |
0:5464d5e415e5
|
43
|
return can_read(&_can, &msg, handle);
|
sinrab |
0:5464d5e415e5
|
44
|
}
|
sinrab |
0:5464d5e415e5
|
45
|
|
sinrab |
0:5464d5e415e5
|
46
|
void CAN::reset() {
|
sinrab |
0:5464d5e415e5
|
47
|
can_reset(&_can);
|
sinrab |
0:5464d5e415e5
|
48
|
}
|
sinrab |
0:5464d5e415e5
|
49
|
|
sinrab |
0:5464d5e415e5
|
50
|
unsigned char CAN::rderror() {
|
sinrab |
0:5464d5e415e5
|
51
|
return can_rderror(&_can);
|
sinrab |
0:5464d5e415e5
|
52
|
}
|
sinrab |
0:5464d5e415e5
|
53
|
|
sinrab |
0:5464d5e415e5
|
54
|
unsigned char CAN::tderror() {
|
sinrab |
0:5464d5e415e5
|
55
|
return can_tderror(&_can);
|
sinrab |
0:5464d5e415e5
|
56
|
}
|
sinrab |
0:5464d5e415e5
|
57
|
|
sinrab |
0:5464d5e415e5
|
58
|
void CAN::monitor(bool silent) {
|
sinrab |
0:5464d5e415e5
|
59
|
can_monitor(&_can, (silent) ? 1 : 0);
|
sinrab |
0:5464d5e415e5
|
60
|
}
|
sinrab |
0:5464d5e415e5
|
61
|
|
sinrab |
0:5464d5e415e5
|
62
|
int CAN::mode(Mode mode) {
|
sinrab |
0:5464d5e415e5
|
63
|
return can_mode(&_can, (CanMode)mode);
|
sinrab |
0:5464d5e415e5
|
64
|
}
|
sinrab |
0:5464d5e415e5
|
65
|
|
sinrab |
0:5464d5e415e5
|
66
|
int CAN::filter(unsigned int id, unsigned int mask, CANFormat format, int handle) {
|
sinrab |
0:5464d5e415e5
|
67
|
return can_filter(&_can, id, mask, format, handle);
|
sinrab |
0:5464d5e415e5
|
68
|
}
|
sinrab |
0:5464d5e415e5
|
69
|
|
sinrab |
0:5464d5e415e5
|
70
|
void CAN::attach(void (*fptr)(void), IrqType type) {
|
sinrab |
0:5464d5e415e5
|
71
|
if (fptr) {
|
sinrab |
0:5464d5e415e5
|
72
|
_irq[(CanIrqType)type].attach(fptr);
|
sinrab |
0:5464d5e415e5
|
73
|
can_irq_set(&_can, (CanIrqType)type, 1);
|
sinrab |
0:5464d5e415e5
|
74
|
} else {
|
sinrab |
0:5464d5e415e5
|
75
|
can_irq_set(&_can, (CanIrqType)type, 0);
|
sinrab |
0:5464d5e415e5
|
76
|
}
|
sinrab |
0:5464d5e415e5
|
77
|
}
|
sinrab |
0:5464d5e415e5
|
78
|
|
sinrab |
0:5464d5e415e5
|
79
|
void CAN::_irq_handler(uint32_t id, CanIrqType type) {
|
sinrab |
0:5464d5e415e5
|
80
|
CAN *handler = (CAN*)id;
|
sinrab |
0:5464d5e415e5
|
81
|
handler->_irq[type].call();
|
sinrab |
0:5464d5e415e5
|
82
|
}
|
sinrab |
0:5464d5e415e5
|
83
|
|
sinrab |
0:5464d5e415e5
|
84
|
} // namespace mbed
|
sinrab |
0:5464d5e415e5
|
85
|
|
sinrab |
0:5464d5e415e5
|
86
|
#endif
|
sinrab |
0:5464d5e415e5
|
87
|
|