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.
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 }
Generated on Wed Jul 13 2022 13:24:50 by 1.7.2