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.
Fork of mbed by
CAN.h@33:5364839841bd, 2012-01-10 (annotated)
- Committer:
- emilmont
- Date:
- Tue Jan 10 12:00:50 2012 +0000
- Revision:
- 33:5364839841bd
- Parent:
- 27:7110ebee3484
- Child:
- 43:e2ed12d17f06
[10 January 2012] CAN::attach template. CMSIS updates.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rolf.meyer@arm.com | 11:1c1ebd0324fa | 1 | /* mbed Microcontroller Library - can |
emilmont | 27:7110ebee3484 | 2 | * Copyright (c) 2009-2011 ARM Limited. All rights reserved. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 3 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 4 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 5 | #ifndef MBED_CAN_H |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 6 | #define MBED_CAN_H |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 7 | |
emilmont | 27:7110ebee3484 | 8 | #include "device.h" |
emilmont | 27:7110ebee3484 | 9 | |
emilmont | 27:7110ebee3484 | 10 | #if DEVICE_CAN |
emilmont | 27:7110ebee3484 | 11 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 12 | #include "Base.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 13 | #include "platform.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 14 | #include "PinNames.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 15 | #include "PeripheralNames.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 16 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 17 | #include "can_helper.h" |
simon | 22:9114680c05da | 18 | #include "FunctionPointer.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 19 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 20 | #include <string.h> |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 21 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 22 | namespace mbed { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 23 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 24 | /* Class: CANMessage |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 25 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 26 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 27 | class CANMessage : public CAN_Message { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 28 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 29 | public: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 30 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 31 | /* Constructor: CANMessage |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 32 | * Creates empty CAN message. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 33 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 34 | CANMessage() { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 35 | len = 8; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 36 | type = CANData; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 37 | format = CANStandard; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 38 | id = 0; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 39 | memset(data, 0, 8); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 40 | } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 41 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 42 | /* Constructor: CANMessage |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 43 | * Creates CAN message with specific content. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 44 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 45 | CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 46 | len = _len & 0xF; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 47 | type = _type; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 48 | format = _format; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 49 | id = _id; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 50 | memcpy(data, _data, _len); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 51 | } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 52 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 53 | /* Constructor: CANMessage |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 54 | * Creates CAN remote message. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 55 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 56 | CANMessage(int _id, CANFormat _format = CANStandard) { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 57 | len = 0; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 58 | type = CANRemote; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 59 | format = _format; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 60 | id = _id; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 61 | memset(data, 0, 8); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 62 | } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 63 | #if 0 // Inhereted from CAN_Message, for documentation only |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 64 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 65 | /* Variable: id |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 66 | * The message id. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 67 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 68 | * If format is CANStandard it must be an 11 bit long id |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 69 | * If format is CANExtended it must be an 29 bit long id |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 70 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 71 | unsigned int id; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 72 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 73 | /* Variable: data |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 74 | * Space for 8 byte payload. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 75 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 76 | * If type is CANData data can store up to 8 byte data. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 77 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 78 | unsigned char data[8]; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 79 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 80 | /* Variable: len |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 81 | * Length of data in bytes. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 82 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 83 | * If type is CANData data can store up to 8 byte data. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 84 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 85 | unsigned char len; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 86 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 87 | /* Variable: format |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 88 | * Defines if the message has standard or extended format. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 89 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 90 | * Defines the type of message id: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 91 | * Default is CANStandard which implies 11 bit id. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 92 | * CANExtended means 29 bit message id. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 93 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 94 | CANFormat format; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 95 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 96 | /* Variable: type |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 97 | * Defines the type of a message. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 98 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 99 | * The message type can rather be CANData for a message with data (default). |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 100 | * Or CANRemote for a request of a specific CAN message. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 101 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 102 | CANType type; // 0 - DATA FRAME, 1 - REMOTE FRAME |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 103 | #endif |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 104 | }; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 105 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 106 | /* Class: CAN |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 107 | * A can bus client, used for communicating with can devices |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 108 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 109 | class CAN : public Base { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 110 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 111 | public: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 112 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 113 | /* Constructor: CAN |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 114 | * Creates an CAN interface connected to specific pins. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 115 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 116 | * Example: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 117 | * > #include "mbed.h" |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 118 | * > |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 119 | * > Ticker ticker; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 120 | * > DigitalOut led1(LED1); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 121 | * > DigitalOut led2(LED2); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 122 | * > CAN can1(p9, p10); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 123 | * > CAN can2(p30, p29); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 124 | * > |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 125 | * > char counter = 0; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 126 | * > |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 127 | * > void send() { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 128 | * > if(can1.write(CANMessage(1337, &counter, 1))) { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 129 | * > printf("Message sent: %d\n", counter); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 130 | * > counter++; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 131 | * > } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 132 | * > led1 = !led1; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 133 | * > } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 134 | * > |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 135 | * > int main() { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 136 | * > ticker.attach(&send, 1); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 137 | * > CANMessage msg; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 138 | * > while(1) { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 139 | * > if(can2.read(msg)) { |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 140 | * > printf("Message received: %d\n\n", msg.data[0]); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 141 | * > led2 = !led2; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 142 | * > } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 143 | * > wait(0.2); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 144 | * > } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 145 | * > } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 146 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 147 | * Variables: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 148 | * rd - read from transmitter |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 149 | * td - transmit to transmitter |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 150 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 151 | CAN(PinName rd, PinName td); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 152 | virtual ~CAN(); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 153 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 154 | /* Function: frequency |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 155 | * Set the frequency of the CAN interface |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 156 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 157 | * Variables: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 158 | * hz - The bus frequency in hertz |
simon | 21:3944f1e2fa4f | 159 | * returns - 1 if successful, 0 otherwise |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 160 | */ |
simon | 21:3944f1e2fa4f | 161 | int frequency(int hz); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 162 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 163 | /* Function: write |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 164 | * Write a CANMessage to the bus. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 165 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 166 | * Variables: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 167 | * msg - The CANMessage to write. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 168 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 169 | * Returns: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 170 | * 0 - If write failed. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 171 | * 1 - If write was successful. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 172 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 173 | int write(CANMessage msg); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 174 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 175 | /* Function: read |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 176 | * Read a CANMessage from the bus. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 177 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 178 | * Variables: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 179 | * msg - A CANMessage to read to. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 180 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 181 | * Returns: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 182 | * 0 - If no message arrived. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 183 | * 1 - If message arrived. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 184 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 185 | int read(CANMessage &msg); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 186 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 187 | /* Function: reset |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 188 | * Reset CAN interface. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 189 | * |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 190 | * To use after error overflow. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 191 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 192 | void reset(); |
simon | 22:9114680c05da | 193 | |
simon | 22:9114680c05da | 194 | /* Function: monitor |
simon | 22:9114680c05da | 195 | * Puts or removes the CAN interface into silent monitoring mode |
simon | 22:9114680c05da | 196 | * |
simon | 22:9114680c05da | 197 | * Variables: |
simon | 22:9114680c05da | 198 | * silent - boolean indicating whether to go into silent mode or not |
simon | 22:9114680c05da | 199 | */ |
simon | 22:9114680c05da | 200 | void monitor(bool silent); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 201 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 202 | /* Function: rderror |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 203 | * Returns number of read errors to detect read overflow errors. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 204 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 205 | unsigned char rderror(); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 206 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 207 | /* Function: tderror |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 208 | * Returns number of write errors to detect write overflow errors. |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 209 | */ |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 210 | unsigned char tderror(); |
simon | 22:9114680c05da | 211 | |
simon | 22:9114680c05da | 212 | /* Function: attach |
simon | 22:9114680c05da | 213 | * Attach a function to call whenever a CAN frame received interrupt is |
simon | 22:9114680c05da | 214 | * generated. |
simon | 22:9114680c05da | 215 | * |
simon | 22:9114680c05da | 216 | * Variables: |
simon | 22:9114680c05da | 217 | * fptr - A pointer to a void function, or 0 to set as none |
simon | 22:9114680c05da | 218 | */ |
simon | 22:9114680c05da | 219 | void attach(void (*fptr)(void)); |
simon | 22:9114680c05da | 220 | |
simon | 22:9114680c05da | 221 | /* Function attach |
simon | 22:9114680c05da | 222 | * Attach a member function to call whenever a CAN frame received interrupt |
simon | 22:9114680c05da | 223 | * is generated. |
simon | 22:9114680c05da | 224 | * |
simon | 22:9114680c05da | 225 | * Variables: |
simon | 22:9114680c05da | 226 | * tptr - pointer to the object to call the member function on |
simon | 22:9114680c05da | 227 | * mptr - pointer to the member function to be called |
simon | 22:9114680c05da | 228 | */ |
simon | 22:9114680c05da | 229 | template<typename T> |
emilmont | 33:5364839841bd | 230 | void attach(T* tptr, void (T::*mptr)(void)) { |
emilmont | 33:5364839841bd | 231 | if((mptr != NULL) && (tptr != NULL)) { |
emilmont | 33:5364839841bd | 232 | _rxirq.attach(tptr, mptr); |
emilmont | 33:5364839841bd | 233 | setup_interrupt(); |
emilmont | 33:5364839841bd | 234 | } else { |
emilmont | 33:5364839841bd | 235 | remove_interrupt(); |
emilmont | 33:5364839841bd | 236 | } |
emilmont | 33:5364839841bd | 237 | } |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 238 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 239 | private: |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 240 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 241 | CANName _id; |
simon | 22:9114680c05da | 242 | FunctionPointer _rxirq; |
simon | 22:9114680c05da | 243 | |
simon | 22:9114680c05da | 244 | void setup_interrupt(void); |
simon | 22:9114680c05da | 245 | void remove_interrupt(void); |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 246 | }; |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 247 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 248 | } // namespace mbed |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 249 | |
rolf.meyer@arm.com | 11:1c1ebd0324fa | 250 | #endif // MBED_CAN_H |
emilmont | 27:7110ebee3484 | 251 | |
emilmont | 27:7110ebee3484 | 252 | #endif |