Nico Bollen / LIN

Dependents:   MBED_LIN_RGB_Master_Example

Committer:
bollenn
Date:
Mon Jun 08 11:59:35 2020 +0000
Revision:
7:53b2cded83f3
Parent:
6:0827e5003e17
Child:
8:63d341e53cce
Add last error return

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