Interface library for ST LSM303DLM 3-axis magnetometer/accelerometer

Dependents:   AVC_2012 m3pi_Kompass Fish_2014Fall Fish_2014Fall ... more

LSM303DLM.cpp

Committer:
shimniok
Date:
2012-01-20
Revision:
0:faef9e4c8bea
Child:
1:fc5c9258ec45

File content as of revision 0:faef9e4c8bea:

#include "mbed.h"
#include "LSM303DLM.h"
#include "stdio.h"

#define MAG_ADDRESS  0x3C
#define ACC_ADDRESS  0x30

LSM303DLM::LSM303DLM(PinName sda, PinName scl): _device(sda, scl)
{
    _device.frequency(400000);
    init();
}

void LSM303DLM::init()
{
    // init mag
    // continuous conversion mode
    _data[0] = MR_REG_M;
    _data[1] = 0x00;
    if (!_device.write(MAG_ADDRESS, _data, 2))
        fprintf(stdout, "MR_REG_M: no ack\n");
    // data rate 75hz
    _data[0] = CRA_REG_M;
    _data[1] = 0x18; // 0b00011000
    if (_device.write(MAG_ADDRESS, _data, 2))
        fprintf(stdout, "CRA_REG_M: no ack\n");
    
    // init acc
    // data rate 100hz 
    _data[0] = CTRL_REG1_A;
    _data[1] = 0x2F; // 0b00101111
    if (!_device.write(ACC_ADDRESS, _data, 2))
        fprintf(stdout, "CTRL_REG1_A: no ack\n");
}

void LSM303DLM::read(int a[3], int m[3])
{
    readAcc(a);
    readMag(m);   
}

void LSM303DLM::readAcc(int a[3])
{
    _data[0] = OUT_X_L_A | (1<<7);
    _device.write(ACC_ADDRESS, _data, 1);
    _device.read(ACC_ADDRESS, _data, 6);

    // 12-bit values
    a[0] = (short) (_data[0] | _data[1]<<8)>>4; 
    a[1] = (short) (_data[2] | _data[3]<<8)>>4;
    a[2] = (short) (_data[4] | _data[5]<<8)>>4;
}

void LSM303DLM::readMag(int m[3])
{
    _data[0] = OUT_X_H_M;
    _device.write(MAG_ADDRESS, _data, 1);
    _device.read(MAG_ADDRESS, _data, 6);
    
    m[0] = (short) _data[0]<<8 | _data[1]; // X
    m[1] = (short) _data[4]<<8 | _data[5]; // Y
    m[2] = (short) _data[2]<<8 | _data[3]; // Z
}