2018/3/20 publish

Fork of HMC6352 by Tomo Suzu

Committer:
Tomo073
Date:
Tue Mar 20 12:44:05 2018 +0000
Revision:
0:e009fb4791c0
2018/3/20

Who changed what in which revision?

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