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.h
- Committer:
- Sissors
- Date:
- 2012-05-07
- Revision:
- 0:bceb91239894
- Child:
- 1:76f65416ae1b
File content as of revision 0:bceb91239894:
/* Library for AK8975 digital compass IC, for use with I2C This library contains basic functionality, if you want more, make it ;) Example program: #include "mbed.h" #include "AK8975.h" DigitalOut led1(LED1); Serial pc(USBTX, USBRX); // tx, rx AK8975 mag(p9,p10,0x0E); int main() { int data[3]; if (mag.testConnection()) pc.printf("Connection succeeded. \n"); else pc.printf("Connection failed. \n"); while(1) { led1=!led1; mag.startMeasurement(); wait(0.5); //(or use the isReady() function) mag.getAll(data); pc.printf("X: %d", data[0]); pc.putc('\n'); pc.printf("Y: %d", data[1]); pc.putc('\n'); pc.printf("Z: %d", data[2]); pc.putc('\n'); } } */ #ifndef AK8975_H #define AK8975_H /** * Includes */ #include "mbed.h" /** * Registers */ #define AK8975_ID_REG 0x00 #define AK8975_ST1_REG 0x02 #define AK8975_X_REG 0x03 #define AK8975_Y_REG 0x05 #define AK8975_Z_REG 0x07 #define AK8975_ST2_REG 0x09 #define AK8975_CONTROL_REG 0x0A #define AK8975_SELFTEST_REG 0x0C /** * Bits */ #define AK8975_DRDY_BIT 0 #define AK8975_DERROR_BIT 2 #define AK8975_OFLOW_BIT 3 #define AK8975_SINGLE_MEASUREMENT 1 #define AK8975_SENSITIVITY 0.3 class AK8975 { public: /** * Constructor. * * @param sda - mbed pin to use for the SDA I2C line. * @param scl - mbed pin to use for the SCL I2C line. * @param I2Caddress - the I2C address of the device (0x0C - 0x0F) */ AK8975(PinName sda, PinName scl, char address); /** * Checks connection with the device. * * @return - true if working connection, otherwise false */ bool testConnection( void ); /** * Checks if measurement is ready * * @return - true if available measurement, otherwise false */ bool isReady( void ); /** * Gets the X data * * @return - signed integer containing the raw data */ int getX( void ); /** * Gets the Y data * * @return - signed integer containing the raw data */ int getY( void ); /** * Gets the Z data * * @return - signed integer containing the raw data */ int getZ( void ); /** * Gets all the data, this is more efficient than calling the functions individually * * @param data - pointer to integer array with length 3 where data is stored (data[0]=X - data[1]=Y - data[2]=Z) */ void getAll( int *data ); /** * Checks if there is a data error due to reading at wrong moment * * @return - true for error, false for no error */ bool getDataError( void ); /** * Checks if a magnetic overflow happened (sensor saturation) * * @return - true for error, false for no error */ bool getOverflow( void ); /** * Starts a measurement cycle */ void startMeasurement( void ); private: I2C connection; char deviceAddress; /** * Writes data to the device * * @param adress - register address to write to * @param data - data to write */ void write( char address, char data); /** * Read data from the device * * @param adress - register address to write to * @return - data from the register specified by RA */ char read( char adress); /** * Read multtiple regigsters from the device, more efficient than using multiple normal reads. * * @param adress - register address to write to * @param length - number of bytes to read * @param data - pointer where the data needs to be written to */ void read( char adress, char *data, int length); }; #endif