Added mag calibration and interrupt-based data ready
Dependencies: BLE_API mbed-src nRF51822
Diff: EM7180.h
- Revision:
- 4:8d11bfc7cac0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EM7180.h Thu Sep 22 01:21:24 2016 +0000 @@ -0,0 +1,124 @@ +#ifndef EM7180_H +#define EM7180_H + +//#include "mbed.h" + +// EM7180 SENtral register map +// see http://www.emdeveloper.com/downloads/7180/EMSentral_EM7180_Register_Map_v1_3.pdf +// +#define EM7180_QX 0x00 // this is a 32-bit normalized floating point number read from registers 0x00-03 +#define EM7180_QY 0x04 // this is a 32-bit normalized floating point number read from registers 0x04-07 +#define EM7180_QZ 0x08 // this is a 32-bit normalized floating point number read from registers 0x08-0B +#define EM7180_QW 0x0C // this is a 32-bit normalized floating point number read from registers 0x0C-0F +#define EM7180_QTIME 0x10 // this is a 16-bit unsigned integer read from registers 0x10-11 +#define EM7180_MX 0x12 // int16_t from registers 0x12-13 +#define EM7180_MY 0x14 // int16_t from registers 0x14-15 +#define EM7180_MZ 0x16 // int16_t from registers 0x16-17 +#define EM7180_MTIME 0x18 // uint16_t from registers 0x18-19 +#define EM7180_AX 0x1A // int16_t from registers 0x1A-1B +#define EM7180_AY 0x1C // int16_t from registers 0x1C-1D +#define EM7180_AZ 0x1E // int16_t from registers 0x1E-1F +#define EM7180_ATIME 0x20 // uint16_t from registers 0x20-21 +#define EM7180_GX 0x22 // int16_t from registers 0x22-23 +#define EM7180_GY 0x24 // int16_t from registers 0x24-25 +#define EM7180_GZ 0x26 // int16_t from registers 0x26-27 +#define EM7180_GTIME 0x28 // uint16_t from registers 0x28-29 +#define EM7180_Baro 0x2A // start of two-byte MS5637 pressure data, 16-bit signed interger +#define EM7180_BaroTIME 0x2C // start of two-byte MS5637 pressure timestamp, 16-bit unsigned +#define EM7180_Temp 0x2E // start of two-byte MS5637 temperature data, 16-bit signed interger +#define EM7180_TempTIME 0x30 // start of two-byte MS5637 temperature timestamp, 16-bit unsigned +#define EM7180_QRateDivisor 0x32 // uint8_t +#define EM7180_EnableEvents 0x33 +#define EM7180_HostControl 0x34 +#define EM7180_EventStatus 0x35 +#define EM7180_SensorStatus 0x36 +#define EM7180_SentralStatus 0x37 +#define EM7180_AlgorithmStatus 0x38 +#define EM7180_FeatureFlags 0x39 +#define EM7180_ParamAcknowledge 0x3A +#define EM7180_SavedParamByte0 0x3B +#define EM7180_SavedParamByte1 0x3C +#define EM7180_SavedParamByte2 0x3D +#define EM7180_SavedParamByte3 0x3E +#define EM7180_ActualMagRate 0x45 +#define EM7180_ActualAccelRate 0x46 +#define EM7180_ActualGyroRate 0x47 +#define EM7180_ActualBaroRate 0x48 +#define EM7180_ActualTempRate 0x49 +#define EM7180_ErrorRegister 0x50 +#define EM7180_AlgorithmControl 0x54 +#define EM7180_MagRate 0x55 +#define EM7180_AccelRate 0x56 +#define EM7180_GyroRate 0x57 +#define EM7180_BaroRate 0x58 +#define EM7180_TempRate 0x59 +#define EM7180_LoadParamByte0 0x60 +#define EM7180_LoadParamByte1 0x61 +#define EM7180_LoadParamByte2 0x62 +#define EM7180_LoadParamByte3 0x63 +#define EM7180_ParamRequest 0x64 +#define EM7180_ROMVersion1 0x70 +#define EM7180_ROMVersion2 0x71 +#define EM7180_RAMVersion1 0x72 +#define EM7180_RAMVersion2 0x73 +#define EM7180_ProductID 0x90 +#define EM7180_RevisionID 0x91 +#define EM7180_RunStatus 0x92 +#define EM7180_UploadAddress 0x94 // uint16_t registers 0x94 (MSB)-5(LSB) +#define EM7180_UploadData 0x96 +#define EM7180_CRCHost 0x97 // uint32_t from registers 0x97-9A +#define EM7180_ResetRequest 0x9B +#define EM7180_PassThruStatus 0x9E +#define EM7180_PassThruControl 0xA0 +#define EM7180_ACC_LPF_BW 0x5B //Register GP36 +#define EM7180_GYRO_LPF_BW 0x5C //Register GP37 +#define EM7180_BARO_LPF_BW 0x5D //Register GP38 + +#define EM7180_ADDRESS 0x28<<1 // Address of the EM7180 SENtral sensor hub + + +class EM7180 { + + protected: + + public: + //=================================================================================================================== +//====== Set of useful function to access pressure and temperature data +//=================================================================================================================== + + + void writeByte(uint8_t address, uint8_t subAddress, uint8_t data) +{ + char data_write[2]; + data_write[0] = subAddress; + data_write[1] = data; + i2c.write(address, data_write, 2, 0); +} + + char readByte(uint8_t address, uint8_t subAddress) +{ + char data[1]; // `data` will store the register data + char data_write[1]; + data_write[0] = subAddress; + i2c.write(address, data_write, 1, 1); // no stop + i2c.read(address, data, 1, 0); + return data[0]; +} + + void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest) +{ + char data[24]; + char data_write[1]; + data_write[0] = subAddress; + i2c.write(address, data_write, 1, 1); // no stop + i2c.read(address, data, count, 0); + for(int ii = 0; ii < count; ii++) { + dest[ii] = data[ii]; + } +} + + + + + }; +#endif \ No newline at end of file