MAG3110 Three-Axis, Digital Magnetmeter
Dependents: test_MAG3110 testSensor
MAG3110.cpp
- Committer:
- Rhyme
- Date:
- 2015-12-25
- Revision:
- 0:f9e4f54ab660
File content as of revision 0:f9e4f54ab660:
/* * File description here */ #include "MAG3110.h" /* some definitions here */ /* value registers */ #define MAG_DR_STATUS 0x01 #define MAG_OUT_X 0x02 #define MAG_OUT_Y 0x04 #define MAG_OUT_Z 0x06 #define MAG_WHO_AM_I 0x07 #define MAG_SYSMOD 0x08 #define MAG_OFF_X 0x09 #define MAG_OFF_Y 0x0B #define MAG_OFF_Z 0x0D #define MAG_DIE_TEMP 0x0F #define MAG_CTRL_REG1 0x10 #define MAG_CTRL_REG2 0x11 MAG3110::MAG3110(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { // activate the peripheral activate() ; } MAG3110::~MAG3110() { } void MAG3110::readRegs(int addr, uint8_t * data, int len) { char t[1] = {addr} ; m_i2c.write(m_addr, t, 1, true) ; m_i2c.read(m_addr, (char*)data, len) ; } void MAG3110::writeRegs(uint8_t * data, int len) { m_i2c.write(m_addr, (char *)data, len) ; } void MAG3110::standby(void) { uint8_t res[2] ; res[0] = MAG_CTRL_REG1 ; readRegs(MAG_CTRL_REG1, &res[1], 1) ; res[1] &= 0xFE ; writeRegs(res, 2) ; } void MAG3110::activate(void) { uint8_t res[2] ; // measurements with ODR = 80 Hz, OSR = 1 res[0] = MAG_CTRL_REG1 ; res[1] = 0x00 ; // standby! writeRegs(res, 2) ; res[0] = MAG_CTRL_REG2 ; res[1] = 0x80 ; // AUTO_MRST_EN writeRegs(res, 2) ; res[0] = MAG_CTRL_REG1 ; res[1] = 0x01 ; // activate! writeRegs(res, 2) ; } uint8_t MAG3110::getStatus() { uint8_t res[1] ; readRegs(MAG_DR_STATUS, res, 1) ; return( res[0] ) ; } int16_t MAG3110::getX() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_X, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } int16_t MAG3110::getY() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_Y, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } int16_t MAG3110::getZ() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_Z, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } uint8_t MAG3110::getID() { uint8_t res[1] ; readRegs(MAG_WHO_AM_I, res, 1) ; return( res[0] ) ; } int16_t MAG3110::getOffsetX() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_X, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } int16_t MAG3110::getOffsetY() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_Y, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } int16_t MAG3110::getOffsetZ() { int16_t value; uint8_t res[2]; readRegs(MAG_OUT_Z, res, 2) ; value = (res[0] << 8)+res[1] ; return( value ) ; } void MAG3110::setOffsetX(int16_t newOffset) { uint8_t res[3] ; res[0] = MAG_OFF_X ; res[1] = (newOffset >> 8)&0xFF ; res[2] = newOffset & 0xFF ; writeRegs(res, 3) ; } void MAG3110::setOffsetY(int16_t newOffset) { uint8_t res[3] ; res[0] = MAG_OFF_Y ; res[1] = (newOffset >> 8)&0xFF ; res[2] = newOffset & 0xFF ; writeRegs(res, 3) ; } void MAG3110::setOffsetZ(int16_t newOffset) { uint8_t res[3] ; res[0] = MAG_OFF_Z ; res[1] = (newOffset >> 8)&0xFF ; res[2] = newOffset & 0xFF ; writeRegs(res, 3) ; } uint8_t MAG3110::getCtrlReg1() { uint8_t res[1]; readRegs(MAG_CTRL_REG1, res, 1) ; return( res[0] ) ; } uint8_t MAG3110::getCtrlReg2() { uint8_t res[1]; readRegs(MAG_CTRL_REG2, res, 1) ; return( res[0] ) ; } void MAG3110::setCtrlReg1(uint8_t newValue) { uint8_t res[2] ; res[0] = MAG_CTRL_REG1 ; res[1] = newValue ; writeRegs(res, 2) ; } void MAG3110::setCtrlReg2(uint8_t newValue) { uint8_t res[2] ; res[0] = MAG_CTRL_REG2 ; res[1] = newValue ; writeRegs(res, 2) ; } uint8_t MAG3110::getTemp(void) { uint8_t temp[1] ; int8_t value ; readRegs(MAG_DIE_TEMP, temp, 1) ; /* if (temp[0] & 0x80) { // negative value = -(~(temp[0])+1) ; } else { value = temp[0] ; } return(value) ; */ return(temp[0]) ; }