Nico Bollen / LIN

Dependents:   MBED_LIN_RGB_Master_Example

Committer:
bollenn
Date:
Sun May 11 13:14:16 2014 +0000
Revision:
2:6d4c7f841a5d
Parent:
1:58b5d1e8fae3
Child:
3:3656b0de0e43
Adding LIN output handling in ticker handle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bollenn 1:58b5d1e8fae3 1 /*
bollenn 0:c91a9ebab739 2 * 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 "LinMaster.h"
bollenn 0:c91a9ebab739 27
bollenn 0:c91a9ebab739 28 LinMaster::LinMaster(PinName Pin)
bollenn 0:c91a9ebab739 29 {
bollenn 2:6d4c7f841a5d 30 DriverStat = INIT;
bollenn 2:6d4c7f841a5d 31 FrameStat = READY;
bollenn 0:c91a9ebab739 32 MyPin = Pin;
bollenn 0:c91a9ebab739 33 u8BreakLen = 20;
bollenn 0:c91a9ebab739 34 u8DelimLen = 4;
bollenn 0:c91a9ebab739 35 (void)Baudrate(9600);
bollenn 0:c91a9ebab739 36 }
bollenn 0:c91a9ebab739 37
bollenn 0:c91a9ebab739 38 LinMaster::~LinMaster()
bollenn 0:c91a9ebab739 39 {
bollenn 0:c91a9ebab739 40
bollenn 0:c91a9ebab739 41 }
bollenn 0:c91a9ebab739 42
bollenn 0:c91a9ebab739 43 bool LinMaster::Init(void)
bollenn 0:c91a9ebab739 44 {
bollenn 0:c91a9ebab739 45 DigitalInOut LinPin(MyPin);
bollenn 0:c91a9ebab739 46 LinPin.output();
bollenn 0:c91a9ebab739 47 LinPin.write(1);
bollenn 0:c91a9ebab739 48
bollenn 2:6d4c7f841a5d 49 DriverStat = IDLE;
bollenn 2:6d4c7f841a5d 50
bollenn 0:c91a9ebab739 51 return ( true );
bollenn 0:c91a9ebab739 52 }
bollenn 0:c91a9ebab739 53
bollenn 0:c91a9ebab739 54 bool LinMaster::Baudrate(uint16_t uBaud)
bollenn 0:c91a9ebab739 55 {
bollenn 0:c91a9ebab739 56 bool blReturn = false;
bollenn 0:c91a9ebab739 57
bollenn 0:c91a9ebab739 58 if ((uBaud > 0) && (uBaud <= 20000))
bollenn 0:c91a9ebab739 59 {
bollenn 0:c91a9ebab739 60 u16BitPeriod = 1000000/uBaud;
bollenn 0:c91a9ebab739 61 blReturn = true;
bollenn 0:c91a9ebab739 62 }
bollenn 0:c91a9ebab739 63
bollenn 0:c91a9ebab739 64 return ( blReturn );
bollenn 0:c91a9ebab739 65 }
bollenn 0:c91a9ebab739 66
bollenn 0:c91a9ebab739 67 uint16_t LinMaster::Baudrate(void)
bollenn 0:c91a9ebab739 68 {
bollenn 0:c91a9ebab739 69 return ( 1000000/u16BitPeriod );
bollenn 0:c91a9ebab739 70 }
bollenn 0:c91a9ebab739 71
bollenn 1:58b5d1e8fae3 72 bool LinMaster::SendFrame(FrameDir Dir, uint8_t u8ID, uint8_t* ptrData, uint8_t u8Len)
bollenn 0:c91a9ebab739 73 {
bollenn 2:6d4c7f841a5d 74 bool blReturn = false;
bollenn 2:6d4c7f841a5d 75 uint8_t i;
bollenn 2:6d4c7f841a5d 76
bollenn 2:6d4c7f841a5d 77 if (DriverStat == IDLE)
bollenn 2:6d4c7f841a5d 78 {
bollenn 2:6d4c7f841a5d 79 DriverStat = TRANSMIT;
bollenn 2:6d4c7f841a5d 80 FrameStat = BREAK;
bollenn 2:6d4c7f841a5d 81 u8NextBusLvl = 0;
bollenn 2:6d4c7f841a5d 82 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 83 Direction = Dir;
bollenn 2:6d4c7f841a5d 84 u8FrameID = u8ID;
bollenn 2:6d4c7f841a5d 85 u8FrameLen = u8Len;
bollenn 2:6d4c7f841a5d 86
bollenn 2:6d4c7f841a5d 87 for (i=0; i<u8Len; i++)
bollenn 2:6d4c7f841a5d 88 {
bollenn 2:6d4c7f841a5d 89 u8FrameData[i] = *ptrData++;
bollenn 2:6d4c7f841a5d 90 }
bollenn 2:6d4c7f841a5d 91
bollenn 2:6d4c7f841a5d 92 DigitalInOut LinPin(MyPin);
bollenn 2:6d4c7f841a5d 93 LinPin.output();
bollenn 2:6d4c7f841a5d 94 LinPin.write(1);
bollenn 2:6d4c7f841a5d 95
bollenn 2:6d4c7f841a5d 96 MyTicker.attach_us(this, &LinMaster::TickEventHndl, u16BitPeriod);
bollenn 2:6d4c7f841a5d 97
bollenn 2:6d4c7f841a5d 98 blReturn = true;
bollenn 2:6d4c7f841a5d 99 }
bollenn 2:6d4c7f841a5d 100
bollenn 2:6d4c7f841a5d 101 return ( blReturn );
bollenn 2:6d4c7f841a5d 102 }
bollenn 2:6d4c7f841a5d 103
bollenn 2:6d4c7f841a5d 104 void LinMaster::TickEventHndl(void)
bollenn 2:6d4c7f841a5d 105 {
bollenn 2:6d4c7f841a5d 106 DigitalInOut LinPin(MyPin);
bollenn 2:6d4c7f841a5d 107 bool blByteSend = false;
bollenn 2:6d4c7f841a5d 108
bollenn 2:6d4c7f841a5d 109 if (u8NextBusLvl != 0)
bollenn 2:6d4c7f841a5d 110 {
bollenn 2:6d4c7f841a5d 111 LinPin.output();
bollenn 2:6d4c7f841a5d 112 LinPin.write(1);
bollenn 2:6d4c7f841a5d 113 }
bollenn 2:6d4c7f841a5d 114 else
bollenn 2:6d4c7f841a5d 115 {
bollenn 2:6d4c7f841a5d 116 LinPin.output();
bollenn 2:6d4c7f841a5d 117 LinPin.write(0);
bollenn 2:6d4c7f841a5d 118 }
bollenn 2:6d4c7f841a5d 119
bollenn 2:6d4c7f841a5d 120 u8TickCnt++;
bollenn 0:c91a9ebab739 121
bollenn 2:6d4c7f841a5d 122 switch (FrameStat)
bollenn 2:6d4c7f841a5d 123 {
bollenn 2:6d4c7f841a5d 124 case BREAK:
bollenn 2:6d4c7f841a5d 125 u8NextBusLvl = 0;
bollenn 2:6d4c7f841a5d 126 if (u8TickCnt >= u8BreakLen)
bollenn 2:6d4c7f841a5d 127 {
bollenn 2:6d4c7f841a5d 128 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 129 FrameStat = DELIMITER;
bollenn 2:6d4c7f841a5d 130 u8NextBusLvl = 1;
bollenn 2:6d4c7f841a5d 131 }
bollenn 2:6d4c7f841a5d 132 break;
bollenn 2:6d4c7f841a5d 133
bollenn 2:6d4c7f841a5d 134 case DELIMITER:
bollenn 2:6d4c7f841a5d 135 if (u8TickCnt >= u8DelimLen)
bollenn 2:6d4c7f841a5d 136 {
bollenn 2:6d4c7f841a5d 137 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 138 FrameStat = SYNC;
bollenn 2:6d4c7f841a5d 139 u8Byte = 0xAA;
bollenn 2:6d4c7f841a5d 140 }
bollenn 2:6d4c7f841a5d 141 break;
bollenn 2:6d4c7f841a5d 142
bollenn 2:6d4c7f841a5d 143 case SYNC:
bollenn 2:6d4c7f841a5d 144 blByteSend = true;
bollenn 2:6d4c7f841a5d 145 if (u8TickCnt >= 10)
bollenn 2:6d4c7f841a5d 146 {
bollenn 2:6d4c7f841a5d 147 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 148 FrameStat = ID;
bollenn 2:6d4c7f841a5d 149 u8Byte = u8FrameID;
bollenn 2:6d4c7f841a5d 150 }
bollenn 2:6d4c7f841a5d 151 break;
bollenn 2:6d4c7f841a5d 152
bollenn 2:6d4c7f841a5d 153 case ID:
bollenn 2:6d4c7f841a5d 154 blByteSend = true;
bollenn 2:6d4c7f841a5d 155 if (u8TickCnt >= 10)
bollenn 2:6d4c7f841a5d 156 {
bollenn 2:6d4c7f841a5d 157 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 158 FrameStat = DATA;
bollenn 2:6d4c7f841a5d 159 u8ByteOnLin = 0;
bollenn 2:6d4c7f841a5d 160 if (Direction == M2S)
bollenn 2:6d4c7f841a5d 161 {
bollenn 2:6d4c7f841a5d 162 u8Byte = u8FrameData[u8ByteOnLin];
bollenn 2:6d4c7f841a5d 163 }
bollenn 2:6d4c7f841a5d 164 else
bollenn 2:6d4c7f841a5d 165 {
bollenn 2:6d4c7f841a5d 166 blByteSend = false;
bollenn 2:6d4c7f841a5d 167 }
bollenn 2:6d4c7f841a5d 168 }
bollenn 2:6d4c7f841a5d 169 break;
bollenn 2:6d4c7f841a5d 170
bollenn 2:6d4c7f841a5d 171 case DATA:
bollenn 2:6d4c7f841a5d 172 if (Direction == M2S)
bollenn 2:6d4c7f841a5d 173 {
bollenn 2:6d4c7f841a5d 174 blByteSend = true;
bollenn 2:6d4c7f841a5d 175 }
bollenn 2:6d4c7f841a5d 176 else
bollenn 2:6d4c7f841a5d 177 {
bollenn 2:6d4c7f841a5d 178 blByteSend = false;
bollenn 2:6d4c7f841a5d 179 }
bollenn 2:6d4c7f841a5d 180
bollenn 2:6d4c7f841a5d 181 if (u8TickCnt >= 10)
bollenn 2:6d4c7f841a5d 182 {
bollenn 2:6d4c7f841a5d 183 if (Direction == S2M)
bollenn 2:6d4c7f841a5d 184 {
bollenn 2:6d4c7f841a5d 185 u8FrameData[u8ByteOnLin] = u8Byte;
bollenn 2:6d4c7f841a5d 186 }
bollenn 2:6d4c7f841a5d 187
bollenn 2:6d4c7f841a5d 188 u8ByteOnLin++;
bollenn 2:6d4c7f841a5d 189 u8TickCnt = 0;
bollenn 2:6d4c7f841a5d 190
bollenn 2:6d4c7f841a5d 191 if (u8ByteOnLin >= u8FrameLen)
bollenn 2:6d4c7f841a5d 192 {
bollenn 2:6d4c7f841a5d 193 /* Sending/Receiving is ended */
bollenn 2:6d4c7f841a5d 194 FrameStat = READY;
bollenn 2:6d4c7f841a5d 195 blByteSend = false;
bollenn 2:6d4c7f841a5d 196 u8NextBusLvl = 1;
bollenn 2:6d4c7f841a5d 197 }
bollenn 2:6d4c7f841a5d 198 else if (Direction == M2S)
bollenn 2:6d4c7f841a5d 199 {
bollenn 2:6d4c7f841a5d 200 u8Byte = u8FrameData[u8ByteOnLin];
bollenn 2:6d4c7f841a5d 201 }
bollenn 2:6d4c7f841a5d 202 }
bollenn 2:6d4c7f841a5d 203 break;
bollenn 2:6d4c7f841a5d 204
bollenn 2:6d4c7f841a5d 205 case READY:
bollenn 2:6d4c7f841a5d 206 default:
bollenn 2:6d4c7f841a5d 207 u8NextBusLvl = 1;
bollenn 2:6d4c7f841a5d 208 MyTicker.detach();
bollenn 2:6d4c7f841a5d 209 FrameStat = READY;
bollenn 2:6d4c7f841a5d 210 DriverStat = IDLE;
bollenn 2:6d4c7f841a5d 211 break;
bollenn 2:6d4c7f841a5d 212 }
bollenn 0:c91a9ebab739 213
bollenn 2:6d4c7f841a5d 214 if (blByteSend == true)
bollenn 2:6d4c7f841a5d 215 {
bollenn 2:6d4c7f841a5d 216 switch (u8TickCnt)
bollenn 2:6d4c7f841a5d 217 {
bollenn 2:6d4c7f841a5d 218 case 0:
bollenn 2:6d4c7f841a5d 219 /* Start Bit */
bollenn 2:6d4c7f841a5d 220 u8NextBusLvl = 0;
bollenn 2:6d4c7f841a5d 221 break;
bollenn 2:6d4c7f841a5d 222 case 9:
bollenn 2:6d4c7f841a5d 223 /* Stop Bit */
bollenn 2:6d4c7f841a5d 224 u8NextBusLvl = 1;
bollenn 2:6d4c7f841a5d 225 break;
bollenn 2:6d4c7f841a5d 226 default:
bollenn 2:6d4c7f841a5d 227 u8NextBusLvl = u8Byte & 0x1;
bollenn 2:6d4c7f841a5d 228 u8Byte >>= 1;
bollenn 2:6d4c7f841a5d 229 break;
bollenn 2:6d4c7f841a5d 230 }
bollenn 2:6d4c7f841a5d 231 }
bollenn 0:c91a9ebab739 232 }
bollenn 0:c91a9ebab739 233
bollenn 0:c91a9ebab739 234 /* EOF */