Zoltan Hudak / TLE5012B

Dependents:   TLE5012B_Hello

Committer:
hudakz
Date:
Sat Sep 19 18:01:49 2020 +0000
Revision:
0:4b76b1dc05cd
Library for the TLE5012B Giant Magneto Resistance (GMR) based angle sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:4b76b1dc05cd 1 /*!
hudakz 0:4b76b1dc05cd 2 * \name TLE5012B.h - Mbed port of Arduino library for the TLE5012B angle sensor.
hudakz 0:4b76b1dc05cd 3 * \author Infineon Technologies AG (Dr.Olaf Filies)
hudakz 0:4b76b1dc05cd 4 * \copyright Infineon Technologies AG
hudakz 0:4b76b1dc05cd 5 * \version 2.0.1
hudakz 0:4b76b1dc05cd 6 * \brief GMR-based angle sensor for angular position sensing in automotive applications
hudakz 0:4b76b1dc05cd 7 * \details Ported to Mbed by Zoltan Hudak 2020-08
hudakz 0:4b76b1dc05cd 8 *
hudakz 0:4b76b1dc05cd 9 * The TLE5012B is a 360° angle sensor that detects the orientation of a magnetic field.
hudakz 0:4b76b1dc05cd 10 * This is achieved by measuring sine and cosine angle components with monolithic integrated
hudakz 0:4b76b1dc05cd 11 * Giant Magneto Resistance (iGMR) elements. These raw signals (sine and cosine) are digitally
hudakz 0:4b76b1dc05cd 12 * processed internally to calculate the angle orientation of the magnetic field (magnet).
hudakz 0:4b76b1dc05cd 13 * The TLE5012B is a pre-calibrated sensor. The calibration parameters are stored in laser fuses.
hudakz 0:4b76b1dc05cd 14 * At start-up the values of the fuses are written into flip-flops, where these values can be changed
hudakz 0:4b76b1dc05cd 15 * by the application-specific parameters. Further precision of the angle measurement over a wide
hudakz 0:4b76b1dc05cd 16 * temperature range and a long lifetime can be improved by enabling an optional internal autocalibration
hudakz 0:4b76b1dc05cd 17 * algorithm. Data communications are accomplished with a bi-directional Synchronous Serial Communication (SSC)
hudakz 0:4b76b1dc05cd 18 * that is SPI-compatible. The sensor configuration is stored in registers, which are accessible by the
hudakz 0:4b76b1dc05cd 19 * SSC interface. Additionally four other interfaces are available with the TLE5012B: Pulse-Width-Modulation (PWM)
hudakz 0:4b76b1dc05cd 20 * Protocol, Short-PWM-Code (SPC) Protocol, Hall Switch Mode (HSM) and Incremental Interface (IIF). These interfaces
hudakz 0:4b76b1dc05cd 21 * can be used in parallel with SSC or alone. Pre-configured sensor derivates with different interface settings are available.
hudakz 0:4b76b1dc05cd 22 * Online diagnostic functions are provided to ensure reliable operation.
hudakz 0:4b76b1dc05cd 23 *
hudakz 0:4b76b1dc05cd 24 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
hudakz 0:4b76b1dc05cd 25 * following conditions are met:
hudakz 0:4b76b1dc05cd 26 *
hudakz 0:4b76b1dc05cd 27 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
hudakz 0:4b76b1dc05cd 28 * disclaimer.
hudakz 0:4b76b1dc05cd 29 *
hudakz 0:4b76b1dc05cd 30 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
hudakz 0:4b76b1dc05cd 31 * disclaimer in the documentation and/or other materials provided with the distribution.
hudakz 0:4b76b1dc05cd 32 *
hudakz 0:4b76b1dc05cd 33 * Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
hudakz 0:4b76b1dc05cd 34 * products derived from this software without specific prior written permission.
hudakz 0:4b76b1dc05cd 35 *
hudakz 0:4b76b1dc05cd 36 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
hudakz 0:4b76b1dc05cd 37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
hudakz 0:4b76b1dc05cd 38 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
hudakz 0:4b76b1dc05cd 39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
hudakz 0:4b76b1dc05cd 40 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
hudakz 0:4b76b1dc05cd 41 * WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
hudakz 0:4b76b1dc05cd 42 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
hudakz 0:4b76b1dc05cd 43 *
hudakz 0:4b76b1dc05cd 44 */
hudakz 0:4b76b1dc05cd 45 #include "TLE5012B.h"
hudakz 0:4b76b1dc05cd 46
hudakz 0:4b76b1dc05cd 47 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 48
hudakz 0:4b76b1dc05cd 49 using namespace TLE5012;
hudakz 0:4b76b1dc05cd 50
hudakz 0:4b76b1dc05cd 51 // none_class functions
hudakz 0:4b76b1dc05cd 52
hudakz 0:4b76b1dc05cd 53 /*!
hudakz 0:4b76b1dc05cd 54 * Gets the first byte of a 2 byte word
hudakz 0:4b76b1dc05cd 55 * @param twoByteWord insert word of two bytes long
hudakz 0:4b76b1dc05cd 56 * @return returns the first byte
hudakz 0:4b76b1dc05cd 57 */
hudakz 0:4b76b1dc05cd 58 uint8_t getFirstByte(uint16_t twoByteWord)
hudakz 0:4b76b1dc05cd 59 {
hudakz 0:4b76b1dc05cd 60 return((uint8_t) (twoByteWord >> 8));
hudakz 0:4b76b1dc05cd 61 }
hudakz 0:4b76b1dc05cd 62
hudakz 0:4b76b1dc05cd 63 /*!
hudakz 0:4b76b1dc05cd 64 * Gets the second byte of the 2 byte word
hudakz 0:4b76b1dc05cd 65 * @param twoByteWord insert word of two bytes long
hudakz 0:4b76b1dc05cd 66 * @return returns the second byte
hudakz 0:4b76b1dc05cd 67 */
hudakz 0:4b76b1dc05cd 68 uint8_t getSecondByte(uint16_t twoByteWord)
hudakz 0:4b76b1dc05cd 69 {
hudakz 0:4b76b1dc05cd 70 return((uint8_t) twoByteWord);
hudakz 0:4b76b1dc05cd 71 }
hudakz 0:4b76b1dc05cd 72
hudakz 0:4b76b1dc05cd 73 /*!
hudakz 0:4b76b1dc05cd 74 * Function for calculation the CRC.
hudakz 0:4b76b1dc05cd 75 * @param data byte long data for CRC check
hudakz 0:4b76b1dc05cd 76 * @param length length of data
hudakz 0:4b76b1dc05cd 77 * @return returns 8bit CRC
hudakz 0:4b76b1dc05cd 78 */
hudakz 0:4b76b1dc05cd 79 uint8_t crc8(uint8_t* data, uint8_t length)
hudakz 0:4b76b1dc05cd 80 {
hudakz 0:4b76b1dc05cd 81 uint32_t crc;
hudakz 0:4b76b1dc05cd 82 int16_t i, bit;
hudakz 0:4b76b1dc05cd 83
hudakz 0:4b76b1dc05cd 84 crc = CRC_SEED;
hudakz 0:4b76b1dc05cd 85 for (i = 0; i < length; i++) {
hudakz 0:4b76b1dc05cd 86 crc ^= data[i];
hudakz 0:4b76b1dc05cd 87 for (bit = 0; bit < 8; bit++) {
hudakz 0:4b76b1dc05cd 88 if ((crc & 0x80) != 0) {
hudakz 0:4b76b1dc05cd 89 crc <<= 1;
hudakz 0:4b76b1dc05cd 90 crc ^= CRC_POLYNOMIAL;
hudakz 0:4b76b1dc05cd 91 }
hudakz 0:4b76b1dc05cd 92 else {
hudakz 0:4b76b1dc05cd 93 crc <<= 1;
hudakz 0:4b76b1dc05cd 94 }
hudakz 0:4b76b1dc05cd 95 }
hudakz 0:4b76b1dc05cd 96 }
hudakz 0:4b76b1dc05cd 97
hudakz 0:4b76b1dc05cd 98 return((~crc) & CRC_SEED);
hudakz 0:4b76b1dc05cd 99 }
hudakz 0:4b76b1dc05cd 100
hudakz 0:4b76b1dc05cd 101 /*!
hudakz 0:4b76b1dc05cd 102 * Function for calculation of the CRC
hudakz 0:4b76b1dc05cd 103 * @param crcData byte long data for CRC check
hudakz 0:4b76b1dc05cd 104 * @param length length of data
hudakz 0:4b76b1dc05cd 105 * @return runs crc8 calculation and returns CRC
hudakz 0:4b76b1dc05cd 106 */
hudakz 0:4b76b1dc05cd 107 uint8_t crcCalc(uint8_t* crcData, uint8_t length)
hudakz 0:4b76b1dc05cd 108 {
hudakz 0:4b76b1dc05cd 109 return(crc8(crcData, length));
hudakz 0:4b76b1dc05cd 110 }
hudakz 0:4b76b1dc05cd 111
hudakz 0:4b76b1dc05cd 112 /*!
hudakz 0:4b76b1dc05cd 113 * Calculate the angle speed
hudakz 0:4b76b1dc05cd 114 * @param angRange set angular range value
hudakz 0:4b76b1dc05cd 115 * @param rawAngleSpeed raw speed value from read function
hudakz 0:4b76b1dc05cd 116 * @param firMD
hudakz 0:4b76b1dc05cd 117 * @param predictionVal
hudakz 0:4b76b1dc05cd 118 * @return calculated angular speed
hudakz 0:4b76b1dc05cd 119 */
hudakz 0:4b76b1dc05cd 120 double calculateAngleSpeed(double angRange, int16_t rawAngleSpeed, uint16_t firMD, uint16_t predictionVal)
hudakz 0:4b76b1dc05cd 121 {
hudakz 0:4b76b1dc05cd 122 double finalAngleSpeed;
hudakz 0:4b76b1dc05cd 123 double microsecToSec = 0.000001;
hudakz 0:4b76b1dc05cd 124 double firMDVal;
hudakz 0:4b76b1dc05cd 125
hudakz 0:4b76b1dc05cd 126
hudakz 0:4b76b1dc05cd 127 if (firMD == 1) {
hudakz 0:4b76b1dc05cd 128 firMDVal = 42.7;
hudakz 0:4b76b1dc05cd 129 }
hudakz 0:4b76b1dc05cd 130 else
hudakz 0:4b76b1dc05cd 131 if (firMD == 0) {
hudakz 0:4b76b1dc05cd 132 firMDVal = 21.3;
hudakz 0:4b76b1dc05cd 133 }
hudakz 0:4b76b1dc05cd 134 else
hudakz 0:4b76b1dc05cd 135 if (firMD == 2) {
hudakz 0:4b76b1dc05cd 136 firMDVal = 85.3;
hudakz 0:4b76b1dc05cd 137 }
hudakz 0:4b76b1dc05cd 138 else
hudakz 0:4b76b1dc05cd 139 if (firMD == 3) {
hudakz 0:4b76b1dc05cd 140 firMDVal = 170.6;
hudakz 0:4b76b1dc05cd 141 }
hudakz 0:4b76b1dc05cd 142 else {
hudakz 0:4b76b1dc05cd 143 firMDVal = 0;
hudakz 0:4b76b1dc05cd 144 }
hudakz 0:4b76b1dc05cd 145
hudakz 0:4b76b1dc05cd 146 finalAngleSpeed = ((angRange / POW_2_15) * ((double)rawAngleSpeed)) / (((double)predictionVal) * firMDVal * microsecToSec);
hudakz 0:4b76b1dc05cd 147 return(finalAngleSpeed);
hudakz 0:4b76b1dc05cd 148 }
hudakz 0:4b76b1dc05cd 149
hudakz 0:4b76b1dc05cd 150 // end none class functions
hudakz 0:4b76b1dc05cd 151
hudakz 0:4b76b1dc05cd 152 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 153 errorTypes TLE5012B::begin(slaveNum slave)
hudakz 0:4b76b1dc05cd 154 {
hudakz 0:4b76b1dc05cd 155 _spiConnection->begin(&_cs);
hudakz 0:4b76b1dc05cd 156 _slave = slave;
hudakz 0:4b76b1dc05cd 157 writeSlaveNumber(_slave);
hudakz 0:4b76b1dc05cd 158 return(readBlockCRC());
hudakz 0:4b76b1dc05cd 159
hudakz 0:4b76b1dc05cd 160 }
hudakz 0:4b76b1dc05cd 161
hudakz 0:4b76b1dc05cd 162 /**
hudakz 0:4b76b1dc05cd 163 * @brief
hudakz 0:4b76b1dc05cd 164 * @note
hudakz 0:4b76b1dc05cd 165 * @param
hudakz 0:4b76b1dc05cd 166 * @retval
hudakz 0:4b76b1dc05cd 167 */
hudakz 0:4b76b1dc05cd 168 void TLE5012B::triggerUpdate()
hudakz 0:4b76b1dc05cd 169 {
hudakz 0:4b76b1dc05cd 170 _spiConnection->triggerUpdate();
hudakz 0:4b76b1dc05cd 171 _cs = 0;
hudakz 0:4b76b1dc05cd 172 wait_us(5); //grace period for register snapshot
hudakz 0:4b76b1dc05cd 173 _cs = 1;
hudakz 0:4b76b1dc05cd 174 }
hudakz 0:4b76b1dc05cd 175
hudakz 0:4b76b1dc05cd 176 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 177
hudakz 0:4b76b1dc05cd 178 // begin generic data transfer functions
hudakz 0:4b76b1dc05cd 179 errorTypes TLE5012B::readFromSensor(uint16_t command, uint16_t& data, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 180 {
hudakz 0:4b76b1dc05cd 181 errorTypes checkError = NO_ERROR;
hudakz 0:4b76b1dc05cd 182
hudakz 0:4b76b1dc05cd 183 _command[0] = READ_SENSOR | command | upd | safe;
hudakz 0:4b76b1dc05cd 184
hudakz 0:4b76b1dc05cd 185 uint16_t _received[MAX_REGISTER_MEM] = { 0 };
hudakz 0:4b76b1dc05cd 186
hudakz 0:4b76b1dc05cd 187 _spiConnection->sendReceiveSpi(&_cs, _command, 1, _received, 2);
hudakz 0:4b76b1dc05cd 188 data = _received[0];
hudakz 0:4b76b1dc05cd 189 if (safe == SAFE_HIGH) {
hudakz 0:4b76b1dc05cd 190 checkError = checkSafety(_received[1], _command[0], &_received[0], 1);
hudakz 0:4b76b1dc05cd 191 if (checkError != NO_ERROR) {
hudakz 0:4b76b1dc05cd 192 data = 0;
hudakz 0:4b76b1dc05cd 193 }
hudakz 0:4b76b1dc05cd 194 }
hudakz 0:4b76b1dc05cd 195
hudakz 0:4b76b1dc05cd 196 return(checkError);
hudakz 0:4b76b1dc05cd 197 }
hudakz 0:4b76b1dc05cd 198
hudakz 0:4b76b1dc05cd 199 /**
hudakz 0:4b76b1dc05cd 200 * @brief
hudakz 0:4b76b1dc05cd 201 * @note
hudakz 0:4b76b1dc05cd 202 * @param
hudakz 0:4b76b1dc05cd 203 * @retval
hudakz 0:4b76b1dc05cd 204 */
hudakz 0:4b76b1dc05cd 205 errorTypes TLE5012B::readMoreRegisters(uint16_t command, uint16_t data[], updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 206 {
hudakz 0:4b76b1dc05cd 207 errorTypes checkError = NO_ERROR;
hudakz 0:4b76b1dc05cd 208
hudakz 0:4b76b1dc05cd 209 _command[0] = READ_SENSOR | command | upd | safe;
hudakz 0:4b76b1dc05cd 210
hudakz 0:4b76b1dc05cd 211 uint16_t _received[MAX_REGISTER_MEM] = { 0 };
hudakz 0:4b76b1dc05cd 212 uint16_t _recDataLength = (_command[0] & (0x000F)); // Number of registers to read
hudakz 0:4b76b1dc05cd 213
hudakz 0:4b76b1dc05cd 214 _spiConnection->sendReceiveSpi(&_cs, _command, 1, _received, _recDataLength + safe);
hudakz 0:4b76b1dc05cd 215 memcpy(data, _received, (_recDataLength) * sizeof(uint16_t));
hudakz 0:4b76b1dc05cd 216 if (safe == SAFE_HIGH) {
hudakz 0:4b76b1dc05cd 217 checkError = checkSafety(_received[_recDataLength], _command[0], _received, _recDataLength);
hudakz 0:4b76b1dc05cd 218 if (checkError != NO_ERROR) {
hudakz 0:4b76b1dc05cd 219 data = 0;
hudakz 0:4b76b1dc05cd 220 }
hudakz 0:4b76b1dc05cd 221 }
hudakz 0:4b76b1dc05cd 222
hudakz 0:4b76b1dc05cd 223 return(checkError);
hudakz 0:4b76b1dc05cd 224 }
hudakz 0:4b76b1dc05cd 225
hudakz 0:4b76b1dc05cd 226 /**
hudakz 0:4b76b1dc05cd 227 * @brief
hudakz 0:4b76b1dc05cd 228 * @note
hudakz 0:4b76b1dc05cd 229 * @param
hudakz 0:4b76b1dc05cd 230 * @retval
hudakz 0:4b76b1dc05cd 231 */
hudakz 0:4b76b1dc05cd 232 errorTypes TLE5012B::writeToSensor(uint16_t command, uint16_t dataToWrite, bool changeCRC)
hudakz 0:4b76b1dc05cd 233 {
hudakz 0:4b76b1dc05cd 234 uint16_t safety = 0;
hudakz 0:4b76b1dc05cd 235 _command[0] = WRITE_SENSOR | command | SAFE_HIGH;
hudakz 0:4b76b1dc05cd 236 _command[1] = dataToWrite;
hudakz 0:4b76b1dc05cd 237 _spiConnection->sendReceiveSpi(&_cs, _command, 2, &safety, 1);
hudakz 0:4b76b1dc05cd 238
hudakz 0:4b76b1dc05cd 239 errorTypes checkError = checkSafety(safety, _command[0], &_command[1], 1);
hudakz 0:4b76b1dc05cd 240
hudakz 0:4b76b1dc05cd 241 //if we write to a register, which changes the CRC.
hudakz 0:4b76b1dc05cd 242
hudakz 0:4b76b1dc05cd 243 if (changeCRC) {
hudakz 0:4b76b1dc05cd 244
hudakz 0:4b76b1dc05cd 245 //Serial.println("h45");
hudakz 0:4b76b1dc05cd 246 checkError = regularCrcUpdate();
hudakz 0:4b76b1dc05cd 247 }
hudakz 0:4b76b1dc05cd 248
hudakz 0:4b76b1dc05cd 249 return(checkError);
hudakz 0:4b76b1dc05cd 250 }
hudakz 0:4b76b1dc05cd 251
hudakz 0:4b76b1dc05cd 252 /**
hudakz 0:4b76b1dc05cd 253 * @brief
hudakz 0:4b76b1dc05cd 254 * @note
hudakz 0:4b76b1dc05cd 255 * @param
hudakz 0:4b76b1dc05cd 256 * @retval
hudakz 0:4b76b1dc05cd 257 */
hudakz 0:4b76b1dc05cd 258 errorTypes TLE5012B::writeTempCoeffUpdate(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 259 {
hudakz 0:4b76b1dc05cd 260 uint16_t safety = 0;
hudakz 0:4b76b1dc05cd 261 uint16_t readreg = 0;
hudakz 0:4b76b1dc05cd 262
hudakz 0:4b76b1dc05cd 263 triggerUpdate();
hudakz 0:4b76b1dc05cd 264 _command[0] = WRITE_SENSOR | REG_TCO_Y | SAFE_HIGH;
hudakz 0:4b76b1dc05cd 265 _command[1] = dataToWrite;
hudakz 0:4b76b1dc05cd 266 _spiConnection->sendReceiveSpi(&_cs, _command, 2, &safety, 1);
hudakz 0:4b76b1dc05cd 267
hudakz 0:4b76b1dc05cd 268 errorTypes checkError = checkSafety(safety, _command[0], &_command[1], 1);
hudakz 0:4b76b1dc05cd 269 //
hudakz 0:4b76b1dc05cd 270
hudakz 0:4b76b1dc05cd 271 checkError = readStatus(readreg);
hudakz 0:4b76b1dc05cd 272 if (readreg & 0x0008) {
hudakz 0:4b76b1dc05cd 273 checkError = regularCrcUpdate();
hudakz 0:4b76b1dc05cd 274 }
hudakz 0:4b76b1dc05cd 275
hudakz 0:4b76b1dc05cd 276 return(checkError);
hudakz 0:4b76b1dc05cd 277 }
hudakz 0:4b76b1dc05cd 278
hudakz 0:4b76b1dc05cd 279 // end generic data transfer functions
hudakz 0:4b76b1dc05cd 280 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 281
hudakz 0:4b76b1dc05cd 282 // begin CRC functions
hudakz 0:4b76b1dc05cd 283 errorTypes TLE5012B::checkSafety(uint16_t safety, uint16_t command, uint16_t* readreg, uint16_t length)
hudakz 0:4b76b1dc05cd 284 {
hudakz 0:4b76b1dc05cd 285 volatile errorTypes errorCheck = NO_ERROR;
hudakz 0:4b76b1dc05cd 286 _safetyWord = safety;
hudakz 0:4b76b1dc05cd 287
hudakz 0:4b76b1dc05cd 288 if (!(_safetyWord & SYSTEM_ERROR_MASK)) {
hudakz 0:4b76b1dc05cd 289 errorCheck = SYSTEM_ERROR;
hudakz 0:4b76b1dc05cd 290
hudakz 0:4b76b1dc05cd 291 //resetSafety();
hudakz 0:4b76b1dc05cd 292 }
hudakz 0:4b76b1dc05cd 293 else
hudakz 0:4b76b1dc05cd 294 if (!(_safetyWord & INTERFACE_ERROR_MASK)) {
hudakz 0:4b76b1dc05cd 295 errorCheck = INTERFACE_ACCESS_ERROR;
hudakz 0:4b76b1dc05cd 296
hudakz 0:4b76b1dc05cd 297 //resetSafety();
hudakz 0:4b76b1dc05cd 298 }
hudakz 0:4b76b1dc05cd 299 else
hudakz 0:4b76b1dc05cd 300 if (!(_safetyWord & INV_ANGLE_ERROR_MASK)) {
hudakz 0:4b76b1dc05cd 301 errorCheck = INVALID_ANGLE_ERROR;
hudakz 0:4b76b1dc05cd 302
hudakz 0:4b76b1dc05cd 303 //resetSafety();
hudakz 0:4b76b1dc05cd 304 }
hudakz 0:4b76b1dc05cd 305 else {
hudakz 0:4b76b1dc05cd 306
hudakz 0:4b76b1dc05cd 307 //resetSafety();
hudakz 0:4b76b1dc05cd 308 uint16_t lengthOfTemp = length * 2 + 2;
hudakz 0:4b76b1dc05cd 309 uint8_t* temp = new uint8_t[lengthOfTemp];
hudakz 0:4b76b1dc05cd 310
hudakz 0:4b76b1dc05cd 311 temp[0] = getFirstByte(command);
hudakz 0:4b76b1dc05cd 312 temp[1] = getSecondByte(command);
hudakz 0:4b76b1dc05cd 313
hudakz 0:4b76b1dc05cd 314 for (uint16_t i = 0; i < length; i++) {
hudakz 0:4b76b1dc05cd 315 temp[2 + 2 * i] = getFirstByte(readreg[i]);
hudakz 0:4b76b1dc05cd 316 temp[2 + 2 * i + 1] = getSecondByte(readreg[i]);
hudakz 0:4b76b1dc05cd 317 }
hudakz 0:4b76b1dc05cd 318
hudakz 0:4b76b1dc05cd 319 uint8_t crcReceivedFinal = getSecondByte(safety);
hudakz 0:4b76b1dc05cd 320 uint8_t crc = crcCalc(temp, lengthOfTemp);
hudakz 0:4b76b1dc05cd 321
hudakz 0:4b76b1dc05cd 322 if (crc == crcReceivedFinal) {
hudakz 0:4b76b1dc05cd 323 errorCheck = NO_ERROR;
hudakz 0:4b76b1dc05cd 324 }
hudakz 0:4b76b1dc05cd 325 else {
hudakz 0:4b76b1dc05cd 326 errorCheck = CRC_ERROR;
hudakz 0:4b76b1dc05cd 327 resetSafety();
hudakz 0:4b76b1dc05cd 328 }
hudakz 0:4b76b1dc05cd 329
hudakz 0:4b76b1dc05cd 330 delete[] temp;
hudakz 0:4b76b1dc05cd 331 }
hudakz 0:4b76b1dc05cd 332
hudakz 0:4b76b1dc05cd 333 return(errorCheck);
hudakz 0:4b76b1dc05cd 334 }
hudakz 0:4b76b1dc05cd 335
hudakz 0:4b76b1dc05cd 336 /**
hudakz 0:4b76b1dc05cd 337 * @brief
hudakz 0:4b76b1dc05cd 338 * @note
hudakz 0:4b76b1dc05cd 339 * @param
hudakz 0:4b76b1dc05cd 340 * @retval
hudakz 0:4b76b1dc05cd 341 */
hudakz 0:4b76b1dc05cd 342 void TLE5012B::resetSafety()
hudakz 0:4b76b1dc05cd 343 {
hudakz 0:4b76b1dc05cd 344 uint16_t command = READ_SENSOR + SAFE_HIGH;
hudakz 0:4b76b1dc05cd 345 uint16_t receive[4];
hudakz 0:4b76b1dc05cd 346
hudakz 0:4b76b1dc05cd 347 triggerUpdate();
hudakz 0:4b76b1dc05cd 348 _spiConnection->sendReceiveSpi(&_cs, &command, 1, receive, 3);
hudakz 0:4b76b1dc05cd 349 }
hudakz 0:4b76b1dc05cd 350
hudakz 0:4b76b1dc05cd 351 /**
hudakz 0:4b76b1dc05cd 352 * @brief
hudakz 0:4b76b1dc05cd 353 * @note
hudakz 0:4b76b1dc05cd 354 * @param
hudakz 0:4b76b1dc05cd 355 * @retval
hudakz 0:4b76b1dc05cd 356 */
hudakz 0:4b76b1dc05cd 357 errorTypes TLE5012B::regularCrcUpdate()
hudakz 0:4b76b1dc05cd 358 {
hudakz 0:4b76b1dc05cd 359 readBlockCRC();
hudakz 0:4b76b1dc05cd 360
hudakz 0:4b76b1dc05cd 361 uint8_t temp[16];
hudakz 0:4b76b1dc05cd 362
hudakz 0:4b76b1dc05cd 363 for (uint8_t i = 0; i < CRC_NUM_REGISTERS; i++) {
hudakz 0:4b76b1dc05cd 364 temp[2 * i] = getFirstByte(_registers[i]);
hudakz 0:4b76b1dc05cd 365 temp[(2 * i) + 1] = getSecondByte(_registers[i]);
hudakz 0:4b76b1dc05cd 366 }
hudakz 0:4b76b1dc05cd 367
hudakz 0:4b76b1dc05cd 368 uint8_t crc = crcCalc(temp, 15);
hudakz 0:4b76b1dc05cd 369 uint16_t firstTempByte = (uint16_t) temp[14];
hudakz 0:4b76b1dc05cd 370 uint16_t secondTempByte = (uint16_t) crc;
hudakz 0:4b76b1dc05cd 371 uint16_t valToSend = (firstTempByte << 8) | secondTempByte;
hudakz 0:4b76b1dc05cd 372
hudakz 0:4b76b1dc05cd 373 _registers[7] = valToSend;
hudakz 0:4b76b1dc05cd 374
hudakz 0:4b76b1dc05cd 375 return(writeTempCoeffUpdate(valToSend));
hudakz 0:4b76b1dc05cd 376 }
hudakz 0:4b76b1dc05cd 377
hudakz 0:4b76b1dc05cd 378 // end CRC functions
hudakz 0:4b76b1dc05cd 379 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 380
hudakz 0:4b76b1dc05cd 381 // begin read functions
hudakz 0:4b76b1dc05cd 382 errorTypes TLE5012B::readBlockCRC()
hudakz 0:4b76b1dc05cd 383 {
hudakz 0:4b76b1dc05cd 384 _command[0] = READ_BLOCK_CRC;
hudakz 0:4b76b1dc05cd 385
hudakz 0:4b76b1dc05cd 386 uint16_t _registers[CRC_NUM_REGISTERS + 1] = { 0 }; // Number of CRC Registers + 1 Register for Safety word
hudakz 0:4b76b1dc05cd 387 //memset(_registers, 0, sizeof(_registers));
hudakz 0:4b76b1dc05cd 388
hudakz 0:4b76b1dc05cd 389 _spiConnection->sendReceiveSpi(&_cs, _command, 1, _registers, CRC_NUM_REGISTERS + 1);
hudakz 0:4b76b1dc05cd 390
hudakz 0:4b76b1dc05cd 391 errorTypes checkError = checkSafety(_registers[8], READ_BLOCK_CRC, _registers, 8);
hudakz 0:4b76b1dc05cd 392 resetSafety();
hudakz 0:4b76b1dc05cd 393 return(checkError);
hudakz 0:4b76b1dc05cd 394 }
hudakz 0:4b76b1dc05cd 395
hudakz 0:4b76b1dc05cd 396 /**
hudakz 0:4b76b1dc05cd 397 * @brief
hudakz 0:4b76b1dc05cd 398 * @note
hudakz 0:4b76b1dc05cd 399 * @param
hudakz 0:4b76b1dc05cd 400 * @retval
hudakz 0:4b76b1dc05cd 401 */
hudakz 0:4b76b1dc05cd 402 errorTypes TLE5012B::readStatus(uint16_t& data, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 403 {
hudakz 0:4b76b1dc05cd 404 return(readFromSensor(REG_STAT, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 405 }
hudakz 0:4b76b1dc05cd 406
hudakz 0:4b76b1dc05cd 407 /**
hudakz 0:4b76b1dc05cd 408 * @brief
hudakz 0:4b76b1dc05cd 409 * @note
hudakz 0:4b76b1dc05cd 410 * @param
hudakz 0:4b76b1dc05cd 411 * @retval
hudakz 0:4b76b1dc05cd 412 */
hudakz 0:4b76b1dc05cd 413 errorTypes TLE5012B::readActivationStatus(uint16_t& data, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 414 {
hudakz 0:4b76b1dc05cd 415 return(readFromSensor(REG_ACSTAT, data, upd, safe));
hudakz 0:4b76b1dc05cd 416 }
hudakz 0:4b76b1dc05cd 417
hudakz 0:4b76b1dc05cd 418 /**
hudakz 0:4b76b1dc05cd 419 * @brief
hudakz 0:4b76b1dc05cd 420 * @note
hudakz 0:4b76b1dc05cd 421 * @param
hudakz 0:4b76b1dc05cd 422 * @retval
hudakz 0:4b76b1dc05cd 423 */
hudakz 0:4b76b1dc05cd 424 errorTypes TLE5012B::readSIL(uint16_t& data)
hudakz 0:4b76b1dc05cd 425 {
hudakz 0:4b76b1dc05cd 426 return(readFromSensor(REG_SIL, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 427 }
hudakz 0:4b76b1dc05cd 428
hudakz 0:4b76b1dc05cd 429 /**
hudakz 0:4b76b1dc05cd 430 * @brief
hudakz 0:4b76b1dc05cd 431 * @note
hudakz 0:4b76b1dc05cd 432 * @param
hudakz 0:4b76b1dc05cd 433 * @retval
hudakz 0:4b76b1dc05cd 434 */
hudakz 0:4b76b1dc05cd 435 errorTypes TLE5012B::readIntMode1(uint16_t& data)
hudakz 0:4b76b1dc05cd 436 {
hudakz 0:4b76b1dc05cd 437 return(readFromSensor(REG_MOD_1, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 438 }
hudakz 0:4b76b1dc05cd 439
hudakz 0:4b76b1dc05cd 440 /**
hudakz 0:4b76b1dc05cd 441 * @brief
hudakz 0:4b76b1dc05cd 442 * @note
hudakz 0:4b76b1dc05cd 443 * @param
hudakz 0:4b76b1dc05cd 444 * @retval
hudakz 0:4b76b1dc05cd 445 */
hudakz 0:4b76b1dc05cd 446 errorTypes TLE5012B::readIntMode2(uint16_t& data)
hudakz 0:4b76b1dc05cd 447 {
hudakz 0:4b76b1dc05cd 448 return(readFromSensor(REG_MOD_2, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 449 }
hudakz 0:4b76b1dc05cd 450
hudakz 0:4b76b1dc05cd 451 /**
hudakz 0:4b76b1dc05cd 452 * @brief
hudakz 0:4b76b1dc05cd 453 * @note
hudakz 0:4b76b1dc05cd 454 * @param
hudakz 0:4b76b1dc05cd 455 * @retval
hudakz 0:4b76b1dc05cd 456 */
hudakz 0:4b76b1dc05cd 457 errorTypes TLE5012B::readIntMode3(uint16_t& data)
hudakz 0:4b76b1dc05cd 458 {
hudakz 0:4b76b1dc05cd 459 return(readFromSensor(REG_MOD_3, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 460 }
hudakz 0:4b76b1dc05cd 461
hudakz 0:4b76b1dc05cd 462 /**
hudakz 0:4b76b1dc05cd 463 * @brief
hudakz 0:4b76b1dc05cd 464 * @note
hudakz 0:4b76b1dc05cd 465 * @param
hudakz 0:4b76b1dc05cd 466 * @retval
hudakz 0:4b76b1dc05cd 467 */
hudakz 0:4b76b1dc05cd 468 errorTypes TLE5012B::readIntMode4(uint16_t& data)
hudakz 0:4b76b1dc05cd 469 {
hudakz 0:4b76b1dc05cd 470 return(readFromSensor(REG_MOD_4, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 471 }
hudakz 0:4b76b1dc05cd 472
hudakz 0:4b76b1dc05cd 473 /**
hudakz 0:4b76b1dc05cd 474 * @brief
hudakz 0:4b76b1dc05cd 475 * @note
hudakz 0:4b76b1dc05cd 476 * @param
hudakz 0:4b76b1dc05cd 477 * @retval
hudakz 0:4b76b1dc05cd 478 */
hudakz 0:4b76b1dc05cd 479 errorTypes TLE5012B::readOffsetX(uint16_t& data)
hudakz 0:4b76b1dc05cd 480 {
hudakz 0:4b76b1dc05cd 481 return(readFromSensor(REG_OFFX, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 482 }
hudakz 0:4b76b1dc05cd 483
hudakz 0:4b76b1dc05cd 484 /**
hudakz 0:4b76b1dc05cd 485 * @brief
hudakz 0:4b76b1dc05cd 486 * @note
hudakz 0:4b76b1dc05cd 487 * @param
hudakz 0:4b76b1dc05cd 488 * @retval
hudakz 0:4b76b1dc05cd 489 */
hudakz 0:4b76b1dc05cd 490 errorTypes TLE5012B::readOffsetY(uint16_t& data)
hudakz 0:4b76b1dc05cd 491 {
hudakz 0:4b76b1dc05cd 492 return(readFromSensor(REG_OFFY, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 493 }
hudakz 0:4b76b1dc05cd 494
hudakz 0:4b76b1dc05cd 495 /**
hudakz 0:4b76b1dc05cd 496 * @brief
hudakz 0:4b76b1dc05cd 497 * @note
hudakz 0:4b76b1dc05cd 498 * @param
hudakz 0:4b76b1dc05cd 499 * @retval
hudakz 0:4b76b1dc05cd 500 */
hudakz 0:4b76b1dc05cd 501 errorTypes TLE5012B::readSynch(uint16_t& data)
hudakz 0:4b76b1dc05cd 502 {
hudakz 0:4b76b1dc05cd 503 return(readFromSensor(REG_SYNCH, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 504 }
hudakz 0:4b76b1dc05cd 505
hudakz 0:4b76b1dc05cd 506 /**
hudakz 0:4b76b1dc05cd 507 * @brief
hudakz 0:4b76b1dc05cd 508 * @note
hudakz 0:4b76b1dc05cd 509 * @param
hudakz 0:4b76b1dc05cd 510 * @retval
hudakz 0:4b76b1dc05cd 511 */
hudakz 0:4b76b1dc05cd 512 errorTypes TLE5012B::readIFAB(uint16_t& data)
hudakz 0:4b76b1dc05cd 513 {
hudakz 0:4b76b1dc05cd 514 return(readFromSensor(REG_IFAB, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 515 }
hudakz 0:4b76b1dc05cd 516
hudakz 0:4b76b1dc05cd 517 /**
hudakz 0:4b76b1dc05cd 518 * @brief
hudakz 0:4b76b1dc05cd 519 * @note
hudakz 0:4b76b1dc05cd 520 * @param
hudakz 0:4b76b1dc05cd 521 * @retval
hudakz 0:4b76b1dc05cd 522 */
hudakz 0:4b76b1dc05cd 523 errorTypes TLE5012B::readTempCoeff(uint16_t& data)
hudakz 0:4b76b1dc05cd 524 {
hudakz 0:4b76b1dc05cd 525 return(readFromSensor(REG_TCO_Y, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 526 }
hudakz 0:4b76b1dc05cd 527
hudakz 0:4b76b1dc05cd 528 /**
hudakz 0:4b76b1dc05cd 529 * @brief
hudakz 0:4b76b1dc05cd 530 * @note
hudakz 0:4b76b1dc05cd 531 * @param
hudakz 0:4b76b1dc05cd 532 * @retval
hudakz 0:4b76b1dc05cd 533 */
hudakz 0:4b76b1dc05cd 534 errorTypes TLE5012B::readTempDMag(uint16_t& data)
hudakz 0:4b76b1dc05cd 535 {
hudakz 0:4b76b1dc05cd 536 return(readFromSensor(REG_D_MAG, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 537 }
hudakz 0:4b76b1dc05cd 538
hudakz 0:4b76b1dc05cd 539 /**
hudakz 0:4b76b1dc05cd 540 * @brief
hudakz 0:4b76b1dc05cd 541 * @note
hudakz 0:4b76b1dc05cd 542 * @param
hudakz 0:4b76b1dc05cd 543 * @retval
hudakz 0:4b76b1dc05cd 544 */
hudakz 0:4b76b1dc05cd 545 errorTypes TLE5012B::readTempIIFCnt(uint16_t& data)
hudakz 0:4b76b1dc05cd 546 {
hudakz 0:4b76b1dc05cd 547 return(readFromSensor(REG_IIF_CNT, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 548 }
hudakz 0:4b76b1dc05cd 549
hudakz 0:4b76b1dc05cd 550 /**
hudakz 0:4b76b1dc05cd 551 * @brief
hudakz 0:4b76b1dc05cd 552 * @note
hudakz 0:4b76b1dc05cd 553 * @param
hudakz 0:4b76b1dc05cd 554 * @retval
hudakz 0:4b76b1dc05cd 555 */
hudakz 0:4b76b1dc05cd 556 errorTypes TLE5012B::readTempRaw(uint16_t& data)
hudakz 0:4b76b1dc05cd 557 {
hudakz 0:4b76b1dc05cd 558 return(readFromSensor(REG_T_RAW, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 559 }
hudakz 0:4b76b1dc05cd 560
hudakz 0:4b76b1dc05cd 561 /**
hudakz 0:4b76b1dc05cd 562 * @brief
hudakz 0:4b76b1dc05cd 563 * @note
hudakz 0:4b76b1dc05cd 564 * @param
hudakz 0:4b76b1dc05cd 565 * @retval
hudakz 0:4b76b1dc05cd 566 */
hudakz 0:4b76b1dc05cd 567 errorTypes TLE5012B::readTempT25(uint16_t& data)
hudakz 0:4b76b1dc05cd 568 {
hudakz 0:4b76b1dc05cd 569 return(readFromSensor(REG_T25O, data, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 570 }
hudakz 0:4b76b1dc05cd 571
hudakz 0:4b76b1dc05cd 572 /**
hudakz 0:4b76b1dc05cd 573 * @brief
hudakz 0:4b76b1dc05cd 574 * @note
hudakz 0:4b76b1dc05cd 575 * @param
hudakz 0:4b76b1dc05cd 576 * @retval
hudakz 0:4b76b1dc05cd 577 */
hudakz 0:4b76b1dc05cd 578 errorTypes TLE5012B::readRawX(int16_t& data)
hudakz 0:4b76b1dc05cd 579 {
hudakz 0:4b76b1dc05cd 580 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 581 errorTypes status = readFromSensor(REG_ADC_X, rawData);
hudakz 0:4b76b1dc05cd 582
hudakz 0:4b76b1dc05cd 583 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 584 return(status);
hudakz 0:4b76b1dc05cd 585 }
hudakz 0:4b76b1dc05cd 586
hudakz 0:4b76b1dc05cd 587 data = rawData;
hudakz 0:4b76b1dc05cd 588 return(status);
hudakz 0:4b76b1dc05cd 589 }
hudakz 0:4b76b1dc05cd 590
hudakz 0:4b76b1dc05cd 591 /**
hudakz 0:4b76b1dc05cd 592 * @brief
hudakz 0:4b76b1dc05cd 593 * @note
hudakz 0:4b76b1dc05cd 594 * @param
hudakz 0:4b76b1dc05cd 595 * @retval
hudakz 0:4b76b1dc05cd 596 */
hudakz 0:4b76b1dc05cd 597 errorTypes TLE5012B::readRawY(int16_t& data)
hudakz 0:4b76b1dc05cd 598 {
hudakz 0:4b76b1dc05cd 599 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 600 errorTypes status = readFromSensor(REG_ADC_Y, rawData);
hudakz 0:4b76b1dc05cd 601
hudakz 0:4b76b1dc05cd 602 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 603 return(status);
hudakz 0:4b76b1dc05cd 604 }
hudakz 0:4b76b1dc05cd 605
hudakz 0:4b76b1dc05cd 606 data = rawData;
hudakz 0:4b76b1dc05cd 607 return(status);
hudakz 0:4b76b1dc05cd 608 }
hudakz 0:4b76b1dc05cd 609
hudakz 0:4b76b1dc05cd 610 // end read functions
hudakz 0:4b76b1dc05cd 611 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 612
hudakz 0:4b76b1dc05cd 613 // begin get functions
hudakz 0:4b76b1dc05cd 614 errorTypes TLE5012B::getAngleValue(double& angleValue)
hudakz 0:4b76b1dc05cd 615 {
hudakz 0:4b76b1dc05cd 616 int16_t rawAnglevalue = 0;
hudakz 0:4b76b1dc05cd 617
hudakz 0:4b76b1dc05cd 618 return(getAngleValue(angleValue, rawAnglevalue, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 619 }
hudakz 0:4b76b1dc05cd 620
hudakz 0:4b76b1dc05cd 621 /**
hudakz 0:4b76b1dc05cd 622 * @brief
hudakz 0:4b76b1dc05cd 623 * @note
hudakz 0:4b76b1dc05cd 624 * @param
hudakz 0:4b76b1dc05cd 625 * @retval
hudakz 0:4b76b1dc05cd 626 */
hudakz 0:4b76b1dc05cd 627 errorTypes TLE5012B::getAngleValue(double& angleValue, int16_t& rawAnglevalue, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 628 {
hudakz 0:4b76b1dc05cd 629 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 630 errorTypes status = readFromSensor(REG_AVAL, rawData, upd, safe);
hudakz 0:4b76b1dc05cd 631
hudakz 0:4b76b1dc05cd 632 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 633 return(status);
hudakz 0:4b76b1dc05cd 634 }
hudakz 0:4b76b1dc05cd 635
hudakz 0:4b76b1dc05cd 636 rawData = (rawData & (DELETE_BIT_15));
hudakz 0:4b76b1dc05cd 637
hudakz 0:4b76b1dc05cd 638 //check if the value received is positive or negative
hudakz 0:4b76b1dc05cd 639 if (rawData & CHECK_BIT_14) {
hudakz 0:4b76b1dc05cd 640 rawData = rawData - CHANGE_UINT_TO_INT_15;
hudakz 0:4b76b1dc05cd 641 }
hudakz 0:4b76b1dc05cd 642
hudakz 0:4b76b1dc05cd 643 rawAnglevalue = rawData;
hudakz 0:4b76b1dc05cd 644 angleValue = (ANGLE_360_VAL / POW_2_15) * ((double)rawAnglevalue);
hudakz 0:4b76b1dc05cd 645 return(status);
hudakz 0:4b76b1dc05cd 646 }
hudakz 0:4b76b1dc05cd 647
hudakz 0:4b76b1dc05cd 648 /**
hudakz 0:4b76b1dc05cd 649 * @brief
hudakz 0:4b76b1dc05cd 650 * @note
hudakz 0:4b76b1dc05cd 651 * @param
hudakz 0:4b76b1dc05cd 652 * @retval
hudakz 0:4b76b1dc05cd 653 */
hudakz 0:4b76b1dc05cd 654 errorTypes TLE5012B::getTemperature(double& temperature)
hudakz 0:4b76b1dc05cd 655 {
hudakz 0:4b76b1dc05cd 656 int16_t rawTemp = 0;
hudakz 0:4b76b1dc05cd 657
hudakz 0:4b76b1dc05cd 658 return(getTemperature(temperature, rawTemp, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 659 }
hudakz 0:4b76b1dc05cd 660
hudakz 0:4b76b1dc05cd 661 /**
hudakz 0:4b76b1dc05cd 662 * @brief
hudakz 0:4b76b1dc05cd 663 * @note
hudakz 0:4b76b1dc05cd 664 * @param
hudakz 0:4b76b1dc05cd 665 * @retval
hudakz 0:4b76b1dc05cd 666 */
hudakz 0:4b76b1dc05cd 667 errorTypes TLE5012B::getTemperature(double& temperature, int16_t& rawTemp, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 668 {
hudakz 0:4b76b1dc05cd 669 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 670 errorTypes status = readFromSensor(REG_FSYNC, rawData, upd, safe);
hudakz 0:4b76b1dc05cd 671
hudakz 0:4b76b1dc05cd 672 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 673 return(status);
hudakz 0:4b76b1dc05cd 674 }
hudakz 0:4b76b1dc05cd 675
hudakz 0:4b76b1dc05cd 676 rawData = (rawData & (DELETE_7BITS));
hudakz 0:4b76b1dc05cd 677
hudakz 0:4b76b1dc05cd 678 //check if the value received is positive or negative
hudakz 0:4b76b1dc05cd 679 if (rawData & CHECK_BIT_9) {
hudakz 0:4b76b1dc05cd 680 rawData = rawData - CHANGE_UNIT_TO_INT_9;
hudakz 0:4b76b1dc05cd 681 }
hudakz 0:4b76b1dc05cd 682
hudakz 0:4b76b1dc05cd 683 rawTemp = rawData;
hudakz 0:4b76b1dc05cd 684 temperature = (rawTemp + TEMP_OFFSET) / (TEMP_DIV);
hudakz 0:4b76b1dc05cd 685 return(status);
hudakz 0:4b76b1dc05cd 686 }
hudakz 0:4b76b1dc05cd 687
hudakz 0:4b76b1dc05cd 688 /**
hudakz 0:4b76b1dc05cd 689 * @brief
hudakz 0:4b76b1dc05cd 690 * @note
hudakz 0:4b76b1dc05cd 691 * @param
hudakz 0:4b76b1dc05cd 692 * @retval
hudakz 0:4b76b1dc05cd 693 */
hudakz 0:4b76b1dc05cd 694 errorTypes TLE5012B::getNumRevolutions(int16_t& numRev, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 695 {
hudakz 0:4b76b1dc05cd 696 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 697 errorTypes status = readFromSensor(REG_AREV, rawData, upd, safe);
hudakz 0:4b76b1dc05cd 698
hudakz 0:4b76b1dc05cd 699 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 700 return(status);
hudakz 0:4b76b1dc05cd 701 }
hudakz 0:4b76b1dc05cd 702
hudakz 0:4b76b1dc05cd 703 rawData = (rawData & (DELETE_7BITS));
hudakz 0:4b76b1dc05cd 704
hudakz 0:4b76b1dc05cd 705 // //check if the value received is positive or negative
hudakz 0:4b76b1dc05cd 706 if (rawData & CHECK_BIT_9) {
hudakz 0:4b76b1dc05cd 707 rawData = rawData - CHANGE_UNIT_TO_INT_9;
hudakz 0:4b76b1dc05cd 708 }
hudakz 0:4b76b1dc05cd 709
hudakz 0:4b76b1dc05cd 710 numRev = rawData;
hudakz 0:4b76b1dc05cd 711 return(status);
hudakz 0:4b76b1dc05cd 712 }
hudakz 0:4b76b1dc05cd 713
hudakz 0:4b76b1dc05cd 714 /**
hudakz 0:4b76b1dc05cd 715 * @brief
hudakz 0:4b76b1dc05cd 716 * @note
hudakz 0:4b76b1dc05cd 717 * @param
hudakz 0:4b76b1dc05cd 718 * @retval
hudakz 0:4b76b1dc05cd 719 */
hudakz 0:4b76b1dc05cd 720 errorTypes TLE5012B::getAngleSpeed(double& finalAngleSpeed)
hudakz 0:4b76b1dc05cd 721 {
hudakz 0:4b76b1dc05cd 722 int16_t rawSpeed = 0;
hudakz 0:4b76b1dc05cd 723
hudakz 0:4b76b1dc05cd 724 return(getAngleSpeed(finalAngleSpeed, rawSpeed, UPD_LOW, SAFE_HIGH));
hudakz 0:4b76b1dc05cd 725 }
hudakz 0:4b76b1dc05cd 726
hudakz 0:4b76b1dc05cd 727 /**
hudakz 0:4b76b1dc05cd 728 * @brief
hudakz 0:4b76b1dc05cd 729 * @note
hudakz 0:4b76b1dc05cd 730 * @param
hudakz 0:4b76b1dc05cd 731 * @retval
hudakz 0:4b76b1dc05cd 732 */
hudakz 0:4b76b1dc05cd 733 errorTypes TLE5012B::getAngleSpeed(double& finalAngleSpeed, int16_t& rawSpeed, updTypes upd, safetyTypes safe)
hudakz 0:4b76b1dc05cd 734 {
hudakz 0:4b76b1dc05cd 735 int8_t numOfData = 0x5;
hudakz 0:4b76b1dc05cd 736 uint16_t* rawData = new uint16_t[numOfData];
hudakz 0:4b76b1dc05cd 737 errorTypes status = readMoreRegisters(REG_ASPD + numOfData, rawData, upd, safe);
hudakz 0:4b76b1dc05cd 738
hudakz 0:4b76b1dc05cd 739 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 740 return(status);
hudakz 0:4b76b1dc05cd 741 }
hudakz 0:4b76b1dc05cd 742
hudakz 0:4b76b1dc05cd 743 // Prepare raw speed
hudakz 0:4b76b1dc05cd 744 rawSpeed = rawData[0];
hudakz 0:4b76b1dc05cd 745 rawSpeed = (rawSpeed & (DELETE_BIT_15));
hudakz 0:4b76b1dc05cd 746
hudakz 0:4b76b1dc05cd 747 //check if the value received is positive or negative
hudakz 0:4b76b1dc05cd 748 if (rawSpeed & CHECK_BIT_14) {
hudakz 0:4b76b1dc05cd 749 rawSpeed = rawSpeed - CHANGE_UINT_TO_INT_15;
hudakz 0:4b76b1dc05cd 750 }
hudakz 0:4b76b1dc05cd 751
hudakz 0:4b76b1dc05cd 752 // Prepare firMDVal
hudakz 0:4b76b1dc05cd 753 uint16_t firMDVal = rawData[3];
hudakz 0:4b76b1dc05cd 754
hudakz 0:4b76b1dc05cd 755 firMDVal >>= 14;
hudakz 0:4b76b1dc05cd 756
hudakz 0:4b76b1dc05cd 757 // Prepare intMode2Prediction
hudakz 0:4b76b1dc05cd 758 uint16_t intMode2Prediction = rawData[5];
hudakz 0:4b76b1dc05cd 759
hudakz 0:4b76b1dc05cd 760 if (intMode2Prediction & 0x0004) {
hudakz 0:4b76b1dc05cd 761 intMode2Prediction = 3;
hudakz 0:4b76b1dc05cd 762 }
hudakz 0:4b76b1dc05cd 763 else {
hudakz 0:4b76b1dc05cd 764 intMode2Prediction = 2;
hudakz 0:4b76b1dc05cd 765 }
hudakz 0:4b76b1dc05cd 766
hudakz 0:4b76b1dc05cd 767 // Prepare angle range
hudakz 0:4b76b1dc05cd 768 uint16_t rawAngleRange = rawData[5];
hudakz 0:4b76b1dc05cd 769
hudakz 0:4b76b1dc05cd 770 rawAngleRange &= GET_BIT_14_4;
hudakz 0:4b76b1dc05cd 771 rawAngleRange >>= 4;
hudakz 0:4b76b1dc05cd 772
hudakz 0:4b76b1dc05cd 773 double angleRange = ANGLE_360_VAL * (POW_2_7 / (double)(rawAngleRange));
hudakz 0:4b76b1dc05cd 774
hudakz 0:4b76b1dc05cd 775 //checks the value of fir_MD according to which the value in the calculation of the speed will be determined
hudakz 0:4b76b1dc05cd 776
hudakz 0:4b76b1dc05cd 777 //according to if prediction is enabled then, the formula for speed changes
hudakz 0:4b76b1dc05cd 778 finalAngleSpeed = calculateAngleSpeed(angleRange, rawSpeed, firMDVal, intMode2Prediction);
hudakz 0:4b76b1dc05cd 779 delete[] rawData;
hudakz 0:4b76b1dc05cd 780 return(status);
hudakz 0:4b76b1dc05cd 781 }
hudakz 0:4b76b1dc05cd 782
hudakz 0:4b76b1dc05cd 783 /**
hudakz 0:4b76b1dc05cd 784 * @brief
hudakz 0:4b76b1dc05cd 785 * @note
hudakz 0:4b76b1dc05cd 786 * @param
hudakz 0:4b76b1dc05cd 787 * @retval
hudakz 0:4b76b1dc05cd 788 */
hudakz 0:4b76b1dc05cd 789 errorTypes TLE5012B::getAngleRange(double& angleRange)
hudakz 0:4b76b1dc05cd 790 {
hudakz 0:4b76b1dc05cd 791 uint16_t rawData = 0;
hudakz 0:4b76b1dc05cd 792 errorTypes status = readIntMode2(rawData);
hudakz 0:4b76b1dc05cd 793
hudakz 0:4b76b1dc05cd 794 if (status != NO_ERROR) {
hudakz 0:4b76b1dc05cd 795 return(status);
hudakz 0:4b76b1dc05cd 796 }
hudakz 0:4b76b1dc05cd 797
hudakz 0:4b76b1dc05cd 798 //Angle Range is stored in bytes 14 - 4, so you have to do this bit shifting to get the right value
hudakz 0:4b76b1dc05cd 799 rawData &= GET_BIT_14_4;
hudakz 0:4b76b1dc05cd 800 rawData >>= 4;
hudakz 0:4b76b1dc05cd 801 angleRange = ANGLE_360_VAL * (POW_2_7 / (double)(rawData));
hudakz 0:4b76b1dc05cd 802 return(status);
hudakz 0:4b76b1dc05cd 803 }
hudakz 0:4b76b1dc05cd 804
hudakz 0:4b76b1dc05cd 805 // end get functions
hudakz 0:4b76b1dc05cd 806 //-----------------------------------------------------------------------------
hudakz 0:4b76b1dc05cd 807
hudakz 0:4b76b1dc05cd 808 // begin write functions
hudakz 0:4b76b1dc05cd 809 errorTypes TLE5012B::writeIntMode2(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 810 {
hudakz 0:4b76b1dc05cd 811 return(writeToSensor(REG_MOD_2, dataToWrite, true));
hudakz 0:4b76b1dc05cd 812 }
hudakz 0:4b76b1dc05cd 813
hudakz 0:4b76b1dc05cd 814 /**
hudakz 0:4b76b1dc05cd 815 * @brief
hudakz 0:4b76b1dc05cd 816 * @note
hudakz 0:4b76b1dc05cd 817 * @param
hudakz 0:4b76b1dc05cd 818 * @retval
hudakz 0:4b76b1dc05cd 819 */
hudakz 0:4b76b1dc05cd 820 errorTypes TLE5012B::writeIntMode3(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 821 {
hudakz 0:4b76b1dc05cd 822 return(writeToSensor(REG_MOD_3, dataToWrite, true));
hudakz 0:4b76b1dc05cd 823 }
hudakz 0:4b76b1dc05cd 824
hudakz 0:4b76b1dc05cd 825 /**
hudakz 0:4b76b1dc05cd 826 * @brief
hudakz 0:4b76b1dc05cd 827 * @note
hudakz 0:4b76b1dc05cd 828 * @param
hudakz 0:4b76b1dc05cd 829 * @retval
hudakz 0:4b76b1dc05cd 830 */
hudakz 0:4b76b1dc05cd 831 errorTypes TLE5012B::writeOffsetX(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 832 {
hudakz 0:4b76b1dc05cd 833 return(writeToSensor(REG_OFFX, dataToWrite, true));
hudakz 0:4b76b1dc05cd 834 }
hudakz 0:4b76b1dc05cd 835
hudakz 0:4b76b1dc05cd 836 /**
hudakz 0:4b76b1dc05cd 837 * @brief
hudakz 0:4b76b1dc05cd 838 * @note
hudakz 0:4b76b1dc05cd 839 * @param
hudakz 0:4b76b1dc05cd 840 * @retval
hudakz 0:4b76b1dc05cd 841 */
hudakz 0:4b76b1dc05cd 842 errorTypes TLE5012B::writeOffsetY(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 843 {
hudakz 0:4b76b1dc05cd 844 return(writeToSensor(REG_OFFY, dataToWrite, true));
hudakz 0:4b76b1dc05cd 845 }
hudakz 0:4b76b1dc05cd 846
hudakz 0:4b76b1dc05cd 847 /**
hudakz 0:4b76b1dc05cd 848 * @brief
hudakz 0:4b76b1dc05cd 849 * @note
hudakz 0:4b76b1dc05cd 850 * @param
hudakz 0:4b76b1dc05cd 851 * @retval
hudakz 0:4b76b1dc05cd 852 */
hudakz 0:4b76b1dc05cd 853 errorTypes TLE5012B::writeSynch(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 854 {
hudakz 0:4b76b1dc05cd 855 return(writeToSensor(REG_SYNCH, dataToWrite, true));
hudakz 0:4b76b1dc05cd 856 }
hudakz 0:4b76b1dc05cd 857
hudakz 0:4b76b1dc05cd 858 /**
hudakz 0:4b76b1dc05cd 859 * @brief
hudakz 0:4b76b1dc05cd 860 * @note
hudakz 0:4b76b1dc05cd 861 * @param
hudakz 0:4b76b1dc05cd 862 * @retval
hudakz 0:4b76b1dc05cd 863 */
hudakz 0:4b76b1dc05cd 864 errorTypes TLE5012B::writeIFAB(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 865 {
hudakz 0:4b76b1dc05cd 866 return(writeToSensor(REG_IFAB, dataToWrite, true));
hudakz 0:4b76b1dc05cd 867 }
hudakz 0:4b76b1dc05cd 868
hudakz 0:4b76b1dc05cd 869 /**
hudakz 0:4b76b1dc05cd 870 * @brief
hudakz 0:4b76b1dc05cd 871 * @note
hudakz 0:4b76b1dc05cd 872 * @param
hudakz 0:4b76b1dc05cd 873 * @retval
hudakz 0:4b76b1dc05cd 874 */
hudakz 0:4b76b1dc05cd 875 errorTypes TLE5012B::writeIntMode4(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 876 {
hudakz 0:4b76b1dc05cd 877 return(writeToSensor(REG_MOD_4, dataToWrite, true));
hudakz 0:4b76b1dc05cd 878 }
hudakz 0:4b76b1dc05cd 879
hudakz 0:4b76b1dc05cd 880 /**
hudakz 0:4b76b1dc05cd 881 * @brief
hudakz 0:4b76b1dc05cd 882 * @note
hudakz 0:4b76b1dc05cd 883 * @param
hudakz 0:4b76b1dc05cd 884 * @retval
hudakz 0:4b76b1dc05cd 885 */
hudakz 0:4b76b1dc05cd 886 errorTypes TLE5012B::writeTempCoeff(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 887 {
hudakz 0:4b76b1dc05cd 888 return(writeToSensor(REG_TCO_Y, dataToWrite, true));
hudakz 0:4b76b1dc05cd 889 }
hudakz 0:4b76b1dc05cd 890
hudakz 0:4b76b1dc05cd 891 /**
hudakz 0:4b76b1dc05cd 892 * @brief
hudakz 0:4b76b1dc05cd 893 * @note
hudakz 0:4b76b1dc05cd 894 * @param
hudakz 0:4b76b1dc05cd 895 * @retval
hudakz 0:4b76b1dc05cd 896 */
hudakz 0:4b76b1dc05cd 897 errorTypes TLE5012B::writeActivationStatus(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 898 {
hudakz 0:4b76b1dc05cd 899 return(writeToSensor(REG_ACSTAT, dataToWrite, false));
hudakz 0:4b76b1dc05cd 900 }
hudakz 0:4b76b1dc05cd 901
hudakz 0:4b76b1dc05cd 902 /**
hudakz 0:4b76b1dc05cd 903 * @brief
hudakz 0:4b76b1dc05cd 904 * @note
hudakz 0:4b76b1dc05cd 905 * @param
hudakz 0:4b76b1dc05cd 906 * @retval
hudakz 0:4b76b1dc05cd 907 */
hudakz 0:4b76b1dc05cd 908 errorTypes TLE5012B::writeIntMode1(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 909 {
hudakz 0:4b76b1dc05cd 910 return(writeToSensor(REG_MOD_1, dataToWrite, false));
hudakz 0:4b76b1dc05cd 911 }
hudakz 0:4b76b1dc05cd 912
hudakz 0:4b76b1dc05cd 913 /**
hudakz 0:4b76b1dc05cd 914 * @brief
hudakz 0:4b76b1dc05cd 915 * @note
hudakz 0:4b76b1dc05cd 916 * @param
hudakz 0:4b76b1dc05cd 917 * @retval
hudakz 0:4b76b1dc05cd 918 */
hudakz 0:4b76b1dc05cd 919 errorTypes TLE5012B::writeSIL(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 920 {
hudakz 0:4b76b1dc05cd 921 return(writeToSensor(REG_SIL, dataToWrite, false));
hudakz 0:4b76b1dc05cd 922 }
hudakz 0:4b76b1dc05cd 923
hudakz 0:4b76b1dc05cd 924 /**
hudakz 0:4b76b1dc05cd 925 * @brief
hudakz 0:4b76b1dc05cd 926 * @note
hudakz 0:4b76b1dc05cd 927 * @param
hudakz 0:4b76b1dc05cd 928 * @retval
hudakz 0:4b76b1dc05cd 929 */
hudakz 0:4b76b1dc05cd 930 errorTypes TLE5012B::writeSlaveNumber(uint16_t dataToWrite)
hudakz 0:4b76b1dc05cd 931 {
hudakz 0:4b76b1dc05cd 932 return(writeToSensor(WRITE_SENSOR, dataToWrite, false));
hudakz 0:4b76b1dc05cd 933 }
hudakz 0:4b76b1dc05cd 934
hudakz 0:4b76b1dc05cd 935 // end write functions