Honeywell HMC6352 digital compass library.

Dependents:   HMC6352_HelloWorld TrackerFinal AntennaTracker TrackingAntenna ... more

Committer:
aberk
Date:
Sat Nov 27 12:15:03 2010 +0000
Revision:
0:83c0cb554099
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:83c0cb554099 1 /**
aberk 0:83c0cb554099 2 * @author Aaron Berk
aberk 0:83c0cb554099 3 *
aberk 0:83c0cb554099 4 * @section LICENSE
aberk 0:83c0cb554099 5 *
aberk 0:83c0cb554099 6 * Copyright (c) 2010 ARM Limited
aberk 0:83c0cb554099 7 *
aberk 0:83c0cb554099 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
aberk 0:83c0cb554099 9 * of this software and associated documentation files (the "Software"), to deal
aberk 0:83c0cb554099 10 * in the Software without restriction, including without limitation the rights
aberk 0:83c0cb554099 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aberk 0:83c0cb554099 12 * copies of the Software, and to permit persons to whom the Software is
aberk 0:83c0cb554099 13 * furnished to do so, subject to the following conditions:
aberk 0:83c0cb554099 14 *
aberk 0:83c0cb554099 15 * The above copyright notice and this permission notice shall be included in
aberk 0:83c0cb554099 16 * all copies or substantial portions of the Software.
aberk 0:83c0cb554099 17 *
aberk 0:83c0cb554099 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aberk 0:83c0cb554099 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aberk 0:83c0cb554099 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aberk 0:83c0cb554099 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aberk 0:83c0cb554099 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aberk 0:83c0cb554099 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
aberk 0:83c0cb554099 24 * THE SOFTWARE.
aberk 0:83c0cb554099 25 *
aberk 0:83c0cb554099 26 * @section DESCRIPTION
aberk 0:83c0cb554099 27 *
aberk 0:83c0cb554099 28 * Honeywell HMC6352 digital compass.
aberk 0:83c0cb554099 29 *
aberk 0:83c0cb554099 30 * Datasheet:
aberk 0:83c0cb554099 31 *
aberk 0:83c0cb554099 32 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6352.pdf
aberk 0:83c0cb554099 33 */
aberk 0:83c0cb554099 34
aberk 0:83c0cb554099 35 /**
aberk 0:83c0cb554099 36 * Includes
aberk 0:83c0cb554099 37 */
aberk 0:83c0cb554099 38 #include "HMC6352.h"
aberk 0:83c0cb554099 39
aberk 0:83c0cb554099 40 HMC6352::HMC6352(PinName sda, PinName scl) {
aberk 0:83c0cb554099 41
aberk 0:83c0cb554099 42 i2c_ = new I2C(sda, scl);
aberk 0:83c0cb554099 43 //100KHz, as specified by the datasheet.
aberk 0:83c0cb554099 44 i2c_->frequency(100000);
aberk 0:83c0cb554099 45
aberk 0:83c0cb554099 46 operationMode_ = getOpMode();
aberk 0:83c0cb554099 47
aberk 0:83c0cb554099 48 }
aberk 0:83c0cb554099 49
aberk 0:83c0cb554099 50 int HMC6352::sample(void) {
aberk 0:83c0cb554099 51
aberk 0:83c0cb554099 52 char tx[1];
aberk 0:83c0cb554099 53 char rx[2];
aberk 0:83c0cb554099 54
aberk 0:83c0cb554099 55 if (operationMode_ == HMC6352_STANDBY || operationMode_ == HMC6352_QUERY) {
aberk 0:83c0cb554099 56 tx[0] = HMC6352_GET_DATA;
aberk 0:83c0cb554099 57
aberk 0:83c0cb554099 58 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 59 wait_ms(1);
aberk 0:83c0cb554099 60 }
aberk 0:83c0cb554099 61
aberk 0:83c0cb554099 62 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:83c0cb554099 63 wait_ms(1);
aberk 0:83c0cb554099 64
aberk 0:83c0cb554099 65 return (((int)rx[0] << 8) | (int)rx[1]);
aberk 0:83c0cb554099 66
aberk 0:83c0cb554099 67 }
aberk 0:83c0cb554099 68
aberk 0:83c0cb554099 69 void HMC6352::setSleepMode(int exitOrEnter) {
aberk 0:83c0cb554099 70
aberk 0:83c0cb554099 71 char tx[1];
aberk 0:83c0cb554099 72
aberk 0:83c0cb554099 73 tx[0] = exitOrEnter;
aberk 0:83c0cb554099 74
aberk 0:83c0cb554099 75 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 76 wait_ms(1);
aberk 0:83c0cb554099 77
aberk 0:83c0cb554099 78 }
aberk 0:83c0cb554099 79
aberk 0:83c0cb554099 80 void HMC6352::setReset(void) {
aberk 0:83c0cb554099 81
aberk 0:83c0cb554099 82 char tx[1];
aberk 0:83c0cb554099 83
aberk 0:83c0cb554099 84 tx[0] = HMC6352_SET_RESET;
aberk 0:83c0cb554099 85
aberk 0:83c0cb554099 86 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 87 wait_ms(7);
aberk 0:83c0cb554099 88
aberk 0:83c0cb554099 89 }
aberk 0:83c0cb554099 90
aberk 0:83c0cb554099 91 void HMC6352::setCalibrationMode(int exitOrEnter) {
aberk 0:83c0cb554099 92
aberk 0:83c0cb554099 93 char tx[1];
aberk 0:83c0cb554099 94 int delay = 0;
aberk 0:83c0cb554099 95
aberk 0:83c0cb554099 96 tx[0] = exitOrEnter;
aberk 0:83c0cb554099 97
aberk 0:83c0cb554099 98 if (exitOrEnter == HMC6352_EXIT_CALIB) {
aberk 0:83c0cb554099 99 delay = 15;
aberk 0:83c0cb554099 100 } else if (exitOrEnter == HMC6352_ENTER_CALIB) {
aberk 0:83c0cb554099 101 delay = 1;
aberk 0:83c0cb554099 102 }
aberk 0:83c0cb554099 103
aberk 0:83c0cb554099 104 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 105 wait_ms(delay);
aberk 0:83c0cb554099 106
aberk 0:83c0cb554099 107 }
aberk 0:83c0cb554099 108
aberk 0:83c0cb554099 109 void HMC6352::saveOpMode(void) {
aberk 0:83c0cb554099 110
aberk 0:83c0cb554099 111 char tx[1];
aberk 0:83c0cb554099 112
aberk 0:83c0cb554099 113 tx[0] = HMC6352_SAVE_OPMODE;
aberk 0:83c0cb554099 114
aberk 0:83c0cb554099 115 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 116 wait_ms(1);
aberk 0:83c0cb554099 117
aberk 0:83c0cb554099 118 }
aberk 0:83c0cb554099 119
aberk 0:83c0cb554099 120 int HMC6352::getSlaveAddress(void) {
aberk 0:83c0cb554099 121
aberk 0:83c0cb554099 122 return read(HMC6352_EEPROM_READ, HMC6352_SLAVE_ADDR);
aberk 0:83c0cb554099 123
aberk 0:83c0cb554099 124 }
aberk 0:83c0cb554099 125
aberk 0:83c0cb554099 126 int HMC6352::getOffset(int axis) {
aberk 0:83c0cb554099 127
aberk 0:83c0cb554099 128 char rx[2] = {0x00, 0x00};
aberk 0:83c0cb554099 129
aberk 0:83c0cb554099 130 if (axis == HMC6352_MX_OFFSET) {
aberk 0:83c0cb554099 131
aberk 0:83c0cb554099 132 rx[0] = read(HMC6352_EEPROM_READ, HMC6352_MX_OFF_MSB);
aberk 0:83c0cb554099 133 rx[1] = read(HMC6352_EEPROM_READ, HMC6352_MX_OFF_LSB);
aberk 0:83c0cb554099 134
aberk 0:83c0cb554099 135 } else if (axis == HMC6352_MY_OFFSET) {
aberk 0:83c0cb554099 136
aberk 0:83c0cb554099 137 rx[0] = read(HMC6352_EEPROM_READ, HMC6352_MY_OFF_MSB);
aberk 0:83c0cb554099 138 rx[1] = read(HMC6352_EEPROM_READ, HMC6352_MY_OFF_LSB);
aberk 0:83c0cb554099 139
aberk 0:83c0cb554099 140 }
aberk 0:83c0cb554099 141
aberk 0:83c0cb554099 142 return ((rx[0] << 8) | (rx[1]));
aberk 0:83c0cb554099 143
aberk 0:83c0cb554099 144 }
aberk 0:83c0cb554099 145
aberk 0:83c0cb554099 146 void HMC6352::setOffset(int axis, int offset) {
aberk 0:83c0cb554099 147
aberk 0:83c0cb554099 148 char tx[2] = {0x00, 0x00};
aberk 0:83c0cb554099 149
aberk 0:83c0cb554099 150 tx[0] = (offset & 0x0000FF00) >> 8;
aberk 0:83c0cb554099 151 tx[1] = (offset & 0x000000FF);
aberk 0:83c0cb554099 152
aberk 0:83c0cb554099 153 if (axis == HMC6352_MX_OFFSET) {
aberk 0:83c0cb554099 154
aberk 0:83c0cb554099 155 write(HMC6352_EEPROM_WRITE, HMC6352_MX_OFF_MSB, tx[0]);
aberk 0:83c0cb554099 156 write(HMC6352_EEPROM_WRITE, HMC6352_MX_OFF_MSB, tx[1]);
aberk 0:83c0cb554099 157
aberk 0:83c0cb554099 158 } else if (axis == HMC6352_MY_OFFSET) {
aberk 0:83c0cb554099 159
aberk 0:83c0cb554099 160 write(HMC6352_EEPROM_WRITE, HMC6352_MY_OFF_MSB, tx[0]);
aberk 0:83c0cb554099 161 write(HMC6352_EEPROM_WRITE, HMC6352_MY_OFF_MSB, tx[1]);
aberk 0:83c0cb554099 162
aberk 0:83c0cb554099 163 }
aberk 0:83c0cb554099 164
aberk 0:83c0cb554099 165 }
aberk 0:83c0cb554099 166
aberk 0:83c0cb554099 167 int HMC6352::getTimeDelay(void) {
aberk 0:83c0cb554099 168
aberk 0:83c0cb554099 169 return read(HMC6352_EEPROM_READ, HMC6352_TIME_DELAY);
aberk 0:83c0cb554099 170
aberk 0:83c0cb554099 171 }
aberk 0:83c0cb554099 172
aberk 0:83c0cb554099 173 void HMC6352::setTimeDelay(int delay) {
aberk 0:83c0cb554099 174
aberk 0:83c0cb554099 175 write(HMC6352_EEPROM_WRITE, HMC6352_TIME_DELAY, delay);
aberk 0:83c0cb554099 176
aberk 0:83c0cb554099 177 }
aberk 0:83c0cb554099 178
aberk 0:83c0cb554099 179 int HMC6352::getSumNumber(void) {
aberk 0:83c0cb554099 180
aberk 0:83c0cb554099 181 return read(HMC6352_EEPROM_READ, HMC6352_SUMMED);
aberk 0:83c0cb554099 182
aberk 0:83c0cb554099 183 }
aberk 0:83c0cb554099 184
aberk 0:83c0cb554099 185 void HMC6352::setSumNumber(int sum) {
aberk 0:83c0cb554099 186
aberk 0:83c0cb554099 187 write(HMC6352_EEPROM_WRITE, HMC6352_SUMMED, sum);
aberk 0:83c0cb554099 188
aberk 0:83c0cb554099 189 }
aberk 0:83c0cb554099 190
aberk 0:83c0cb554099 191 int HMC6352::getSoftwareVersion(void) {
aberk 0:83c0cb554099 192
aberk 0:83c0cb554099 193 return read(HMC6352_EEPROM_READ, HMC6352_SOFT_VER);
aberk 0:83c0cb554099 194
aberk 0:83c0cb554099 195 }
aberk 0:83c0cb554099 196
aberk 0:83c0cb554099 197 int HMC6352::getOpMode(void) {
aberk 0:83c0cb554099 198
aberk 0:83c0cb554099 199 int response = 0;
aberk 0:83c0cb554099 200
aberk 0:83c0cb554099 201 response = read(HMC6352_RAM_READ, HMC6352_RAM_OPMODE);
aberk 0:83c0cb554099 202
aberk 0:83c0cb554099 203 return (response & 0x00000003);
aberk 0:83c0cb554099 204
aberk 0:83c0cb554099 205 }
aberk 0:83c0cb554099 206
aberk 0:83c0cb554099 207 void HMC6352::setOpMode(int mode, int periodicSetReset, int measurementRate) {
aberk 0:83c0cb554099 208
aberk 0:83c0cb554099 209 char opModeByte = mode;
aberk 0:83c0cb554099 210
aberk 0:83c0cb554099 211 if (periodicSetReset == 1) {
aberk 0:83c0cb554099 212 opModeByte |= HMC6352_PERIODIC_SR;
aberk 0:83c0cb554099 213 }
aberk 0:83c0cb554099 214
aberk 0:83c0cb554099 215 if (measurementRate == 5) {
aberk 0:83c0cb554099 216 opModeByte |= HMC6352_CM_MR_5HZ;
aberk 0:83c0cb554099 217 } else if (measurementRate == 10) {
aberk 0:83c0cb554099 218 opModeByte |= HMC6352_CM_MR_10HZ;
aberk 0:83c0cb554099 219 } else if (measurementRate == 20) {
aberk 0:83c0cb554099 220 opModeByte |= HMC6352_CM_MR_20HZ;
aberk 0:83c0cb554099 221 }
aberk 0:83c0cb554099 222
aberk 0:83c0cb554099 223 write(HMC6352_RAM_WRITE, HMC6352_RAM_OPMODE, opModeByte);
aberk 0:83c0cb554099 224 write(HMC6352_EEPROM_WRITE, HMC6352_OPMODE, opModeByte);
aberk 0:83c0cb554099 225
aberk 0:83c0cb554099 226 operationMode_ = mode;
aberk 0:83c0cb554099 227
aberk 0:83c0cb554099 228 }
aberk 0:83c0cb554099 229
aberk 0:83c0cb554099 230 int HMC6352::getOutputMode(void) {
aberk 0:83c0cb554099 231
aberk 0:83c0cb554099 232 return read(HMC6352_RAM_READ, HMC6352_RAM_OUTPUT);
aberk 0:83c0cb554099 233
aberk 0:83c0cb554099 234 }
aberk 0:83c0cb554099 235
aberk 0:83c0cb554099 236 void HMC6352::setOutputMode(int mode) {
aberk 0:83c0cb554099 237
aberk 0:83c0cb554099 238 write(HMC6352_RAM_WRITE, HMC6352_RAM_OUTPUT, mode);
aberk 0:83c0cb554099 239
aberk 0:83c0cb554099 240 }
aberk 0:83c0cb554099 241
aberk 0:83c0cb554099 242 void HMC6352::write(int EepromOrRam, int address, int data) {
aberk 0:83c0cb554099 243
aberk 0:83c0cb554099 244 char tx[3];
aberk 0:83c0cb554099 245
aberk 0:83c0cb554099 246 tx[0] = EepromOrRam;
aberk 0:83c0cb554099 247 tx[1] = address;
aberk 0:83c0cb554099 248 tx[2] = data;
aberk 0:83c0cb554099 249
aberk 0:83c0cb554099 250 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 3);
aberk 0:83c0cb554099 251 wait_ms(1);
aberk 0:83c0cb554099 252
aberk 0:83c0cb554099 253 }
aberk 0:83c0cb554099 254
aberk 0:83c0cb554099 255 int HMC6352::read(int EepromOrRam, int address) {
aberk 0:83c0cb554099 256
aberk 0:83c0cb554099 257 char tx[2];
aberk 0:83c0cb554099 258 char rx[1];
aberk 0:83c0cb554099 259
aberk 0:83c0cb554099 260 tx[0] = EepromOrRam;
aberk 0:83c0cb554099 261 tx[1] = address;
aberk 0:83c0cb554099 262
aberk 0:83c0cb554099 263 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:83c0cb554099 264 wait_ms(1);
aberk 0:83c0cb554099 265 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 1);
aberk 0:83c0cb554099 266 wait_ms(1);
aberk 0:83c0cb554099 267
aberk 0:83c0cb554099 268 return (rx[0]);
aberk 0:83c0cb554099 269
aberk 0:83c0cb554099 270 }