Basic library for interfacing the AK8975 using I2C. It does not include more advanced functions. The datasheet does not include what the self-test should return for example, so this library does not include the self-test function.

Committer:
Sissors
Date:
Mon May 07 12:01:10 2012 +0000
Revision:
1:76f65416ae1b
Parent:
0:bceb91239894
v1.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:bceb91239894 1 /**
Sissors 0:bceb91239894 2 * Includes
Sissors 0:bceb91239894 3 */
Sissors 0:bceb91239894 4 #include "AK8975.h"
Sissors 0:bceb91239894 5
Sissors 0:bceb91239894 6 AK8975::AK8975(PinName sda, PinName scl, char address) : connection(sda, scl) {
Sissors 0:bceb91239894 7 deviceAddress=address;
Sissors 0:bceb91239894 8 }
Sissors 0:bceb91239894 9
Sissors 0:bceb91239894 10 bool AK8975::testConnection( void ) {
Sissors 0:bceb91239894 11 char temp;
Sissors 0:bceb91239894 12 temp = this->read(AK8975_ID_REG);
Sissors 0:bceb91239894 13 return (temp==0x48);
Sissors 0:bceb91239894 14 }
Sissors 0:bceb91239894 15
Sissors 0:bceb91239894 16 bool AK8975::isReady( void ) {
Sissors 0:bceb91239894 17 char temp;
Sissors 0:bceb91239894 18 temp = this->read(AK8975_ST1_REG);
Sissors 0:bceb91239894 19 temp &= 1<<AK8975_DRDY_BIT;
Sissors 0:bceb91239894 20 return (temp==1<<AK8975_DRDY_BIT);
Sissors 0:bceb91239894 21 }
Sissors 0:bceb91239894 22
Sissors 0:bceb91239894 23 int AK8975::getX( void ) {
Sissors 0:bceb91239894 24 short retval;
Sissors 0:bceb91239894 25 char data[2];
Sissors 0:bceb91239894 26 this->read(AK8975_X_REG, data, 2);
Sissors 0:bceb91239894 27 retval = (data[1]<<8) + data[0];
Sissors 0:bceb91239894 28 return (int)retval;
Sissors 0:bceb91239894 29 }
Sissors 0:bceb91239894 30
Sissors 0:bceb91239894 31 int AK8975::getY( void ) {
Sissors 0:bceb91239894 32 short retval;
Sissors 0:bceb91239894 33 char data[2];
Sissors 0:bceb91239894 34 this->read(AK8975_Y_REG, data, 2);
Sissors 0:bceb91239894 35 retval = (data[1]<<8) + data[0];
Sissors 0:bceb91239894 36 return (int)retval;
Sissors 0:bceb91239894 37 }
Sissors 0:bceb91239894 38
Sissors 0:bceb91239894 39 int AK8975::getZ( void ) {
Sissors 0:bceb91239894 40 short retval;
Sissors 0:bceb91239894 41 char data[2];
Sissors 0:bceb91239894 42 this->read(AK8975_Z_REG, data, 2);
Sissors 0:bceb91239894 43 retval = (data[1]<<8) + data[0];
Sissors 0:bceb91239894 44 return (int)retval;
Sissors 0:bceb91239894 45 }
Sissors 0:bceb91239894 46
Sissors 0:bceb91239894 47
Sissors 0:bceb91239894 48 void AK8975::getAll( int *data ) {
Sissors 0:bceb91239894 49 char temp[6];
Sissors 0:bceb91239894 50 this->read(AK8975_X_REG, temp, 6);
Sissors 0:bceb91239894 51 data[0] = (int)(short)(temp[1]<<8) + temp[0];
Sissors 0:bceb91239894 52 data[1] = (int)(short)(temp[3]<<8) + temp[2];
Sissors 0:bceb91239894 53 data[2] = (int)(short)(temp[5]<<8) + temp[4];
Sissors 0:bceb91239894 54 }
Sissors 0:bceb91239894 55
Sissors 0:bceb91239894 56 bool AK8975::getDataError( void ) {
Sissors 0:bceb91239894 57 char temp;
Sissors 0:bceb91239894 58 temp = this->read(AK8975_ST2_REG);
Sissors 0:bceb91239894 59 temp &= 1<<AK8975_DERROR_BIT;
Sissors 0:bceb91239894 60 return (temp==1<<AK8975_DERROR_BIT);
Sissors 0:bceb91239894 61 }
Sissors 0:bceb91239894 62
Sissors 0:bceb91239894 63 bool AK8975::getOverflow( void ) {
Sissors 0:bceb91239894 64 char temp;
Sissors 0:bceb91239894 65 temp = this->read(AK8975_ST2_REG);
Sissors 0:bceb91239894 66 temp &= 1<<AK8975_OFLOW_BIT;
Sissors 0:bceb91239894 67 return (temp==1<<AK8975_OFLOW_BIT);
Sissors 0:bceb91239894 68 }
Sissors 0:bceb91239894 69
Sissors 0:bceb91239894 70 void AK8975::startMeasurement( void ) {
Sissors 0:bceb91239894 71 this->write(AK8975_CONTROL_REG, AK8975_SINGLE_MEASUREMENT);
Sissors 0:bceb91239894 72 }
Sissors 0:bceb91239894 73
Sissors 0:bceb91239894 74 //--------------------------------------------------
Sissors 0:bceb91239894 75 //-------------------PRIVATE------------------------
Sissors 0:bceb91239894 76 //--------------------------------------------------
Sissors 0:bceb91239894 77
Sissors 0:bceb91239894 78 void AK8975::write(char address, char data) {
Sissors 0:bceb91239894 79 char temp[2];
Sissors 0:bceb91239894 80 temp[0]=address;
Sissors 0:bceb91239894 81 temp[1]=data;
Sissors 0:bceb91239894 82
Sissors 0:bceb91239894 83 connection.write(deviceAddress * 2,temp,2);
Sissors 0:bceb91239894 84 }
Sissors 0:bceb91239894 85
Sissors 0:bceb91239894 86 char AK8975::read(char address) {
Sissors 0:bceb91239894 87 char retval;
Sissors 0:bceb91239894 88 connection.write(deviceAddress * 2, &address, 1, true);
Sissors 0:bceb91239894 89 connection.read(deviceAddress * 2, &retval, 1);
Sissors 0:bceb91239894 90 return retval;
Sissors 0:bceb91239894 91 }
Sissors 0:bceb91239894 92
Sissors 0:bceb91239894 93 void AK8975::read(char address, char *data, int length) {
Sissors 0:bceb91239894 94 connection.write(deviceAddress * 2, &address, 1, true);
Sissors 0:bceb91239894 95 connection.read(deviceAddress * 2, data, length);
Sissors 0:bceb91239894 96 }