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@1:76f65416ae1b, 2012-05-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |