I2C driver for HMC5583L digital compass sensor

Dependents:   m3Dpi

Revision:
0:91f08ac76444
Child:
1:097089f0feb1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hmc5583l.cpp	Thu Dec 03 07:52:58 2015 +0000
@@ -0,0 +1,34 @@
+#include "hmc5583l.h"
+#include "stdint.h"
+
+HMC5583L::HMC5583L(PinName sda, PinName scl, int _address): i2c(sda, scl), address(_address)
+{
+    char data[2];
+    data[0] = 0x02; // select mode register
+    data[1] = 0x00; // continous measurement mode
+
+    i2c.write(address, data, 2);
+}
+
+coord HMC5583L::getCompass()
+{
+    coord c;
+    // tell where to begin reading data
+    char data[] = {0x03}; // select register 3, MSB register
+    i2c.write(address, data, 1);
+    
+    char values[6];
+    i2c.read(address, values, 6);
+    
+    // x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;
+    c.x = regToInt(values[0], values[1]);
+    c.y = regToInt(values[2], values[3]);
+    c.z = regToInt(values[4], values[5]);
+        
+    return c;
+}
+
+int HMC5583L::regToInt(char msb, char lsb){
+    int16_t value = msb << 8 | lsb;
+    return (int) value;
+}
\ No newline at end of file