Nico Bollen / LIN

Dependents:   MBED_LIN_RGB_Master_Example

Committer:
bollenn
Date:
Thu Jun 25 06:33:06 2015 +0000
Revision:
6:0827e5003e17
Parent:
5:b42737f5dabc
Child:
7:53b2cded83f3
cleanup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bollenn 1:58b5d1e8fae3 1 /*
bollenn 1:58b5d1e8fae3 2 * A master device LIN communication library for mbed
bollenn 0:c91a9ebab739 3 *
bollenn 4:41b153e9a39c 4 * Copyright (C) 2015 Bollen Nico
bollenn 0:c91a9ebab739 5 *
bollenn 0:c91a9ebab739 6 * Released under GPL v2
bollenn 0:c91a9ebab739 7 *
bollenn 0:c91a9ebab739 8 * Other licensing models might apply at the sole discretion of the copyright holders.
bollenn 0:c91a9ebab739 9 *
bollenn 0:c91a9ebab739 10 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
bollenn 0:c91a9ebab739 11 * and associated documentation files (the "Software"), to deal in the Software without restriction,
bollenn 0:c91a9ebab739 12 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
bollenn 0:c91a9ebab739 13 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
bollenn 0:c91a9ebab739 14 * furnished to do so, subject to the following conditions:
bollenn 0:c91a9ebab739 15 *
bollenn 0:c91a9ebab739 16 * The above copyright notice and this permission notice shall be included in all copies or
bollenn 0:c91a9ebab739 17 * substantial portions of the Software.
bollenn 0:c91a9ebab739 18 *
bollenn 0:c91a9ebab739 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
bollenn 0:c91a9ebab739 20 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
bollenn 0:c91a9ebab739 21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
bollenn 0:c91a9ebab739 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
bollenn 0:c91a9ebab739 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
bollenn 0:c91a9ebab739 24 */
bollenn 0:c91a9ebab739 25
bollenn 0:c91a9ebab739 26 #include "mbed.h"
bollenn 0:c91a9ebab739 27
bollenn 1:58b5d1e8fae3 28 #ifndef MBED_LIN_MASTER_H
bollenn 1:58b5d1e8fae3 29 #define MBED_LIN_MASTER_H
bollenn 1:58b5d1e8fae3 30
bollenn 1:58b5d1e8fae3 31 /** A master device LIN communication library for mbed
bollenn 1:58b5d1e8fae3 32 *
bollenn 1:58b5d1e8fae3 33 * @code
bollenn 1:58b5d1e8fae3 34 * #include "mbed.h"
bollenn 1:58b5d1e8fae3 35 * #include "LinMaster.h"
bollenn 1:58b5d1e8fae3 36 *
bollenn 4:41b153e9a39c 37 * LinMaster lin(p10, p9);
bollenn 1:58b5d1e8fae3 38 *
bollenn 1:58b5d1e8fae3 39 * int main() {
bollenn 1:58b5d1e8fae3 40 * (void)lin.init();
bollenn 4:41b153e9a39c 41 * (void)MyLinMaster.tx_frame(&M2Sframe);
bollenn 4:41b153e9a39c 42 * while(MyLinMaster.status() != LinMaster::IDLE);
bollenn 4:41b153e9a39c 43 * void)MyLinMaster.rx_frame(&S2Mframe);
bollenn 1:58b5d1e8fae3 44 * }
bollenn 1:58b5d1e8fae3 45 * @endcode
bollenn 1:58b5d1e8fae3 46 */
bollenn 0:c91a9ebab739 47 class LinMaster
bollenn 0:c91a9ebab739 48 {
bollenn 0:c91a9ebab739 49 public:
bollenn 0:c91a9ebab739 50 /** LIN master constructor
bollenn 0:c91a9ebab739 51 *
bollenn 0:c91a9ebab739 52 * @param Pin The pinname to be used for LIN communication
bollenn 0:c91a9ebab739 53 */
bollenn 3:3656b0de0e43 54 LinMaster(PinName InPin, PinName OutPin);
bollenn 0:c91a9ebab739 55
bollenn 0:c91a9ebab739 56 /** LIN master destructor */
bollenn 0:c91a9ebab739 57 ~LinMaster();
bollenn 0:c91a9ebab739 58
bollenn 0:c91a9ebab739 59 /** Initialise the LIN module
bollenn 0:c91a9ebab739 60 * - configure IO
bollenn 0:c91a9ebab739 61 * - configure Timer
bollenn 0:c91a9ebab739 62 *
bollenn 0:c91a9ebab739 63 * @return
bollenn 0:c91a9ebab739 64 * true on succes,
bollenn 0:c91a9ebab739 65 * false on fail
bollenn 0:c91a9ebab739 66 */
bollenn 3:3656b0de0e43 67 bool init(void);
bollenn 0:c91a9ebab739 68
bollenn 0:c91a9ebab739 69 /** Set the LIN baudrate
bollenn 0:c91a9ebab739 70 *
bollenn 0:c91a9ebab739 71 * @param uBaud baudrate value in kbps (1..20000)
bollenn 0:c91a9ebab739 72 * @return
bollenn 0:c91a9ebab739 73 * true on succes,
bollenn 0:c91a9ebab739 74 * false on fail
bollenn 0:c91a9ebab739 75 */
bollenn 3:3656b0de0e43 76 bool baudrate(uint16_t uBaud);
bollenn 0:c91a9ebab739 77
bollenn 0:c91a9ebab739 78 /** Get the LIN baudrate
bollenn 0:c91a9ebab739 79 *
bollenn 0:c91a9ebab739 80 * @return
bollenn 0:c91a9ebab739 81 * The current configured LIN baudrate
bollenn 0:c91a9ebab739 82 */
bollenn 3:3656b0de0e43 83 uint16_t baudrate(void);
bollenn 0:c91a9ebab739 84
bollenn 2:6d4c7f841a5d 85 /** Bus status */
bollenn 3:3656b0de0e43 86 enum DriverStatus_t {
bollenn 3:3656b0de0e43 87 INIT, /**< initializing */
bollenn 3:3656b0de0e43 88 IDLE, /**< idle */
bollenn 3:3656b0de0e43 89 RXWAKEUP, /**< wake up pulses detected since the last request */
bollenn 3:3656b0de0e43 90 DOMINANT, /**< dominant level detected, longer than a wake up pulse */
bollenn 3:3656b0de0e43 91 TRANSMIT, /**< busy receiving data */
bollenn 3:3656b0de0e43 92 RECEIVE, /**< busy receiving data */
bollenn 3:3656b0de0e43 93 TXWAKEUP /**< busy sending a wake up pulse */
bollenn 2:6d4c7f841a5d 94 };
bollenn 2:6d4c7f841a5d 95
bollenn 2:6d4c7f841a5d 96 /** Get the current LIN driver status
bollenn 2:6d4c7f841a5d 97 *
bollenn 2:6d4c7f841a5d 98 * @return
bollenn 2:6d4c7f841a5d 99 * The current LIN driver status
bollenn 2:6d4c7f841a5d 100 */
bollenn 3:3656b0de0e43 101 DriverStatus_t status(void) {return ( DriverState );};
bollenn 3:3656b0de0e43 102
bollenn 3:3656b0de0e43 103 /** Frame Direction Type */
bollenn 3:3656b0de0e43 104 enum FrameType_t {
bollenn 3:3656b0de0e43 105 S2M,
bollenn 3:3656b0de0e43 106 M2S
bollenn 3:3656b0de0e43 107 };
bollenn 3:3656b0de0e43 108
bollenn 3:3656b0de0e43 109 /** CRC Type */
bollenn 3:3656b0de0e43 110 enum CrcType_t {
bollenn 3:3656b0de0e43 111 Classic,
bollenn 3:3656b0de0e43 112 Enhanced
bollenn 2:6d4c7f841a5d 113 };
bollenn 2:6d4c7f841a5d 114
bollenn 3:3656b0de0e43 115 /** Brake Type */
bollenn 3:3656b0de0e43 116 enum BrakeType_t {
bollenn 3:3656b0de0e43 117 Normal,
bollenn 3:3656b0de0e43 118 AutoConfig
bollenn 3:3656b0de0e43 119 };
bollenn 2:6d4c7f841a5d 120
bollenn 3:3656b0de0e43 121 /** Frame */
bollenn 3:3656b0de0e43 122 struct Frame_t {
bollenn 3:3656b0de0e43 123 FrameType_t FrameType;
bollenn 3:3656b0de0e43 124 CrcType_t CrcType;
bollenn 3:3656b0de0e43 125 BrakeType_t Brake;
bollenn 3:3656b0de0e43 126 uint8_t DataLen;
bollenn 3:3656b0de0e43 127 uint8_t FrameID;
bollenn 3:3656b0de0e43 128 uint8_t Data[8];
bollenn 1:58b5d1e8fae3 129 };
bollenn 0:c91a9ebab739 130
bollenn 1:58b5d1e8fae3 131 /** Send a frame on the LIN bus
bollenn 1:58b5d1e8fae3 132 *
bollenn 3:3656b0de0e43 133 * @param ptrFrame pointer to the frame to transmit
bollenn 3:3656b0de0e43 134 * @return
bollenn 3:3656b0de0e43 135 * true on succes,
bollenn 3:3656b0de0e43 136 * false on fail
bollenn 3:3656b0de0e43 137 */
bollenn 4:41b153e9a39c 138 bool send_frame(Frame_t * ptrFrame);
bollenn 3:3656b0de0e43 139
bollenn 3:3656b0de0e43 140 /** Receive a frame on the LIN bus
bollenn 3:3656b0de0e43 141 *
bollenn 3:3656b0de0e43 142 * @param ptrFrame pointer to the frame to receive
bollenn 1:58b5d1e8fae3 143 * @return
bollenn 1:58b5d1e8fae3 144 * true on succes,
bollenn 1:58b5d1e8fae3 145 * false on fail
bollenn 1:58b5d1e8fae3 146 */
bollenn 5:b42737f5dabc 147 bool get_rx_data(Frame_t & ptrFrame);
bollenn 2:6d4c7f841a5d 148
bollenn 2:6d4c7f841a5d 149 void TickEventHndl(void);
bollenn 2:6d4c7f841a5d 150
bollenn 3:3656b0de0e43 151 void PinEventHndl(void);
bollenn 6:0827e5003e17 152
bollenn 0:c91a9ebab739 153 private:
bollenn 3:3656b0de0e43 154 enum FrameError_t {
bollenn 3:3656b0de0e43 155 NoError, /* No error */
bollenn 3:3656b0de0e43 156 NoSlaveResp, /* No slave response, LIN message has timed out */
bollenn 3:3656b0de0e43 157 FramingErr, /* Framing error */
bollenn 3:3656b0de0e43 158 CollisionErr, /* Collision error */
bollenn 3:3656b0de0e43 159 BusVoltage /* Bus voltage to low */
bollenn 3:3656b0de0e43 160 };
bollenn 3:3656b0de0e43 161
bollenn 3:3656b0de0e43 162 enum FrameStatus_t {
bollenn 3:3656b0de0e43 163 FStart,
bollenn 3:3656b0de0e43 164 Break_OK,
bollenn 3:3656b0de0e43 165 Sync_OK,
bollenn 3:3656b0de0e43 166 ID_OK,
bollenn 3:3656b0de0e43 167 Data0,
bollenn 3:3656b0de0e43 168 Data1,
bollenn 3:3656b0de0e43 169 Data2,
bollenn 3:3656b0de0e43 170 Data3,
bollenn 3:3656b0de0e43 171 Data4,
bollenn 3:3656b0de0e43 172 Data5,
bollenn 3:3656b0de0e43 173 Data6,
bollenn 3:3656b0de0e43 174 Data7,
bollenn 3:3656b0de0e43 175 CRC
bollenn 3:3656b0de0e43 176 };
bollenn 3:3656b0de0e43 177
bollenn 3:3656b0de0e43 178 enum ByteStatus_t {
bollenn 3:3656b0de0e43 179 BStart,
bollenn 3:3656b0de0e43 180 StartbitEdge, /* Begin of startbit received */
bollenn 3:3656b0de0e43 181 StartbitSample, /* Startbit sample */
bollenn 3:3656b0de0e43 182 Databit0Edge, /* Databit edge */
bollenn 3:3656b0de0e43 183 Databit0Sample, /* Databit sample */
bollenn 3:3656b0de0e43 184 Databit1Edge, /* Databit edge */
bollenn 3:3656b0de0e43 185 Databit1Sample, /* Databit sample */
bollenn 3:3656b0de0e43 186 Databit2Edge, /* Databit edge */
bollenn 3:3656b0de0e43 187 Databit2Sample, /* Databit sample */
bollenn 3:3656b0de0e43 188 Databit3Edge, /* Databit edge */
bollenn 3:3656b0de0e43 189 Databit3Sample, /* Databit sample */
bollenn 3:3656b0de0e43 190 Databit4Edge, /* Databit edge */
bollenn 3:3656b0de0e43 191 Databit4Sample, /* Databit sample */
bollenn 3:3656b0de0e43 192 Databit5Edge, /* Databit edge */
bollenn 3:3656b0de0e43 193 Databit5Sample, /* Databit sample */
bollenn 3:3656b0de0e43 194 Databit6Edge, /* Databit edge */
bollenn 3:3656b0de0e43 195 Databit6Sample, /* Databit sample */
bollenn 3:3656b0de0e43 196 Databit7Edge, /* Databit edge */
bollenn 3:3656b0de0e43 197 Databit7Sample, /* Databit sample */
bollenn 3:3656b0de0e43 198 StopbitEdge, /* Stopbit edge */
bollenn 3:3656b0de0e43 199 StopbitSample, /* Stopbit sample */
bollenn 3:3656b0de0e43 200 BDone
bollenn 3:3656b0de0e43 201 };
bollenn 3:3656b0de0e43 202
bollenn 3:3656b0de0e43 203 volatile DriverStatus_t DriverState;
bollenn 3:3656b0de0e43 204 volatile FrameError_t LastError;
bollenn 3:3656b0de0e43 205 volatile FrameStatus_t FrameStatus;
bollenn 3:3656b0de0e43 206 volatile ByteStatus_t ByteStatus;
bollenn 3:3656b0de0e43 207 volatile FrameType_t linMessageType;
bollenn 3:3656b0de0e43 208
bollenn 3:3656b0de0e43 209 uint8_t breakLength;
bollenn 3:3656b0de0e43 210 uint8_t FrameLength;
bollenn 3:3656b0de0e43 211
bollenn 3:3656b0de0e43 212 uint8_t TXbuf[11];
bollenn 3:3656b0de0e43 213 uint8_t TXbufIndex;
bollenn 6:0827e5003e17 214 uint8_t RXbuf[11];
bollenn 3:3656b0de0e43 215 uint8_t RXbufIndex;
bollenn 3:3656b0de0e43 216 uint8_t RXtimeout;
bollenn 3:3656b0de0e43 217 uint16_t RXtimeoutSubCTR;
bollenn 3:3656b0de0e43 218 uint16_t u16HalfBitPeriod;
bollenn 3:3656b0de0e43 219
bollenn 4:41b153e9a39c 220 DigitalOut LinOutPin;
bollenn 4:41b153e9a39c 221 DigitalIn LinInPin;
bollenn 4:41b153e9a39c 222 InterruptIn LinIntPin;
bollenn 3:3656b0de0e43 223 Ticker MyTicker;
bollenn 3:3656b0de0e43 224 Timer MyTimer;
bollenn 3:3656b0de0e43 225
bollenn 3:3656b0de0e43 226 uint8_t parity(uint8_t u8BYTE);
bollenn 3:3656b0de0e43 227
bollenn 0:c91a9ebab739 228 };
bollenn 1:58b5d1e8fae3 229
bollenn 1:58b5d1e8fae3 230 #endif /* MBED_LIN_MASTER_H */