Nico Bollen / LIN

Dependents:   MBED_LIN_RGB_Master_Example

Committer:
bollenn
Date:
Tue May 26 08:33:46 2015 +0000
Revision:
3:3656b0de0e43
Parent:
2:6d4c7f841a5d
Child:
4:41b153e9a39c
updated to be inline with MLX16 LINmaster FW

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 0:c91a9ebab739 4 * Copyright (C) 2014 TASS Belgium NV
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 1:58b5d1e8fae3 37 * LinMaster lin(p30);
bollenn 1:58b5d1e8fae3 38 *
bollenn 1:58b5d1e8fae3 39 * int main() {
bollenn 1:58b5d1e8fae3 40 * (void)lin.init();
bollenn 1:58b5d1e8fae3 41 * (void)lin.sendframe(M2S, 0x3C, (uint8_t*)u8Data, 8);
bollenn 1:58b5d1e8fae3 42 * }
bollenn 1:58b5d1e8fae3 43 * @endcode
bollenn 1:58b5d1e8fae3 44 */
bollenn 0:c91a9ebab739 45 class LinMaster
bollenn 0:c91a9ebab739 46 {
bollenn 0:c91a9ebab739 47 public:
bollenn 0:c91a9ebab739 48 /** LIN master constructor
bollenn 0:c91a9ebab739 49 *
bollenn 0:c91a9ebab739 50 * @param Pin The pinname to be used for LIN communication
bollenn 0:c91a9ebab739 51 */
bollenn 3:3656b0de0e43 52 LinMaster(PinName InPin, PinName OutPin);
bollenn 0:c91a9ebab739 53
bollenn 0:c91a9ebab739 54 /** LIN master destructor */
bollenn 0:c91a9ebab739 55 ~LinMaster();
bollenn 0:c91a9ebab739 56
bollenn 0:c91a9ebab739 57 /** Initialise the LIN module
bollenn 0:c91a9ebab739 58 * - configure IO
bollenn 0:c91a9ebab739 59 * - configure Timer
bollenn 0:c91a9ebab739 60 *
bollenn 0:c91a9ebab739 61 * @return
bollenn 0:c91a9ebab739 62 * true on succes,
bollenn 0:c91a9ebab739 63 * false on fail
bollenn 0:c91a9ebab739 64 */
bollenn 3:3656b0de0e43 65 bool init(void);
bollenn 0:c91a9ebab739 66
bollenn 0:c91a9ebab739 67 /** Set the LIN baudrate
bollenn 0:c91a9ebab739 68 *
bollenn 0:c91a9ebab739 69 * @param uBaud baudrate value in kbps (1..20000)
bollenn 0:c91a9ebab739 70 * @return
bollenn 0:c91a9ebab739 71 * true on succes,
bollenn 0:c91a9ebab739 72 * false on fail
bollenn 0:c91a9ebab739 73 */
bollenn 3:3656b0de0e43 74 bool baudrate(uint16_t uBaud);
bollenn 0:c91a9ebab739 75
bollenn 0:c91a9ebab739 76 /** Get the LIN baudrate
bollenn 0:c91a9ebab739 77 *
bollenn 0:c91a9ebab739 78 * @return
bollenn 0:c91a9ebab739 79 * The current configured LIN baudrate
bollenn 0:c91a9ebab739 80 */
bollenn 3:3656b0de0e43 81 uint16_t baudrate(void);
bollenn 0:c91a9ebab739 82
bollenn 2:6d4c7f841a5d 83 /** Bus status */
bollenn 3:3656b0de0e43 84 enum DriverStatus_t {
bollenn 3:3656b0de0e43 85 INIT, /**< initializing */
bollenn 3:3656b0de0e43 86 IDLE, /**< idle */
bollenn 3:3656b0de0e43 87 RXWAKEUP, /**< wake up pulses detected since the last request */
bollenn 3:3656b0de0e43 88 DOMINANT, /**< dominant level detected, longer than a wake up pulse */
bollenn 3:3656b0de0e43 89 TRANSMIT, /**< busy receiving data */
bollenn 3:3656b0de0e43 90 RECEIVE, /**< busy receiving data */
bollenn 3:3656b0de0e43 91 TXWAKEUP /**< busy sending a wake up pulse */
bollenn 2:6d4c7f841a5d 92 };
bollenn 2:6d4c7f841a5d 93
bollenn 2:6d4c7f841a5d 94 /** Get the current LIN driver status
bollenn 2:6d4c7f841a5d 95 *
bollenn 2:6d4c7f841a5d 96 * @return
bollenn 2:6d4c7f841a5d 97 * The current LIN driver status
bollenn 2:6d4c7f841a5d 98 */
bollenn 3:3656b0de0e43 99 DriverStatus_t status(void) {return ( DriverState );};
bollenn 3:3656b0de0e43 100
bollenn 3:3656b0de0e43 101 /** Frame Direction Type */
bollenn 3:3656b0de0e43 102 enum FrameType_t {
bollenn 3:3656b0de0e43 103 S2M,
bollenn 3:3656b0de0e43 104 M2S
bollenn 3:3656b0de0e43 105 };
bollenn 3:3656b0de0e43 106
bollenn 3:3656b0de0e43 107 /** CRC Type */
bollenn 3:3656b0de0e43 108 enum CrcType_t {
bollenn 3:3656b0de0e43 109 Classic,
bollenn 3:3656b0de0e43 110 Enhanced
bollenn 2:6d4c7f841a5d 111 };
bollenn 2:6d4c7f841a5d 112
bollenn 3:3656b0de0e43 113 /** Brake Type */
bollenn 3:3656b0de0e43 114 enum BrakeType_t {
bollenn 3:3656b0de0e43 115 Normal,
bollenn 3:3656b0de0e43 116 AutoConfig
bollenn 3:3656b0de0e43 117 };
bollenn 2:6d4c7f841a5d 118
bollenn 3:3656b0de0e43 119 /** Frame */
bollenn 3:3656b0de0e43 120 struct Frame_t {
bollenn 3:3656b0de0e43 121 FrameType_t FrameType;
bollenn 3:3656b0de0e43 122 CrcType_t CrcType;
bollenn 3:3656b0de0e43 123 BrakeType_t Brake;
bollenn 3:3656b0de0e43 124 uint8_t DataLen;
bollenn 3:3656b0de0e43 125 uint8_t FrameID;
bollenn 3:3656b0de0e43 126 uint8_t Data[8];
bollenn 1:58b5d1e8fae3 127 };
bollenn 0:c91a9ebab739 128
bollenn 1:58b5d1e8fae3 129 /** Send a frame on the LIN bus
bollenn 1:58b5d1e8fae3 130 *
bollenn 3:3656b0de0e43 131 * @param ptrFrame pointer to the frame to transmit
bollenn 3:3656b0de0e43 132 * @return
bollenn 3:3656b0de0e43 133 * true on succes,
bollenn 3:3656b0de0e43 134 * false on fail
bollenn 3:3656b0de0e43 135 */
bollenn 3:3656b0de0e43 136 bool tx_frame(Frame_t * ptrFrame);
bollenn 3:3656b0de0e43 137
bollenn 3:3656b0de0e43 138 /** Receive a frame on the LIN bus
bollenn 3:3656b0de0e43 139 *
bollenn 3:3656b0de0e43 140 * @param ptrFrame pointer to the frame to receive
bollenn 1:58b5d1e8fae3 141 * @return
bollenn 1:58b5d1e8fae3 142 * true on succes,
bollenn 1:58b5d1e8fae3 143 * false on fail
bollenn 1:58b5d1e8fae3 144 */
bollenn 3:3656b0de0e43 145 bool rx_frame(Frame_t * ptrFrame);
bollenn 2:6d4c7f841a5d 146
bollenn 2:6d4c7f841a5d 147 void TickEventHndl(void);
bollenn 2:6d4c7f841a5d 148
bollenn 3:3656b0de0e43 149 void PinEventHndl(void);
bollenn 3:3656b0de0e43 150
bollenn 0:c91a9ebab739 151 private:
bollenn 3:3656b0de0e43 152 enum FrameError_t {
bollenn 3:3656b0de0e43 153 NoError, /* No error */
bollenn 3:3656b0de0e43 154 NoSlaveResp, /* No slave response, LIN message has timed out */
bollenn 3:3656b0de0e43 155 FramingErr, /* Framing error */
bollenn 3:3656b0de0e43 156 CollisionErr, /* Collision error */
bollenn 3:3656b0de0e43 157 BusVoltage /* Bus voltage to low */
bollenn 3:3656b0de0e43 158 };
bollenn 3:3656b0de0e43 159
bollenn 3:3656b0de0e43 160 enum FrameStatus_t {
bollenn 3:3656b0de0e43 161 FStart,
bollenn 3:3656b0de0e43 162 Break_OK,
bollenn 3:3656b0de0e43 163 Sync_OK,
bollenn 3:3656b0de0e43 164 ID_OK,
bollenn 3:3656b0de0e43 165 Data0,
bollenn 3:3656b0de0e43 166 Data1,
bollenn 3:3656b0de0e43 167 Data2,
bollenn 3:3656b0de0e43 168 Data3,
bollenn 3:3656b0de0e43 169 Data4,
bollenn 3:3656b0de0e43 170 Data5,
bollenn 3:3656b0de0e43 171 Data6,
bollenn 3:3656b0de0e43 172 Data7,
bollenn 3:3656b0de0e43 173 CRC
bollenn 3:3656b0de0e43 174 };
bollenn 3:3656b0de0e43 175
bollenn 3:3656b0de0e43 176 enum ByteStatus_t {
bollenn 3:3656b0de0e43 177 BStart,
bollenn 3:3656b0de0e43 178 StartbitEdge, /* Begin of startbit received */
bollenn 3:3656b0de0e43 179 StartbitSample, /* Startbit sample */
bollenn 3:3656b0de0e43 180 Databit0Edge, /* Databit edge */
bollenn 3:3656b0de0e43 181 Databit0Sample, /* Databit sample */
bollenn 3:3656b0de0e43 182 Databit1Edge, /* Databit edge */
bollenn 3:3656b0de0e43 183 Databit1Sample, /* Databit sample */
bollenn 3:3656b0de0e43 184 Databit2Edge, /* Databit edge */
bollenn 3:3656b0de0e43 185 Databit2Sample, /* Databit sample */
bollenn 3:3656b0de0e43 186 Databit3Edge, /* Databit edge */
bollenn 3:3656b0de0e43 187 Databit3Sample, /* Databit sample */
bollenn 3:3656b0de0e43 188 Databit4Edge, /* Databit edge */
bollenn 3:3656b0de0e43 189 Databit4Sample, /* Databit sample */
bollenn 3:3656b0de0e43 190 Databit5Edge, /* Databit edge */
bollenn 3:3656b0de0e43 191 Databit5Sample, /* Databit sample */
bollenn 3:3656b0de0e43 192 Databit6Edge, /* Databit edge */
bollenn 3:3656b0de0e43 193 Databit6Sample, /* Databit sample */
bollenn 3:3656b0de0e43 194 Databit7Edge, /* Databit edge */
bollenn 3:3656b0de0e43 195 Databit7Sample, /* Databit sample */
bollenn 3:3656b0de0e43 196 StopbitEdge, /* Stopbit edge */
bollenn 3:3656b0de0e43 197 StopbitSample, /* Stopbit sample */
bollenn 3:3656b0de0e43 198 BDone
bollenn 3:3656b0de0e43 199 };
bollenn 3:3656b0de0e43 200
bollenn 3:3656b0de0e43 201 volatile DriverStatus_t DriverState;
bollenn 3:3656b0de0e43 202 volatile FrameError_t LastError;
bollenn 3:3656b0de0e43 203 volatile FrameStatus_t FrameStatus;
bollenn 3:3656b0de0e43 204 volatile ByteStatus_t ByteStatus;
bollenn 3:3656b0de0e43 205 volatile FrameType_t linMessageType;
bollenn 3:3656b0de0e43 206
bollenn 3:3656b0de0e43 207 uint8_t breakLength;
bollenn 3:3656b0de0e43 208 uint8_t FrameLength;
bollenn 3:3656b0de0e43 209
bollenn 3:3656b0de0e43 210 uint8_t TXbuf[11];
bollenn 3:3656b0de0e43 211 uint8_t TXbufIndex;
bollenn 3:3656b0de0e43 212 uint8_t RXbuf[11];
bollenn 3:3656b0de0e43 213 uint8_t RXbufIndex;
bollenn 3:3656b0de0e43 214 uint8_t RXtimeout;
bollenn 3:3656b0de0e43 215 uint16_t RXtimeoutSubCTR;
bollenn 3:3656b0de0e43 216 uint16_t u16HalfBitPeriod;
bollenn 3:3656b0de0e43 217
bollenn 3:3656b0de0e43 218 PinName MyInPin;
bollenn 3:3656b0de0e43 219 PinName MyOutPin;
bollenn 3:3656b0de0e43 220 Ticker MyTicker;
bollenn 3:3656b0de0e43 221 Timer MyTimer;
bollenn 3:3656b0de0e43 222
bollenn 3:3656b0de0e43 223 uint8_t parity(uint8_t u8BYTE);
bollenn 3:3656b0de0e43 224
bollenn 0:c91a9ebab739 225 };
bollenn 1:58b5d1e8fae3 226
bollenn 1:58b5d1e8fae3 227 #endif /* MBED_LIN_MASTER_H */