Driver for the HSCDTD008A Geomagnetic Sensor.

Dependents:   HSCDTD008A_Hello

Committer:
hudakz
Date:
Sun Jun 20 13:55:42 2021 +0000
Revision:
0:ccf912737de7
Child:
1:b90695c17177
Driver for the HSCDTD008A Geomagnetic Sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:ccf912737de7 1 /*
hudakz 0:ccf912737de7 2 * Copyright (c) 2020 Zoltan Hudak <hudakz@outlook.com>
hudakz 0:ccf912737de7 3 * All rights reserved.
hudakz 0:ccf912737de7 4 *
hudakz 0:ccf912737de7 5 * This program is free software: you can redistribute it and/or modify
hudakz 0:ccf912737de7 6 * it under the terms of the GNU General Public License as published by
hudakz 0:ccf912737de7 7 * the Free Software Foundation, either version 3 of the License, or
hudakz 0:ccf912737de7 8 * (at your option) any later version.
hudakz 0:ccf912737de7 9 *
hudakz 0:ccf912737de7 10 * This program is distributed in the hope that it will be useful,
hudakz 0:ccf912737de7 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 0:ccf912737de7 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 0:ccf912737de7 13 * GNU General Public License for more details.
hudakz 0:ccf912737de7 14 *
hudakz 0:ccf912737de7 15 * You should have received a copy of the GNU General Public License
hudakz 0:ccf912737de7 16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
hudakz 0:ccf912737de7 17 */
hudakz 0:ccf912737de7 18
hudakz 0:ccf912737de7 19 #ifndef HSCDTD008A_H
hudakz 0:ccf912737de7 20 #define HSCDTD008A_H
hudakz 0:ccf912737de7 21
hudakz 0:ccf912737de7 22 #include "mbed.h"
hudakz 0:ccf912737de7 23
hudakz 0:ccf912737de7 24 #define RANGE (2.4 + 2.4) // mT (+/- 2.4 mT)
hudakz 0:ccf912737de7 25 #define RESOL 1024 // resolution = 1024 bit
hudakz 0:ccf912737de7 26
hudakz 0:ccf912737de7 27 /*
hudakz 0:ccf912737de7 28 * Status Register (STAT)
hudakz 0:ccf912737de7 29 */
hudakz 0:ccf912737de7 30
hudakz 0:ccf912737de7 31 // (Read Only)
hudakz 0:ccf912737de7 32 #define DRDY 6 // Data Ready Detection
hudakz 0:ccf912737de7 33 #define DOR 5 // Data Overrun Detection
hudakz 0:ccf912737de7 34 #define FFU 2 // FIFO full alarm
hudakz 0:ccf912737de7 35 #define TRDY 1 // Temperature ready
hudakz 0:ccf912737de7 36 #define ORDY 0 // Offset ready
hudakz 0:ccf912737de7 37
hudakz 0:ccf912737de7 38 /*
hudakz 0:ccf912737de7 39 * FIFO Pointer Status Register (FFPT).
hudakz 0:ccf912737de7 40 */
hudakz 0:ccf912737de7 41
hudakz 0:ccf912737de7 42 // (Read Only)
hudakz 0:ccf912737de7 43 #define FP (0b00001111) // Number of data in FIFO : 0 - 8
hudakz 0:ccf912737de7 44
hudakz 0:ccf912737de7 45 /*
hudakz 0:ccf912737de7 46 * Control 1 Register (CTRL1)
hudakz 0:ccf912737de7 47 */
hudakz 0:ccf912737de7 48
hudakz 0:ccf912737de7 49 // (Write/Read)
hudakz 0:ccf912737de7 50 #define PC 7 // Power Mode Control 0 = Stand-by Mode (Default), 1 = Active Mode
hudakz 0:ccf912737de7 51 #define ODR 3 // Output Data Rate Control in Normal State 00 = 0.5 Hz, 01 = 10Hz (Default), 10 = 20Hz, 11 = 100Hz
hudakz 0:ccf912737de7 52 #define FS 1 // State Control in Active Mode 0 = Normal State, 1 = Force State (Default)
hudakz 0:ccf912737de7 53
hudakz 0:ccf912737de7 54 /*
hudakz 0:ccf912737de7 55 * Control 2 Register (CTRL2)
hudakz 0:ccf912737de7 56 */
hudakz 0:ccf912737de7 57
hudakz 0:ccf912737de7 58 // - When a CTRL2 register value was changed during the measurement,
hudakz 0:ccf912737de7 59 // The contents of the change are reflected after measurement.
hudakz 0:ccf912737de7 60 // (Write/Read)
hudakz 0:ccf912737de7 61 #define AVG 7 // Must be used default setting. 0 = (Default)
hudakz 0:ccf912737de7 62 #define FCO 6 // Data storage method at FIFO. 0 = Direct (Default) , 1 = Comparison
hudakz 0:ccf912737de7 63 #define AOR 5 // Choice of method of data Comparison at FIFO. 0 = OR(Default) , 1 = AND
hudakz 0:ccf912737de7 64 #define FF 4 // FIFO Enable. 0 = Disable (Default) , 1 = Enable
hudakz 0:ccf912737de7 65 #define DEN 3 // Data Ready Function Control Enable. 0 = Disabled (Default), 1 = Enabled
hudakz 0:ccf912737de7 66 #define DRP 2 // DRDY signal active level control. 0 = ACTIVE LOW, 1 = ACTIVE HIGH (Default)
hudakz 0:ccf912737de7 67 #define DTS 1 // Must be used default setting. 0 = (Default)
hudakz 0:ccf912737de7 68 #define DOS 0 // Must be used default setting. 0 = (Default)
hudakz 0:ccf912737de7 69
hudakz 0:ccf912737de7 70 /*
hudakz 0:ccf912737de7 71 * Control 3 Register (CTRL3)
hudakz 0:ccf912737de7 72 */
hudakz 0:ccf912737de7 73
hudakz 0:ccf912737de7 74 // - Bit control at the same time is prohibited.
hudakz 0:ccf912737de7 75 // - Priority of this register is MSB.
hudakz 0:ccf912737de7 76 // (Write/Read)
hudakz 0:ccf912737de7 77 #define SRST 7 // Soft Reset Control Enable. 0 = No Action (Default), 1 = Soft Reset, Note: return to zero after soft reset.
hudakz 0:ccf912737de7 78 #define FRC 6 // Start to Measure in Force State. 0 = No Action (Default), 1 = Measurement Start, Note: return to zero after measurement.
hudakz 0:ccf912737de7 79 #define STC 4 // Self Test Control Enable. 0 = No Action (Default), 1 = Set parameters to Self Test Response (STB) register., Note: return to zero immediately.
hudakz 0:ccf912737de7 80 #define TCS 1 // Start to Measure Temperature in Active Mode. 0 = No Action (Default), 1 = Measurement Start
hudakz 0:ccf912737de7 81 #define OCL 0 // Start to Calibrate Offset in Active Mode. 0 = No Action (Default), 1 = Action
hudakz 0:ccf912737de7 82
hudakz 0:ccf912737de7 83 /*
hudakz 0:ccf912737de7 84 * Control 4 Register (CTRL4)
hudakz 0:ccf912737de7 85 */
hudakz 0:ccf912737de7 86
hudakz 0:ccf912737de7 87 // - When a CTRL4 register value was changed during the measurement,
hudakz 0:ccf912737de7 88 // The contents of the change are reflected after measurement.
hudakz 0:ccf912737de7 89 #define MMD 6 // Must be used default setting. 10 = (Default)
hudakz 0:ccf912737de7 90 #define RS 4 // Set Dynamic range of output data. 0 = 14 bit signed value (-8192 to +8191) (Default), 1 = 15 bit signed value (-16384 to +16383)
hudakz 0:ccf912737de7 91 #define AS 3 // Must be used default setting. 0 = (Default)
hudakz 0:ccf912737de7 92 //
hudakz 0:ccf912737de7 93 //
hudakz 0:ccf912737de7 94 #define OK 0
hudakz 0:ccf912737de7 95 #define ERROR -1
hudakz 0:ccf912737de7 96
hudakz 0:ccf912737de7 97 // Function prototypes
hudakz 0:ccf912737de7 98 void printBinary(const unsigned char val);
hudakz 0:ccf912737de7 99
hudakz 0:ccf912737de7 100 class HSCDTD008A
hudakz 0:ccf912737de7 101 {
hudakz 0:ccf912737de7 102 public:
hudakz 0:ccf912737de7 103 HSCDTD008A(PinName sda, PinName scl, PinName drdy = NC, uint8_t addr = 0x0C);
hudakz 0:ccf912737de7 104 int16_t toInt16(uint16_t word);
hudakz 0:ccf912737de7 105 void standbyMode();
hudakz 0:ccf912737de7 106 void normalMode(uint8_t odr = 0b01, bool enableDataReady = false);
hudakz 0:ccf912737de7 107 void forcedMode();
hudakz 0:ccf912737de7 108 void softReset();
hudakz 0:ccf912737de7 109 uint8_t selftest();
hudakz 0:ccf912737de7 110 void calibrateOffsets();
hudakz 0:ccf912737de7 111 void setDriftOffsetX(uint16_t val);
hudakz 0:ccf912737de7 112 void setDriftOffsetY(uint16_t val);
hudakz 0:ccf912737de7 113 void setDriftOffsetZ(uint16_t val);
hudakz 0:ccf912737de7 114 void compensateTemp();
hudakz 0:ccf912737de7 115 void enableFifo();
hudakz 0:ccf912737de7 116 void disableFifo();
hudakz 0:ccf912737de7 117 uint8_t getFifoPointer();
hudakz 0:ccf912737de7 118 bool isFifoFull();
hudakz 0:ccf912737de7 119 bool isFifoOverrun();
hudakz 0:ccf912737de7 120 bool isDataReady();
hudakz 0:ccf912737de7 121 bool getResolution();
hudakz 0:ccf912737de7 122 void setResolution(bool fifteen_bits);
hudakz 0:ccf912737de7 123 uint8_t measure();
hudakz 0:ccf912737de7 124 void readData();
hudakz 0:ccf912737de7 125 float x();
hudakz 0:ccf912737de7 126 float y();
hudakz 0:ccf912737de7 127 float z();
hudakz 0:ccf912737de7 128 float bearing();
hudakz 0:ccf912737de7 129 private:
hudakz 0:ccf912737de7 130 I2C* _i2c;
hudakz 0:ccf912737de7 131 InterruptIn _drdy;
hudakz 0:ccf912737de7 132 const uint8_t _addr;
hudakz 0:ccf912737de7 133 uint16_t _x;
hudakz 0:ccf912737de7 134 uint16_t _y;
hudakz 0:ccf912737de7 135 uint16_t _z;
hudakz 0:ccf912737de7 136 Thread _thread;
hudakz 0:ccf912737de7 137 EventQueue _eventQueue;
hudakz 0:ccf912737de7 138 };
hudakz 0:ccf912737de7 139 #endif // HSCDTD008A_H