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.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AK8975.cpp Source File

AK8975.cpp

00001 /**
00002  * Includes
00003  */
00004 #include "AK8975.h"
00005 
00006 AK8975::AK8975(PinName sda, PinName scl, char address) : connection(sda, scl) {
00007     deviceAddress=address;   
00008 }
00009 
00010 bool AK8975::testConnection( void ) {
00011     char temp;
00012     temp = this->read(AK8975_ID_REG);
00013     return (temp==0x48);
00014 }
00015 
00016 bool AK8975::isReady( void ) {
00017     char temp;
00018     temp = this->read(AK8975_ST1_REG);
00019     temp &= 1<<AK8975_DRDY_BIT;
00020     return (temp==1<<AK8975_DRDY_BIT);
00021 }
00022 
00023 int AK8975::getX( void ) {
00024     short retval;
00025     char data[2];
00026     this->read(AK8975_X_REG, data, 2);
00027     retval = (data[1]<<8) + data[0];
00028     return (int)retval;
00029 }
00030 
00031 int AK8975::getY( void ) {
00032     short retval;
00033     char data[2];
00034     this->read(AK8975_Y_REG, data, 2);
00035     retval = (data[1]<<8) + data[0];
00036     return (int)retval;
00037 }
00038 
00039 int AK8975::getZ( void ) {
00040     short retval;
00041     char data[2];
00042     this->read(AK8975_Z_REG, data, 2);
00043     retval = (data[1]<<8) + data[0];
00044     return (int)retval;
00045 }
00046 
00047 
00048 void AK8975::getAll( int *data ) {
00049     char temp[6];
00050     this->read(AK8975_X_REG, temp, 6);
00051     data[0] = (int)(short)(temp[1]<<8) + temp[0];
00052     data[1] = (int)(short)(temp[3]<<8) + temp[2];
00053     data[2] = (int)(short)(temp[5]<<8) + temp[4];        
00054 }    
00055 
00056 bool AK8975::getDataError( void ) {
00057     char temp;
00058     temp = this->read(AK8975_ST2_REG);
00059     temp &= 1<<AK8975_DERROR_BIT;
00060     return (temp==1<<AK8975_DERROR_BIT);
00061 }
00062 
00063 bool AK8975::getOverflow( void ) {
00064     char temp;
00065     temp = this->read(AK8975_ST2_REG);
00066     temp &= 1<<AK8975_OFLOW_BIT;
00067     return (temp==1<<AK8975_OFLOW_BIT);
00068 }
00069 
00070 void AK8975::startMeasurement( void ) {
00071     this->write(AK8975_CONTROL_REG, AK8975_SINGLE_MEASUREMENT);
00072 }
00073 
00074 //--------------------------------------------------
00075 //-------------------PRIVATE------------------------
00076 //--------------------------------------------------
00077 
00078 void AK8975::write(char address, char data) {
00079     char temp[2];
00080     temp[0]=address;
00081     temp[1]=data;
00082     
00083     connection.write(deviceAddress * 2,temp,2);
00084 }
00085 
00086 char AK8975::read(char address) {
00087     char retval;
00088     connection.write(deviceAddress * 2, &address, 1, true);
00089     connection.read(deviceAddress * 2, &retval, 1);
00090     return retval;
00091 }
00092 
00093 void AK8975::read(char address, char *data, int length) {
00094     connection.write(deviceAddress * 2, &address, 1, true);
00095     connection.read(deviceAddress * 2, data, length);
00096 }