Committer:
ssozonoff
Date:
Fri Apr 29 22:10:27 2011 +0000
Revision:
0:5b09476278da
Child:
1:bdf678f27614
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ssozonoff 0:5b09476278da 1 /**
ssozonoff 0:5b09476278da 2 * @author Aaron Berk
ssozonoff 0:5b09476278da 3 * @author Serge Sozonoff
ssozonoff 0:5b09476278da 4 * Based on the work of Aaron Berk for the HMC6352
ssozonoff 0:5b09476278da 5 *
ssozonoff 0:5b09476278da 6 * @section LICENSE
ssozonoff 0:5b09476278da 7 *
ssozonoff 0:5b09476278da 8 * Copyright (c) 2010 ARM Limited
ssozonoff 0:5b09476278da 9 *
ssozonoff 0:5b09476278da 10 * Permission is hereby granted, free of charge, to any person obtaining a copy
ssozonoff 0:5b09476278da 11 * of this software and associated documentation files (the "Software"), to deal
ssozonoff 0:5b09476278da 12 * in the Software without restriction, including without limitation the rights
ssozonoff 0:5b09476278da 13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ssozonoff 0:5b09476278da 14 * copies of the Software, and to permit persons to whom the Software is
ssozonoff 0:5b09476278da 15 * furnished to do so, subject to the following conditions:
ssozonoff 0:5b09476278da 16 *
ssozonoff 0:5b09476278da 17 * The above copyright notice and this permission notice shall be included in
ssozonoff 0:5b09476278da 18 * all copies or substantial portions of the Software.
ssozonoff 0:5b09476278da 19 *
ssozonoff 0:5b09476278da 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ssozonoff 0:5b09476278da 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ssozonoff 0:5b09476278da 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ssozonoff 0:5b09476278da 23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ssozonoff 0:5b09476278da 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ssozonoff 0:5b09476278da 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ssozonoff 0:5b09476278da 26 * THE SOFTWARE.
ssozonoff 0:5b09476278da 27 *
ssozonoff 0:5b09476278da 28 * @section DESCRIPTION
ssozonoff 0:5b09476278da 29 *
ssozonoff 0:5b09476278da 30 * Honeywell HMC6343 digital compass.
ssozonoff 0:5b09476278da 31 *
ssozonoff 0:5b09476278da 32 * Datasheet:
ssozonoff 0:5b09476278da 33 *
ssozonoff 0:5b09476278da 34 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6343.pdf
ssozonoff 0:5b09476278da 35 */
ssozonoff 0:5b09476278da 36
ssozonoff 0:5b09476278da 37 #ifndef HMC6343_H
ssozonoff 0:5b09476278da 38 #define HMC6343_H
ssozonoff 0:5b09476278da 39
ssozonoff 0:5b09476278da 40 /**
ssozonoff 0:5b09476278da 41 * Includes
ssozonoff 0:5b09476278da 42 */
ssozonoff 0:5b09476278da 43 #include "mbed.h"
ssozonoff 0:5b09476278da 44
ssozonoff 0:5b09476278da 45 /**
ssozonoff 0:5b09476278da 46 * Defines
ssozonoff 0:5b09476278da 47 */
ssozonoff 0:5b09476278da 48 #define HMC6343_I2C_ADDRESS 0x32 >> 1 //7-bit address
ssozonoff 0:5b09476278da 49
ssozonoff 0:5b09476278da 50 //Commands.
ssozonoff 0:5b09476278da 51 #define HMC6343_EEPROM_WRITE 0xF1
ssozonoff 0:5b09476278da 52 #define HMC6343_EEPROM_READ 0xE1
ssozonoff 0:5b09476278da 53 #define HMC6343_ENTER_SLEEP 0x83
ssozonoff 0:5b09476278da 54 #define HMC6343_EXIT_SLEEP 0x84
ssozonoff 0:5b09476278da 55 #define HMC6343_ENTER_STANDBY 0x76
ssozonoff 0:5b09476278da 56 #define HMC6343_ENTER_RUN 0x75
ssozonoff 0:5b09476278da 57 #define HMC6343_RESET 0x82
ssozonoff 0:5b09476278da 58 #define HMC6343_ENTER_CALIB 0x71
ssozonoff 0:5b09476278da 59 #define HMC6343_EXIT_CALIB 0x7E
ssozonoff 0:5b09476278da 60 #define HMC6343_GET_ACCEL_DATA 0x40
ssozonoff 0:5b09476278da 61 #define HMC6343_GET_MAG_DATA 0x45
ssozonoff 0:5b09476278da 62 #define HMC6343_GET_HEADING_DATA 0x50
ssozonoff 0:5b09476278da 63 #define HMC6343_GET_TILT_DATA 0x55
ssozonoff 0:5b09476278da 64 #define HMC6343_GET_HEADING_DATA 0x50
ssozonoff 0:5b09476278da 65 #define HMC6343_SET_XFWD_PLS_ZUP 0x72
ssozonoff 0:5b09476278da 66 #define HMC6343_SET_XFWD_YUP 0x73
ssozonoff 0:5b09476278da 67 #define HMC6343_SET_ZFWD_NEG_XUP 0x74
ssozonoff 0:5b09476278da 68 #define HMC6343_GET_OPMODE 0x65
ssozonoff 0:5b09476278da 69
ssozonoff 0:5b09476278da 70 //EEPROM locations.
ssozonoff 0:5b09476278da 71 #define HMC6343_SLAVE_ADDR 0x00
ssozonoff 0:5b09476278da 72 #define HMC6343_OPMOD_REG1 0x04
ssozonoff 0:5b09476278da 73 #define HMC6343_OPMOD_REG2 0x05
ssozonoff 0:5b09476278da 74 #define HMC6343_SN_LSB 0x06
ssozonoff 0:5b09476278da 75 #define HMC6343_SN_MSB 0x07
ssozonoff 0:5b09476278da 76 #define HMC6343_DEV_LSB 0x0A
ssozonoff 0:5b09476278da 77 #define HMC6343_DEV_MSB 0x0B
ssozonoff 0:5b09476278da 78 #define HMC6343_VAR_LSB 0x0C
ssozonoff 0:5b09476278da 79 #define HMC6343_VAR_MSB 0x0D
ssozonoff 0:5b09476278da 80 #define HMC6343_XOFFSET_LSB 0x0E
ssozonoff 0:5b09476278da 81 #define HMC6343_XOFFSET_MSB 0x0F
ssozonoff 0:5b09476278da 82 #define HMC6343_YOFFSET_LSB 0x10
ssozonoff 0:5b09476278da 83 #define HMC6343_YOFFSET_MSB 0x11
ssozonoff 0:5b09476278da 84 #define HMC6343_ZOFFSET_LSB 0x12
ssozonoff 0:5b09476278da 85 #define HMC6343_ZOFFSET_MSB 0x13
ssozonoff 0:5b09476278da 86 #define HMC6343_IIRF_LSB 0x14
ssozonoff 0:5b09476278da 87 #define HMC6343_IIRF_MSB 0x15
ssozonoff 0:5b09476278da 88 #define HMC6343_SOFT_VER 0x02
ssozonoff 0:5b09476278da 89
ssozonoff 0:5b09476278da 90
ssozonoff 0:5b09476278da 91 #define HMC6343_X_AXIS 0x01
ssozonoff 0:5b09476278da 92 #define HMC6343_Y_AXIS 0x02
ssozonoff 0:5b09476278da 93 #define HMC6343_Z_AXIS 0x04
ssozonoff 0:5b09476278da 94
ssozonoff 0:5b09476278da 95
ssozonoff 0:5b09476278da 96 // Operation mode bit masks
ssozonoff 0:5b09476278da 97 // LSB
ssozonoff 0:5b09476278da 98 #define HMC6343_COMP 0x128
ssozonoff 0:5b09476278da 99 #define HMC6343_CAL 0x64
ssozonoff 0:5b09476278da 100 #define HMC6343_FILTER 0x32
ssozonoff 0:5b09476278da 101 #define HMC6343_RUN 0x16
ssozonoff 0:5b09476278da 102 #define HMC6343_STDBY 0x08
ssozonoff 0:5b09476278da 103 #define HMC6343_UF 0x04
ssozonoff 0:5b09476278da 104 #define HMC6343_UE 0x02
ssozonoff 0:5b09476278da 105 #define HMC6343_LEVEL 0x01
ssozonoff 0:5b09476278da 106
ssozonoff 0:5b09476278da 107 // MSB
ssozonoff 0:5b09476278da 108 #define HMC6343_MR1 0x256
ssozonoff 0:5b09476278da 109 #define HMC6343_MR2 0x512
ssozonoff 0:5b09476278da 110
ssozonoff 0:5b09476278da 111
ssozonoff 0:5b09476278da 112 //Operational mode register masks.
ssozonoff 0:5b09476278da 113 #define HMC6343_CM_MR_1HZ 0x00
ssozonoff 0:5b09476278da 114 #define HMC6343_CM_MR_5HZ 0x20
ssozonoff 0:5b09476278da 115 #define HMC6343_CM_MR_10HZ 0x40
ssozonoff 0:5b09476278da 116 #define HMC6343_CM_MR_NA 0x60
ssozonoff 0:5b09476278da 117
ssozonoff 0:5b09476278da 118 #define HMC6343_PERIODIC_SR 0x10
ssozonoff 0:5b09476278da 119
ssozonoff 0:5b09476278da 120 /**
ssozonoff 0:5b09476278da 121 * Honeywell HMC6343 digital compass.
ssozonoff 0:5b09476278da 122 */
ssozonoff 0:5b09476278da 123 class HMC6343 {
ssozonoff 0:5b09476278da 124
ssozonoff 0:5b09476278da 125 public:
ssozonoff 0:5b09476278da 126
ssozonoff 0:5b09476278da 127 /**
ssozonoff 0:5b09476278da 128 * Constructor.
ssozonoff 0:5b09476278da 129 *
ssozonoff 0:5b09476278da 130 * @param sda mbed pin to use for SDA line of I2C interface.
ssozonoff 0:5b09476278da 131 * @param scl mbed pin to use for SCL line of I2C interface.
ssozonoff 0:5b09476278da 132 */
ssozonoff 0:5b09476278da 133 HMC6343(PinName sda, PinName scl);
ssozonoff 0:5b09476278da 134
ssozonoff 0:5b09476278da 135 /**
ssozonoff 0:5b09476278da 136 * Sample the device and return the result.
ssozonoff 0:5b09476278da 137 *
ssozonoff 0:5b09476278da 138 * @return In heading output mode, the current heading as a number between
ssozonoff 0:5b09476278da 139 * 0-3599, representing 0-359.9 degrees.
ssozonoff 0:5b09476278da 140 * In raw magnetometer X output mode, the raw output of the X-axis
ssozonoff 0:5b09476278da 141 * magnetometer.
ssozonoff 0:5b09476278da 142 * In raw magnetometer Y mode, the raw output of the Y-axis
ssozonoff 0:5b09476278da 143 * magnetometer.
ssozonoff 0:5b09476278da 144 * In magnetometer X mode, the corrected output of the X-axis
ssozonoff 0:5b09476278da 145 * magnetometer.
ssozonoff 0:5b09476278da 146 * In magnetometer Y mode, the corrected output of the Y-axis
ssozonoff 0:5b09476278da 147 * magnetometer.
ssozonoff 0:5b09476278da 148 */
ssozonoff 0:5b09476278da 149 double sampleHeading(void);
ssozonoff 0:5b09476278da 150
ssozonoff 0:5b09476278da 151 /**
ssozonoff 0:5b09476278da 152 * Update bridge offsets.
ssozonoff 0:5b09476278da 153 *
ssozonoff 0:5b09476278da 154 * Performs a set/reset immediately.
ssozonoff 0:5b09476278da 155 */
ssozonoff 0:5b09476278da 156 void setReset(void);
ssozonoff 0:5b09476278da 157
ssozonoff 0:5b09476278da 158 /**
ssozonoff 0:5b09476278da 159 * Enter into or exit from calibration mode.
ssozonoff 0:5b09476278da 160 *
ssozonoff 0:5b09476278da 161 * @param enterOrExit 0x45 -> Exit
ssozonoff 0:5b09476278da 162 * 0x43 -> Enter
ssozonoff 0:5b09476278da 163 */
ssozonoff 0:5b09476278da 164 void setCalibrationMode(int enterOrExit);
ssozonoff 0:5b09476278da 165
ssozonoff 0:5b09476278da 166 /**
ssozonoff 0:5b09476278da 167 * Save the current operation mode byte to EEPROM.
ssozonoff 0:5b09476278da 168 */
ssozonoff 0:5b09476278da 169 void saveOpMode(void);
ssozonoff 0:5b09476278da 170
ssozonoff 0:5b09476278da 171 /**
ssozonoff 0:5b09476278da 172 * Read the memory location on the device which contains the slave address.
ssozonoff 0:5b09476278da 173 *
ssozonoff 0:5b09476278da 174 * @return The slave address of the device.
ssozonoff 0:5b09476278da 175 */
ssozonoff 0:5b09476278da 176 int getSlaveAddress(void);
ssozonoff 0:5b09476278da 177
ssozonoff 0:5b09476278da 178 /**
ssozonoff 0:5b09476278da 179 * Read the current offset for X or Y axis magnetometer.
ssozonoff 0:5b09476278da 180 *
ssozonoff 0:5b09476278da 181 * @param axis 0x01 -> X-axis
ssozonoff 0:5b09476278da 182 * 0x02 -> Y-axis
ssozonoff 0:5b09476278da 183 * 0x04 -> Z-axis
ssozonoff 0:5b09476278da 184 * @return The current offset for the axis as a 16-bit number.
ssozonoff 0:5b09476278da 185 */
ssozonoff 0:5b09476278da 186 int getOffset(int axis);
ssozonoff 0:5b09476278da 187
ssozonoff 0:5b09476278da 188
ssozonoff 0:5b09476278da 189 /**
ssozonoff 0:5b09476278da 190 * Get the software version on the device.
ssozonoff 0:5b09476278da 191 *
ssozonoff 0:5b09476278da 192 * @return The software version number.
ssozonoff 0:5b09476278da 193 */
ssozonoff 0:5b09476278da 194 int getSoftwareVersion(void);
ssozonoff 0:5b09476278da 195
ssozonoff 0:5b09476278da 196 /**
ssozonoff 0:5b09476278da 197 * Get the current operation mode.
ssozonoff 0:5b09476278da 198 *
ssozonoff 0:5b09476278da 199 * @return 0x00 -> Standby mode
ssozonoff 0:5b09476278da 200 * 0x01 -> Query mode
ssozonoff 0:5b09476278da 201 * 0x02 -> Continuous mode
ssozonoff 0:5b09476278da 202 */
ssozonoff 0:5b09476278da 203 int getOpMode(void);
ssozonoff 0:5b09476278da 204
ssozonoff 0:5b09476278da 205 /**
ssozonoff 0:5b09476278da 206 * Set the operation mode.
ssozonoff 0:5b09476278da 207 *
ssozonoff 0:5b09476278da 208 * @param mode 0x00 -> Standby mode
ssozonoff 0:5b09476278da 209 * 0x01 -> Query mode
ssozonoff 0:5b09476278da 210 * 0x02 -> Continuous mode
ssozonoff 0:5b09476278da 211 * @param periodicSetReset 0x00 -> No periodic set/reset
ssozonoff 0:5b09476278da 212 * 0x01 -> Periodic set/reset
ssozonoff 0:5b09476278da 213 * @measurementRate Measurement rate in Hz for continuous rate.
ssozonoff 0:5b09476278da 214 * Possible rates: {1, 5, 10, 20}Hz.
ssozonoff 0:5b09476278da 215 */
ssozonoff 0:5b09476278da 216 void setOpMode(int mode, int periodicSetReset, int measurementRate = 0);
ssozonoff 0:5b09476278da 217
ssozonoff 0:5b09476278da 218 /**
ssozonoff 0:5b09476278da 219 * Get the current output mode of the device.
ssozonoff 0:5b09476278da 220 *
ssozonoff 0:5b09476278da 221 * @return The current output mode.
ssozonoff 0:5b09476278da 222 */
ssozonoff 0:5b09476278da 223 int getOutputMode(void);
ssozonoff 0:5b09476278da 224
ssozonoff 0:5b09476278da 225 /**
ssozonoff 0:5b09476278da 226 * Set the output mode of the device.
ssozonoff 0:5b09476278da 227 *
ssozonoff 0:5b09476278da 228 * @param mode 0x00 -> Heading mode
ssozonoff 0:5b09476278da 229 * 0x01 -> Raw magnetometer X mode
ssozonoff 0:5b09476278da 230 * 0x02 -> Raw magnetometer Y mode
ssozonoff 0:5b09476278da 231 * 0x03 -> Magnetometer X mode
ssozonoff 0:5b09476278da 232 * 0x04 -> Magnetometer Y mode
ssozonoff 0:5b09476278da 233 */
ssozonoff 0:5b09476278da 234 void setOutputMode(int mode);
ssozonoff 0:5b09476278da 235
ssozonoff 0:5b09476278da 236
ssozonoff 0:5b09476278da 237 void setMagneticVariation(float var);
ssozonoff 0:5b09476278da 238 float getMagneticVariation();
ssozonoff 0:5b09476278da 239 void setMagneticDeviation(float data);
ssozonoff 0:5b09476278da 240 float getMagneticDeviation();
ssozonoff 0:5b09476278da 241
ssozonoff 0:5b09476278da 242 private:
ssozonoff 0:5b09476278da 243
ssozonoff 0:5b09476278da 244 I2C* i2c_;
ssozonoff 0:5b09476278da 245 int operationMode_;
ssozonoff 0:5b09476278da 246
ssozonoff 0:5b09476278da 247 /**
ssozonoff 0:5b09476278da 248 * Write to EEPROM on the device.
ssozonoff 0:5b09476278da 249 *
ssozonoff 0:5b09476278da 250 * @param address Address to write to.
ssozonoff 0:5b09476278da 251 * @param data Data to write.
ssozonoff 0:5b09476278da 252 */
ssozonoff 0:5b09476278da 253 void write(int address, int data);
ssozonoff 0:5b09476278da 254
ssozonoff 0:5b09476278da 255 /**
ssozonoff 0:5b09476278da 256 * Read EEPROM on the device.
ssozonoff 0:5b09476278da 257 *
ssozonoff 0:5b09476278da 258 * @param address Address to read from.
ssozonoff 0:5b09476278da 259 * @return The contents of the memory address.
ssozonoff 0:5b09476278da 260 */
ssozonoff 0:5b09476278da 261 int read(int address);
ssozonoff 0:5b09476278da 262
ssozonoff 0:5b09476278da 263 void writeFloat(int lsb_address, float data);
ssozonoff 0:5b09476278da 264 float readFloat(int lsb_eprom_address);
ssozonoff 0:5b09476278da 265
ssozonoff 0:5b09476278da 266 };
ssozonoff 0:5b09476278da 267
ssozonoff 0:5b09476278da 268 #endif /* HMC6343_H */