mbed libraries for KL25Z

Dependents:   FRDM_RGBLED

Committer:
emilmont
Date:
Fri Nov 09 11:33:53 2012 +0000
Revision:
8:c14af7958ef5
Parent:
0:8024c367e29f
Child:
9:663789d7729f
SPI driver; ADC driver; DAC driver; microlib support; general bugfixing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 0:8024c367e29f 1 /* mbed Microcontroller Library - can
emilmont 0:8024c367e29f 2 * Copyright (c) 2009-2011 ARM Limited. All rights reserved.
emilmont 8:c14af7958ef5 3 */
emilmont 0:8024c367e29f 4 #ifndef MBED_CAN_H
emilmont 0:8024c367e29f 5 #define MBED_CAN_H
emilmont 0:8024c367e29f 6
emilmont 8:c14af7958ef5 7 #include "platform.h"
emilmont 0:8024c367e29f 8
emilmont 0:8024c367e29f 9 #if DEVICE_CAN
emilmont 0:8024c367e29f 10
emilmont 0:8024c367e29f 11 #include "can_helper.h"
emilmont 0:8024c367e29f 12 #include "FunctionPointer.h"
emilmont 0:8024c367e29f 13
emilmont 0:8024c367e29f 14 #include <string.h>
emilmont 0:8024c367e29f 15
emilmont 0:8024c367e29f 16 namespace mbed {
emilmont 0:8024c367e29f 17
emilmont 8:c14af7958ef5 18 /** CANMessage class
emilmont 0:8024c367e29f 19 */
emilmont 0:8024c367e29f 20 class CANMessage : public CAN_Message {
emilmont 0:8024c367e29f 21
emilmont 0:8024c367e29f 22 public:
emilmont 8:c14af7958ef5 23 /** Creates empty CAN message.
emilmont 0:8024c367e29f 24 */
emilmont 0:8024c367e29f 25 CANMessage() {
emilmont 8:c14af7958ef5 26 len = 8;
emilmont 8:c14af7958ef5 27 type = CANData;
emilmont 8:c14af7958ef5 28 format = CANStandard;
emilmont 8:c14af7958ef5 29 id = 0;
emilmont 8:c14af7958ef5 30 memset(data, 0, 8);
emilmont 0:8024c367e29f 31 }
emilmont 0:8024c367e29f 32
emilmont 8:c14af7958ef5 33 /** Creates CAN message with specific content.
emilmont 0:8024c367e29f 34 */
emilmont 0:8024c367e29f 35 CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
emilmont 0:8024c367e29f 36 len = _len & 0xF;
emilmont 0:8024c367e29f 37 type = _type;
emilmont 0:8024c367e29f 38 format = _format;
emilmont 0:8024c367e29f 39 id = _id;
emilmont 0:8024c367e29f 40 memcpy(data, _data, _len);
emilmont 0:8024c367e29f 41 }
emilmont 0:8024c367e29f 42
emilmont 8:c14af7958ef5 43 /** Creates CAN remote message.
emilmont 0:8024c367e29f 44 */
emilmont 0:8024c367e29f 45 CANMessage(int _id, CANFormat _format = CANStandard) {
emilmont 0:8024c367e29f 46 len = 0;
emilmont 0:8024c367e29f 47 type = CANRemote;
emilmont 0:8024c367e29f 48 format = _format;
emilmont 0:8024c367e29f 49 id = _id;
emilmont 0:8024c367e29f 50 memset(data, 0, 8);
emilmont 0:8024c367e29f 51 }
emilmont 0:8024c367e29f 52 };
emilmont 0:8024c367e29f 53
emilmont 8:c14af7958ef5 54 /** A can bus client, used for communicating with can devices
emilmont 0:8024c367e29f 55 */
emilmont 8:c14af7958ef5 56 class CAN {
emilmont 0:8024c367e29f 57
emilmont 0:8024c367e29f 58 public:
emilmont 8:c14af7958ef5 59 /** Creates an CAN interface connected to specific pins.
emilmont 8:c14af7958ef5 60 *
emilmont 8:c14af7958ef5 61 * @param rd read from transmitter
emilmont 8:c14af7958ef5 62 * @param td transmit to transmitter
emilmont 0:8024c367e29f 63 *
emilmont 0:8024c367e29f 64 * Example:
emilmont 8:c14af7958ef5 65 * @code
emilmont 8:c14af7958ef5 66 * #include "mbed.h"
emilmont 8:c14af7958ef5 67 *
emilmont 8:c14af7958ef5 68 * Ticker ticker;
emilmont 8:c14af7958ef5 69 * DigitalOut led1(LED1);
emilmont 8:c14af7958ef5 70 * DigitalOut led2(LED2);
emilmont 8:c14af7958ef5 71 * CAN can1(p9, p10);
emilmont 8:c14af7958ef5 72 * CAN can2(p30, p29);
emilmont 8:c14af7958ef5 73 *
emilmont 8:c14af7958ef5 74 * char counter = 0;
emilmont 8:c14af7958ef5 75 *
emilmont 8:c14af7958ef5 76 * void send() {
emilmont 8:c14af7958ef5 77 * if(can1.write(CANMessage(1337, &counter, 1))) {
emilmont 8:c14af7958ef5 78 * printf("Message sent: %d\n", counter);
emilmont 8:c14af7958ef5 79 * counter++;
emilmont 8:c14af7958ef5 80 * }
emilmont 8:c14af7958ef5 81 * led1 = !led1;
emilmont 8:c14af7958ef5 82 * }
emilmont 8:c14af7958ef5 83 *
emilmont 8:c14af7958ef5 84 * int main() {
emilmont 8:c14af7958ef5 85 * ticker.attach(&send, 1);
emilmont 8:c14af7958ef5 86 * CANMessage msg;
emilmont 8:c14af7958ef5 87 * while(1) {
emilmont 8:c14af7958ef5 88 * if(can2.read(msg)) {
emilmont 8:c14af7958ef5 89 * printf("Message received: %d\n\n", msg.data[0]);
emilmont 8:c14af7958ef5 90 * led2 = !led2;
emilmont 8:c14af7958ef5 91 * }
emilmont 8:c14af7958ef5 92 * wait(0.2);
emilmont 8:c14af7958ef5 93 * }
emilmont 8:c14af7958ef5 94 * }
emilmont 8:c14af7958ef5 95 * @endcode
emilmont 0:8024c367e29f 96 */
emilmont 0:8024c367e29f 97 CAN(PinName rd, PinName td);
emilmont 0:8024c367e29f 98 virtual ~CAN();
emilmont 0:8024c367e29f 99
emilmont 8:c14af7958ef5 100 /** Set the frequency of the CAN interface
emilmont 8:c14af7958ef5 101 *
emilmont 8:c14af7958ef5 102 * @param hz The bus frequency in hertz
emilmont 0:8024c367e29f 103 *
emilmont 8:c14af7958ef5 104 * @returns
emilmont 8:c14af7958ef5 105 * 1 if successful,
emilmont 8:c14af7958ef5 106 * 0 otherwise
emilmont 0:8024c367e29f 107 */
emilmont 0:8024c367e29f 108 int frequency(int hz);
emilmont 0:8024c367e29f 109
emilmont 8:c14af7958ef5 110 /** Write a CANMessage to the bus.
emilmont 8:c14af7958ef5 111 *
emilmont 8:c14af7958ef5 112 * @param msg The CANMessage to write.
emilmont 0:8024c367e29f 113 *
emilmont 8:c14af7958ef5 114 * @returns
emilmont 8:c14af7958ef5 115 * 0 if write failed,
emilmont 8:c14af7958ef5 116 * 1 if write was successful
emilmont 0:8024c367e29f 117 */
emilmont 0:8024c367e29f 118 int write(CANMessage msg);
emilmont 0:8024c367e29f 119
emilmont 8:c14af7958ef5 120 /** Read a CANMessage from the bus.
emilmont 0:8024c367e29f 121 *
emilmont 8:c14af7958ef5 122 * @param msg A CANMessage to read to.
emilmont 0:8024c367e29f 123 *
emilmont 8:c14af7958ef5 124 * @returns
emilmont 8:c14af7958ef5 125 * 0 if no message arrived,
emilmont 8:c14af7958ef5 126 * 1 if message arrived
emilmont 0:8024c367e29f 127 */
emilmont 0:8024c367e29f 128 int read(CANMessage &msg);
emilmont 0:8024c367e29f 129
emilmont 8:c14af7958ef5 130 /** Reset CAN interface.
emilmont 0:8024c367e29f 131 *
emilmont 0:8024c367e29f 132 * To use after error overflow.
emilmont 0:8024c367e29f 133 */
emilmont 0:8024c367e29f 134 void reset();
emilmont 8:c14af7958ef5 135
emilmont 8:c14af7958ef5 136 /** Puts or removes the CAN interface into silent monitoring mode
emilmont 0:8024c367e29f 137 *
emilmont 8:c14af7958ef5 138 * @param silent boolean indicating whether to go into silent mode or not
emilmont 0:8024c367e29f 139 */
emilmont 0:8024c367e29f 140 void monitor(bool silent);
emilmont 0:8024c367e29f 141
emilmont 8:c14af7958ef5 142 /** Returns number of read errors to detect read overflow errors.
emilmont 0:8024c367e29f 143 */
emilmont 0:8024c367e29f 144 unsigned char rderror();
emilmont 0:8024c367e29f 145
emilmont 8:c14af7958ef5 146 /** Returns number of write errors to detect write overflow errors.
emilmont 0:8024c367e29f 147 */
emilmont 0:8024c367e29f 148 unsigned char tderror();
emilmont 0:8024c367e29f 149
emilmont 8:c14af7958ef5 150 /** Attach a function to call whenever a CAN frame received interrupt is
emilmont 0:8024c367e29f 151 * generated.
emilmont 0:8024c367e29f 152 *
emilmont 8:c14af7958ef5 153 * @param fptr A pointer to a void function, or 0 to set as none
emilmont 0:8024c367e29f 154 */
emilmont 0:8024c367e29f 155 void attach(void (*fptr)(void));
emilmont 0:8024c367e29f 156
emilmont 8:c14af7958ef5 157 /** Attach a member function to call whenever a CAN frame received interrupt
emilmont 0:8024c367e29f 158 * is generated.
emilmont 0:8024c367e29f 159 *
emilmont 8:c14af7958ef5 160 * @param tptr pointer to the object to call the member function on
emilmont 8:c14af7958ef5 161 * @param mptr pointer to the member function to be called
emilmont 0:8024c367e29f 162 */
emilmont 0:8024c367e29f 163 template<typename T>
emilmont 0:8024c367e29f 164 void attach(T* tptr, void (T::*mptr)(void)) {
emilmont 0:8024c367e29f 165 if((mptr != NULL) && (tptr != NULL)) {
emilmont 0:8024c367e29f 166 _rxirq.attach(tptr, mptr);
emilmont 0:8024c367e29f 167 setup_interrupt();
emilmont 0:8024c367e29f 168 } else {
emilmont 0:8024c367e29f 169 remove_interrupt();
emilmont 0:8024c367e29f 170 }
emilmont 0:8024c367e29f 171 }
emilmont 0:8024c367e29f 172
emilmont 0:8024c367e29f 173 private:
emilmont 0:8024c367e29f 174 CANName _id;
emilmont 0:8024c367e29f 175 FunctionPointer _rxirq;
emilmont 8:c14af7958ef5 176
emilmont 0:8024c367e29f 177 void setup_interrupt(void);
emilmont 0:8024c367e29f 178 void remove_interrupt(void);
emilmont 0:8024c367e29f 179 };
emilmont 0:8024c367e29f 180
emilmont 0:8024c367e29f 181 } // namespace mbed
emilmont 0:8024c367e29f 182
emilmont 8:c14af7958ef5 183 #endif
emilmont 0:8024c367e29f 184
emilmont 8:c14af7958ef5 185 #endif // MBED_CAN_H