I2C driver for HMC5583L digital compass sensor

Dependents:   m3Dpi

Committer:
sillevl
Date:
Thu Dec 03 07:52:58 2015 +0000
Revision:
0:91f08ac76444
Child:
1:097089f0feb1
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sillevl 0:91f08ac76444 1 #include "hmc5583l.h"
sillevl 0:91f08ac76444 2 #include "stdint.h"
sillevl 0:91f08ac76444 3
sillevl 0:91f08ac76444 4 HMC5583L::HMC5583L(PinName sda, PinName scl, int _address): i2c(sda, scl), address(_address)
sillevl 0:91f08ac76444 5 {
sillevl 0:91f08ac76444 6 char data[2];
sillevl 0:91f08ac76444 7 data[0] = 0x02; // select mode register
sillevl 0:91f08ac76444 8 data[1] = 0x00; // continous measurement mode
sillevl 0:91f08ac76444 9
sillevl 0:91f08ac76444 10 i2c.write(address, data, 2);
sillevl 0:91f08ac76444 11 }
sillevl 0:91f08ac76444 12
sillevl 0:91f08ac76444 13 coord HMC5583L::getCompass()
sillevl 0:91f08ac76444 14 {
sillevl 0:91f08ac76444 15 coord c;
sillevl 0:91f08ac76444 16 // tell where to begin reading data
sillevl 0:91f08ac76444 17 char data[] = {0x03}; // select register 3, MSB register
sillevl 0:91f08ac76444 18 i2c.write(address, data, 1);
sillevl 0:91f08ac76444 19
sillevl 0:91f08ac76444 20 char values[6];
sillevl 0:91f08ac76444 21 i2c.read(address, values, 6);
sillevl 0:91f08ac76444 22
sillevl 0:91f08ac76444 23 // x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;
sillevl 0:91f08ac76444 24 c.x = regToInt(values[0], values[1]);
sillevl 0:91f08ac76444 25 c.y = regToInt(values[2], values[3]);
sillevl 0:91f08ac76444 26 c.z = regToInt(values[4], values[5]);
sillevl 0:91f08ac76444 27
sillevl 0:91f08ac76444 28 return c;
sillevl 0:91f08ac76444 29 }
sillevl 0:91f08ac76444 30
sillevl 0:91f08ac76444 31 int HMC5583L::regToInt(char msb, char lsb){
sillevl 0:91f08ac76444 32 int16_t value = msb << 8 | lsb;
sillevl 0:91f08ac76444 33 return (int) value;
sillevl 0:91f08ac76444 34 }