HMC5843 Library as part of the 9DOF stick from Sparkfun.com

Committer:
Digixx
Date:
Fri Oct 07 21:06:52 2011 +0000
Revision:
0:03b72060cd83

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Digixx 0:03b72060cd83 1 /**
Digixx 0:03b72060cd83 2 * @author Jose R. Padron
Digixx 0:03b72060cd83 3 * @author Used HMC6352 library developed by Aaron Berk as template
Digixx 0:03b72060cd83 4 * @section LICENSE
Digixx 0:03b72060cd83 5 *
Digixx 0:03b72060cd83 6 * Copyright (c) 2010 ARM Limited
Digixx 0:03b72060cd83 7 *
Digixx 0:03b72060cd83 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
Digixx 0:03b72060cd83 9 * of this software and associated documentation files (the "Software"), to deal
Digixx 0:03b72060cd83 10 * in the Software without restriction, including without limitation the rights
Digixx 0:03b72060cd83 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Digixx 0:03b72060cd83 12 * copies of the Software, and to permit persons to whom the Software is
Digixx 0:03b72060cd83 13 * furnished to do so, subject to the following conditions:
Digixx 0:03b72060cd83 14 *
Digixx 0:03b72060cd83 15 * The above copyright notice and this permission notice shall be included in
Digixx 0:03b72060cd83 16 * all copies or substantial portions of the Software.
Digixx 0:03b72060cd83 17 *
Digixx 0:03b72060cd83 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Digixx 0:03b72060cd83 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Digixx 0:03b72060cd83 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Digixx 0:03b72060cd83 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Digixx 0:03b72060cd83 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Digixx 0:03b72060cd83 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Digixx 0:03b72060cd83 24 * THE SOFTWARE.
Digixx 0:03b72060cd83 25 *
Digixx 0:03b72060cd83 26 * @section DESCRIPTION
Digixx 0:03b72060cd83 27 *
Digixx 0:03b72060cd83 28 * Honeywell HMC5843digital compass.
Digixx 0:03b72060cd83 29 *
Digixx 0:03b72060cd83 30 * Datasheet:
Digixx 0:03b72060cd83 31 *
Digixx 0:03b72060cd83 32 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC5843.pdf
Digixx 0:03b72060cd83 33 */
Digixx 0:03b72060cd83 34
Digixx 0:03b72060cd83 35 /**
Digixx 0:03b72060cd83 36 * Includes
Digixx 0:03b72060cd83 37 */
Digixx 0:03b72060cd83 38 #include "HMC5843.h"
Digixx 0:03b72060cd83 39
Digixx 0:03b72060cd83 40 HMC5843::HMC5843(PinName sda, PinName scl) {
Digixx 0:03b72060cd83 41
Digixx 0:03b72060cd83 42 i2c_ = new I2C(sda, scl);
Digixx 0:03b72060cd83 43 //100KHz, as specified by the datasheet.
Digixx 0:03b72060cd83 44 i2c_->frequency(100000);
Digixx 0:03b72060cd83 45
Digixx 0:03b72060cd83 46
Digixx 0:03b72060cd83 47 }
Digixx 0:03b72060cd83 48
Digixx 0:03b72060cd83 49
Digixx 0:03b72060cd83 50 void HMC5843::write(int address, int data) {
Digixx 0:03b72060cd83 51
Digixx 0:03b72060cd83 52 char tx[2];
Digixx 0:03b72060cd83 53
Digixx 0:03b72060cd83 54 tx[0]=address;
Digixx 0:03b72060cd83 55 tx[1]=data;
Digixx 0:03b72060cd83 56
Digixx 0:03b72060cd83 57 i2c_->write(HMC5843_I2C_WRITE,tx,2);
Digixx 0:03b72060cd83 58
Digixx 0:03b72060cd83 59 wait_ms(100);
Digixx 0:03b72060cd83 60
Digixx 0:03b72060cd83 61 }
Digixx 0:03b72060cd83 62
Digixx 0:03b72060cd83 63
Digixx 0:03b72060cd83 64 void HMC5843::setSleepMode() {
Digixx 0:03b72060cd83 65
Digixx 0:03b72060cd83 66 write(HMC5843_MODE, HMC5843_SLEEP);
Digixx 0:03b72060cd83 67 }
Digixx 0:03b72060cd83 68
Digixx 0:03b72060cd83 69 void HMC5843::setDefault(void) {
Digixx 0:03b72060cd83 70
Digixx 0:03b72060cd83 71 write(HMC5843_CONFIG_A,HMC5843_10HZ_NORMAL);
Digixx 0:03b72060cd83 72 write(HMC5843_CONFIG_B,HMC5843_1_0GA);
Digixx 0:03b72060cd83 73 write(HMC5843_MODE,HMC5843_CONTINUOUS);
Digixx 0:03b72060cd83 74 wait_ms(100);
Digixx 0:03b72060cd83 75 }
Digixx 0:03b72060cd83 76
Digixx 0:03b72060cd83 77
Digixx 0:03b72060cd83 78 void HMC5843::getAddress(char *buffer) {
Digixx 0:03b72060cd83 79
Digixx 0:03b72060cd83 80 char rx[3];
Digixx 0:03b72060cd83 81 char tx[1];
Digixx 0:03b72060cd83 82 tx[0]=HMC5843_IDENT_A;
Digixx 0:03b72060cd83 83
Digixx 0:03b72060cd83 84
Digixx 0:03b72060cd83 85 i2c_->write(HMC5843_I2C_WRITE, tx,1);
Digixx 0:03b72060cd83 86
Digixx 0:03b72060cd83 87 wait_ms(1);
Digixx 0:03b72060cd83 88
Digixx 0:03b72060cd83 89 i2c_->read(HMC5843_I2C_READ,rx,3);
Digixx 0:03b72060cd83 90
Digixx 0:03b72060cd83 91 buffer[0]=rx[0];
Digixx 0:03b72060cd83 92 buffer[1]=rx[1];
Digixx 0:03b72060cd83 93 buffer[2]=rx[2];
Digixx 0:03b72060cd83 94 }
Digixx 0:03b72060cd83 95
Digixx 0:03b72060cd83 96
Digixx 0:03b72060cd83 97
Digixx 0:03b72060cd83 98 void HMC5843::setOpMode(int mode, int ConfigA, int ConfigB) {
Digixx 0:03b72060cd83 99
Digixx 0:03b72060cd83 100
Digixx 0:03b72060cd83 101 write(HMC5843_CONFIG_A,ConfigA);
Digixx 0:03b72060cd83 102 write(HMC5843_CONFIG_B,ConfigB);
Digixx 0:03b72060cd83 103 write(HMC5843_MODE,mode);
Digixx 0:03b72060cd83 104
Digixx 0:03b72060cd83 105
Digixx 0:03b72060cd83 106 }
Digixx 0:03b72060cd83 107
Digixx 0:03b72060cd83 108
Digixx 0:03b72060cd83 109
Digixx 0:03b72060cd83 110
Digixx 0:03b72060cd83 111 void HMC5843::readData(int* readings) {
Digixx 0:03b72060cd83 112
Digixx 0:03b72060cd83 113
Digixx 0:03b72060cd83 114 char tx[1];
Digixx 0:03b72060cd83 115 char rx[2];
Digixx 0:03b72060cd83 116
Digixx 0:03b72060cd83 117
Digixx 0:03b72060cd83 118 tx[0]=HMC5843_X_MSB;
Digixx 0:03b72060cd83 119 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 120 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 121 readings[0]= (int)rx[0]<<8|(int)rx[1];
Digixx 0:03b72060cd83 122
Digixx 0:03b72060cd83 123
Digixx 0:03b72060cd83 124 tx[0]=HMC5843_Y_MSB;
Digixx 0:03b72060cd83 125 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 126 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 127 readings[1]= (int)rx[0]<<8|(int)rx[1];
Digixx 0:03b72060cd83 128
Digixx 0:03b72060cd83 129 tx[0]=HMC5843_Z_MSB;
Digixx 0:03b72060cd83 130 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 131 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 132 readings[2]= (int)rx[0]<<8|(int)rx[1];
Digixx 0:03b72060cd83 133
Digixx 0:03b72060cd83 134 }
Digixx 0:03b72060cd83 135
Digixx 0:03b72060cd83 136 int HMC5843::getMx() {
Digixx 0:03b72060cd83 137
Digixx 0:03b72060cd83 138 char tx[1];
Digixx 0:03b72060cd83 139 char rx[2];
Digixx 0:03b72060cd83 140
Digixx 0:03b72060cd83 141
Digixx 0:03b72060cd83 142 tx[0]=HMC5843_X_MSB;
Digixx 0:03b72060cd83 143 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 144 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 145 return ((int)rx[0]<<8|(int)rx[1]);
Digixx 0:03b72060cd83 146
Digixx 0:03b72060cd83 147 }
Digixx 0:03b72060cd83 148
Digixx 0:03b72060cd83 149 int HMC5843::getMy() {
Digixx 0:03b72060cd83 150
Digixx 0:03b72060cd83 151 char tx[1];
Digixx 0:03b72060cd83 152 char rx[2];
Digixx 0:03b72060cd83 153
Digixx 0:03b72060cd83 154
Digixx 0:03b72060cd83 155 tx[0]=HMC5843_Y_MSB;
Digixx 0:03b72060cd83 156 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 157 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 158 return ((int)rx[0]<<8|(int)rx[1]);
Digixx 0:03b72060cd83 159
Digixx 0:03b72060cd83 160 }
Digixx 0:03b72060cd83 161
Digixx 0:03b72060cd83 162
Digixx 0:03b72060cd83 163 int HMC5843::getMz(){
Digixx 0:03b72060cd83 164
Digixx 0:03b72060cd83 165 char tx[1];
Digixx 0:03b72060cd83 166 char rx[2];
Digixx 0:03b72060cd83 167
Digixx 0:03b72060cd83 168
Digixx 0:03b72060cd83 169 tx[0]=HMC5843_Z_MSB;
Digixx 0:03b72060cd83 170 i2c_->write(HMC5843_I2C_READ,tx,1);
Digixx 0:03b72060cd83 171 i2c_->read(HMC5843_I2C_READ,rx,2);
Digixx 0:03b72060cd83 172 return ((int)rx[0]<<8|(int)rx[1]);
Digixx 0:03b72060cd83 173
Digixx 0:03b72060cd83 174 }
Digixx 0:03b72060cd83 175
Digixx 0:03b72060cd83 176