RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2006-2013 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 5 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 6 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 7 *
kevman 0:38ceb79fef03 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 9 *
kevman 0:38ceb79fef03 10 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 13 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 14 * limitations under the License.
kevman 0:38ceb79fef03 15 */
kevman 0:38ceb79fef03 16 #ifndef MBED_CAN_H
kevman 0:38ceb79fef03 17 #define MBED_CAN_H
kevman 0:38ceb79fef03 18
kevman 0:38ceb79fef03 19 #include "platform/platform.h"
kevman 0:38ceb79fef03 20
kevman 0:38ceb79fef03 21 #if defined (DEVICE_CAN) || defined(DOXYGEN_ONLY)
kevman 0:38ceb79fef03 22
kevman 0:38ceb79fef03 23 #include "hal/can_api.h"
kevman 0:38ceb79fef03 24 #include "platform/Callback.h"
kevman 0:38ceb79fef03 25 #include "platform/PlatformMutex.h"
kevman 0:38ceb79fef03 26 #include "platform/NonCopyable.h"
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28 namespace mbed {
kevman 0:38ceb79fef03 29 /** \addtogroup drivers */
kevman 0:38ceb79fef03 30
kevman 0:38ceb79fef03 31 /** CANMessage class
kevman 0:38ceb79fef03 32 *
kevman 0:38ceb79fef03 33 * @note Synchronization level: Thread safe
kevman 0:38ceb79fef03 34 * @ingroup drivers
kevman 0:38ceb79fef03 35 */
kevman 0:38ceb79fef03 36 class CANMessage : public CAN_Message {
kevman 0:38ceb79fef03 37
kevman 0:38ceb79fef03 38 public:
kevman 0:38ceb79fef03 39 /** Creates empty CAN message.
kevman 0:38ceb79fef03 40 */
kevman 0:38ceb79fef03 41 CANMessage() : CAN_Message()
kevman 0:38ceb79fef03 42 {
kevman 0:38ceb79fef03 43 len = 8;
kevman 0:38ceb79fef03 44 type = CANData;
kevman 0:38ceb79fef03 45 format = CANStandard;
kevman 0:38ceb79fef03 46 id = 0;
kevman 0:38ceb79fef03 47 memset(data, 0, 8);
kevman 0:38ceb79fef03 48 }
kevman 0:38ceb79fef03 49
kevman 0:38ceb79fef03 50 /** Creates CAN message with specific content.
kevman 0:38ceb79fef03 51 *
kevman 0:38ceb79fef03 52 * @param _id Message ID
kevman 0:38ceb79fef03 53 * @param _data Mesaage Data
kevman 0:38ceb79fef03 54 * @param _len Message Data length
kevman 0:38ceb79fef03 55 * @param _type Type of Data: Use enum CANType for valid parameter values
kevman 0:38ceb79fef03 56 * @param _format Data Format: Use enum CANFormat for valid parameter values
kevman 0:38ceb79fef03 57 */
kevman 0:38ceb79fef03 58 CANMessage(unsigned _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard)
kevman 0:38ceb79fef03 59 {
kevman 0:38ceb79fef03 60 len = _len & 0xF;
kevman 0:38ceb79fef03 61 type = _type;
kevman 0:38ceb79fef03 62 format = _format;
kevman 0:38ceb79fef03 63 id = _id;
kevman 0:38ceb79fef03 64 memcpy(data, _data, _len);
kevman 0:38ceb79fef03 65 }
kevman 0:38ceb79fef03 66
kevman 0:38ceb79fef03 67 /** Creates CAN remote message.
kevman 0:38ceb79fef03 68 *
kevman 0:38ceb79fef03 69 * @param _id Message ID
kevman 0:38ceb79fef03 70 * @param _format Data Format: Use enum CANType for valid parameter values
kevman 0:38ceb79fef03 71 */
kevman 0:38ceb79fef03 72 CANMessage(unsigned _id, CANFormat _format = CANStandard)
kevman 0:38ceb79fef03 73 {
kevman 0:38ceb79fef03 74 len = 0;
kevman 0:38ceb79fef03 75 type = CANRemote;
kevman 0:38ceb79fef03 76 format = _format;
kevman 0:38ceb79fef03 77 id = _id;
kevman 0:38ceb79fef03 78 memset(data, 0, 8);
kevman 0:38ceb79fef03 79 }
kevman 0:38ceb79fef03 80 };
kevman 0:38ceb79fef03 81
kevman 0:38ceb79fef03 82 /** A can bus client, used for communicating with can devices
kevman 0:38ceb79fef03 83 * @ingroup drivers
kevman 0:38ceb79fef03 84 */
kevman 0:38ceb79fef03 85 class CAN : private NonCopyable<CAN> {
kevman 0:38ceb79fef03 86
kevman 0:38ceb79fef03 87 public:
kevman 0:38ceb79fef03 88 /** Creates a CAN interface connected to specific pins.
kevman 0:38ceb79fef03 89 *
kevman 0:38ceb79fef03 90 * @param rd read from transmitter
kevman 0:38ceb79fef03 91 * @param td transmit to transmitter
kevman 0:38ceb79fef03 92 *
kevman 0:38ceb79fef03 93 * Example:
kevman 0:38ceb79fef03 94 * @code
kevman 0:38ceb79fef03 95 * #include "mbed.h"
kevman 0:38ceb79fef03 96 *
kevman 0:38ceb79fef03 97 *
kevman 0:38ceb79fef03 98 * Ticker ticker;
kevman 0:38ceb79fef03 99 * DigitalOut led1(LED1);
kevman 0:38ceb79fef03 100 * DigitalOut led2(LED2);
kevman 0:38ceb79fef03 101 * //The constructor takes in RX, and TX pin respectively.
kevman 0:38ceb79fef03 102 * //These pins, for this example, are defined in mbed_app.json
kevman 0:38ceb79fef03 103 * CAN can1(MBED_CONF_APP_CAN1_RD, MBED_CONF_APP_CAN1_TD);
kevman 0:38ceb79fef03 104 * CAN can2(MBED_CONF_APP_CAN2_RD, MBED_CONF_APP_CAN2_TD);
kevman 0:38ceb79fef03 105 *
kevman 0:38ceb79fef03 106 * char counter = 0;
kevman 0:38ceb79fef03 107 *
kevman 0:38ceb79fef03 108 * void send() {
kevman 0:38ceb79fef03 109 * if(can1.write(CANMessage(1337, &counter, 1))) {
kevman 0:38ceb79fef03 110 * printf("Message sent: %d\n", counter);
kevman 0:38ceb79fef03 111 * counter++;
kevman 0:38ceb79fef03 112 * }
kevman 0:38ceb79fef03 113 * led1 = !led1;
kevman 0:38ceb79fef03 114 * }
kevman 0:38ceb79fef03 115 *
kevman 0:38ceb79fef03 116 * int main() {
kevman 0:38ceb79fef03 117 * ticker.attach(&send, 1);
kevman 0:38ceb79fef03 118 * CANMessage msg;
kevman 0:38ceb79fef03 119 * while(1) {
kevman 0:38ceb79fef03 120 * if(can2.read(msg)) {
kevman 0:38ceb79fef03 121 * printf("Message received: %d\n\n", msg.data[0]);
kevman 0:38ceb79fef03 122 * led2 = !led2;
kevman 0:38ceb79fef03 123 * }
kevman 0:38ceb79fef03 124 * wait(0.2);
kevman 0:38ceb79fef03 125 * }
kevman 0:38ceb79fef03 126 * }
kevman 0:38ceb79fef03 127 *
kevman 0:38ceb79fef03 128 * @endcode
kevman 0:38ceb79fef03 129 */
kevman 0:38ceb79fef03 130 CAN(PinName rd, PinName td);
kevman 0:38ceb79fef03 131
kevman 0:38ceb79fef03 132 /** Initialize CAN interface and set the frequency
kevman 0:38ceb79fef03 133 *
kevman 0:38ceb79fef03 134 * @param rd the read pin
kevman 0:38ceb79fef03 135 * @param td the transmit pin
kevman 0:38ceb79fef03 136 * @param hz the bus frequency in hertz
kevman 0:38ceb79fef03 137 */
kevman 0:38ceb79fef03 138 CAN(PinName rd, PinName td, int hz);
kevman 0:38ceb79fef03 139
kevman 0:38ceb79fef03 140 virtual ~CAN();
kevman 0:38ceb79fef03 141
kevman 0:38ceb79fef03 142 /** Set the frequency of the CAN interface
kevman 0:38ceb79fef03 143 *
kevman 0:38ceb79fef03 144 * @param hz The bus frequency in hertz
kevman 0:38ceb79fef03 145 *
kevman 0:38ceb79fef03 146 * @returns
kevman 0:38ceb79fef03 147 * 1 if successful,
kevman 0:38ceb79fef03 148 * 0 otherwise
kevman 0:38ceb79fef03 149 */
kevman 0:38ceb79fef03 150 int frequency(int hz);
kevman 0:38ceb79fef03 151
kevman 0:38ceb79fef03 152 /** Write a CANMessage to the bus.
kevman 0:38ceb79fef03 153 *
kevman 0:38ceb79fef03 154 * @param msg The CANMessage to write.
kevman 0:38ceb79fef03 155 *
kevman 0:38ceb79fef03 156 * @returns
kevman 0:38ceb79fef03 157 * 0 if write failed,
kevman 0:38ceb79fef03 158 * 1 if write was successful
kevman 0:38ceb79fef03 159 */
kevman 0:38ceb79fef03 160 int write(CANMessage msg);
kevman 0:38ceb79fef03 161
kevman 0:38ceb79fef03 162 /** Read a CANMessage from the bus.
kevman 0:38ceb79fef03 163 *
kevman 0:38ceb79fef03 164 * @param msg A CANMessage to read to.
kevman 0:38ceb79fef03 165 * @param handle message filter handle (0 for any message)
kevman 0:38ceb79fef03 166 *
kevman 0:38ceb79fef03 167 * @returns
kevman 0:38ceb79fef03 168 * 0 if no message arrived,
kevman 0:38ceb79fef03 169 * 1 if message arrived
kevman 0:38ceb79fef03 170 */
kevman 0:38ceb79fef03 171 int read(CANMessage &msg, int handle = 0);
kevman 0:38ceb79fef03 172
kevman 0:38ceb79fef03 173 /** Reset CAN interface.
kevman 0:38ceb79fef03 174 *
kevman 0:38ceb79fef03 175 * To use after error overflow.
kevman 0:38ceb79fef03 176 */
kevman 0:38ceb79fef03 177 void reset();
kevman 0:38ceb79fef03 178
kevman 0:38ceb79fef03 179 /** Puts or removes the CAN interface into silent monitoring mode
kevman 0:38ceb79fef03 180 *
kevman 0:38ceb79fef03 181 * @param silent boolean indicating whether to go into silent mode or not
kevman 0:38ceb79fef03 182 */
kevman 0:38ceb79fef03 183 void monitor(bool silent);
kevman 0:38ceb79fef03 184
kevman 0:38ceb79fef03 185 enum Mode {
kevman 0:38ceb79fef03 186 Reset = 0,
kevman 0:38ceb79fef03 187 Normal,
kevman 0:38ceb79fef03 188 Silent,
kevman 0:38ceb79fef03 189 LocalTest,
kevman 0:38ceb79fef03 190 GlobalTest,
kevman 0:38ceb79fef03 191 SilentTest
kevman 0:38ceb79fef03 192 };
kevman 0:38ceb79fef03 193
kevman 0:38ceb79fef03 194 /** Change CAN operation to the specified mode
kevman 0:38ceb79fef03 195 *
kevman 0:38ceb79fef03 196 * @param mode The new operation mode (CAN::Normal, CAN::Silent, CAN::LocalTest, CAN::GlobalTest, CAN::SilentTest)
kevman 0:38ceb79fef03 197 *
kevman 0:38ceb79fef03 198 * @returns
kevman 0:38ceb79fef03 199 * 0 if mode change failed or unsupported,
kevman 0:38ceb79fef03 200 * 1 if mode change was successful
kevman 0:38ceb79fef03 201 */
kevman 0:38ceb79fef03 202 int mode(Mode mode);
kevman 0:38ceb79fef03 203
kevman 0:38ceb79fef03 204 /** Filter out incoming messages
kevman 0:38ceb79fef03 205 *
kevman 0:38ceb79fef03 206 * @param id the id to filter on
kevman 0:38ceb79fef03 207 * @param mask the mask applied to the id
kevman 0:38ceb79fef03 208 * @param format format to filter on (Default CANAny)
kevman 0:38ceb79fef03 209 * @param handle message filter handle (Optional)
kevman 0:38ceb79fef03 210 *
kevman 0:38ceb79fef03 211 * @returns
kevman 0:38ceb79fef03 212 * 0 if filter change failed or unsupported,
kevman 0:38ceb79fef03 213 * new filter handle if successful
kevman 0:38ceb79fef03 214 */
kevman 0:38ceb79fef03 215 int filter(unsigned int id, unsigned int mask, CANFormat format = CANAny, int handle = 0);
kevman 0:38ceb79fef03 216
kevman 0:38ceb79fef03 217 /** Detects read errors - Used to detect read overflow errors.
kevman 0:38ceb79fef03 218 *
kevman 0:38ceb79fef03 219 * @returns number of read errors
kevman 0:38ceb79fef03 220 */
kevman 0:38ceb79fef03 221 unsigned char rderror();
kevman 0:38ceb79fef03 222
kevman 0:38ceb79fef03 223 /** Detects write errors - Used to detect write overflow errors.
kevman 0:38ceb79fef03 224 *
kevman 0:38ceb79fef03 225 * @returns number of write errors
kevman 0:38ceb79fef03 226 */
kevman 0:38ceb79fef03 227 unsigned char tderror();
kevman 0:38ceb79fef03 228
kevman 0:38ceb79fef03 229 enum IrqType {
kevman 0:38ceb79fef03 230 RxIrq = 0,
kevman 0:38ceb79fef03 231 TxIrq,
kevman 0:38ceb79fef03 232 EwIrq,
kevman 0:38ceb79fef03 233 DoIrq,
kevman 0:38ceb79fef03 234 WuIrq,
kevman 0:38ceb79fef03 235 EpIrq,
kevman 0:38ceb79fef03 236 AlIrq,
kevman 0:38ceb79fef03 237 BeIrq,
kevman 0:38ceb79fef03 238 IdIrq,
kevman 0:38ceb79fef03 239
kevman 0:38ceb79fef03 240 IrqCnt
kevman 0:38ceb79fef03 241 };
kevman 0:38ceb79fef03 242
kevman 0:38ceb79fef03 243 /** Attach a function to call whenever a CAN frame received interrupt is
kevman 0:38ceb79fef03 244 * generated.
kevman 0:38ceb79fef03 245 *
kevman 0:38ceb79fef03 246 * This function locks the deep sleep while a callback is attached
kevman 0:38ceb79fef03 247 *
kevman 0:38ceb79fef03 248 * @param func A pointer to a void function, or 0 to set as none
kevman 0:38ceb79fef03 249 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, CAN::TxIrq for transmitted or aborted, CAN::EwIrq for error warning, CAN::DoIrq for data overrun, CAN::WuIrq for wake-up, CAN::EpIrq for error passive, CAN::AlIrq for arbitration lost, CAN::BeIrq for bus error)
kevman 0:38ceb79fef03 250 */
kevman 0:38ceb79fef03 251 void attach(Callback<void()> func, IrqType type = RxIrq);
kevman 0:38ceb79fef03 252
kevman 0:38ceb79fef03 253 /** Attach a member function to call whenever a CAN frame received interrupt
kevman 0:38ceb79fef03 254 * is generated.
kevman 0:38ceb79fef03 255 *
kevman 0:38ceb79fef03 256 * @param obj pointer to the object to call the member function on
kevman 0:38ceb79fef03 257 * @param method pointer to the member function to be called
kevman 0:38ceb79fef03 258 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
kevman 0:38ceb79fef03 259 * @deprecated
kevman 0:38ceb79fef03 260 * The attach function does not support cv-qualifiers. Replaced by
kevman 0:38ceb79fef03 261 * attach(callback(obj, method), type).
kevman 0:38ceb79fef03 262 */
kevman 0:38ceb79fef03 263 template<typename T>
kevman 0:38ceb79fef03 264 MBED_DEPRECATED_SINCE("mbed-os-5.1",
kevman 0:38ceb79fef03 265 "The attach function does not support cv-qualifiers. Replaced by "
kevman 0:38ceb79fef03 266 "attach(callback(obj, method), type).")
kevman 0:38ceb79fef03 267 void attach(T *obj, void (T::*method)(), IrqType type = RxIrq)
kevman 0:38ceb79fef03 268 {
kevman 0:38ceb79fef03 269 // Underlying call thread safe
kevman 0:38ceb79fef03 270 attach(callback(obj, method), type);
kevman 0:38ceb79fef03 271 }
kevman 0:38ceb79fef03 272
kevman 0:38ceb79fef03 273 /** Attach a member function to call whenever a CAN frame received interrupt
kevman 0:38ceb79fef03 274 * is generated.
kevman 0:38ceb79fef03 275 *
kevman 0:38ceb79fef03 276 * @param obj pointer to the object to call the member function on
kevman 0:38ceb79fef03 277 * @param method pointer to the member function to be called
kevman 0:38ceb79fef03 278 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
kevman 0:38ceb79fef03 279 * @deprecated
kevman 0:38ceb79fef03 280 * The attach function does not support cv-qualifiers. Replaced by
kevman 0:38ceb79fef03 281 * attach(callback(obj, method), type).
kevman 0:38ceb79fef03 282 */
kevman 0:38ceb79fef03 283 template<typename T>
kevman 0:38ceb79fef03 284 MBED_DEPRECATED_SINCE("mbed-os-5.1",
kevman 0:38ceb79fef03 285 "The attach function does not support cv-qualifiers. Replaced by "
kevman 0:38ceb79fef03 286 "attach(callback(obj, method), type).")
kevman 0:38ceb79fef03 287 void attach(T *obj, void (*method)(T *), IrqType type = RxIrq)
kevman 0:38ceb79fef03 288 {
kevman 0:38ceb79fef03 289 // Underlying call thread safe
kevman 0:38ceb79fef03 290 attach(callback(obj, method), type);
kevman 0:38ceb79fef03 291 }
kevman 0:38ceb79fef03 292
kevman 0:38ceb79fef03 293 static void _irq_handler(uint32_t id, CanIrqType type);
kevman 0:38ceb79fef03 294
kevman 0:38ceb79fef03 295 #if !defined(DOXYGEN_ONLY)
kevman 0:38ceb79fef03 296 protected:
kevman 0:38ceb79fef03 297 virtual void lock();
kevman 0:38ceb79fef03 298 virtual void unlock();
kevman 0:38ceb79fef03 299 can_t _can;
kevman 0:38ceb79fef03 300 Callback<void()> _irq[IrqCnt];
kevman 0:38ceb79fef03 301 PlatformMutex _mutex;
kevman 0:38ceb79fef03 302 #endif
kevman 0:38ceb79fef03 303 };
kevman 0:38ceb79fef03 304
kevman 0:38ceb79fef03 305 } // namespace mbed
kevman 0:38ceb79fef03 306
kevman 0:38ceb79fef03 307 #endif
kevman 0:38ceb79fef03 308
kevman 0:38ceb79fef03 309 #endif // MBED_CAN_H
kevman 0:38ceb79fef03 310