Self test boot program for testing icarus sensors

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_UARTConsole by Bluetooth Low Energy

Committer:
smigielski
Date:
Tue Jan 27 12:30:51 2015 +0000
Revision:
9:ed3636e1873f
Parent:
8:e9ae7a01d866
Child:
10:3a24c970db40
ADXL362 is compiling

Who changed what in which revision?

UserRevisionLine numberNew contents of line
smigielski 8:e9ae7a01d866 1 #include "ADXL362Sensor.h"
smigielski 8:e9ae7a01d866 2 #include "mbed.h"
smigielski 8:e9ae7a01d866 3
smigielski 8:e9ae7a01d866 4 #ifndef LOG
smigielski 8:e9ae7a01d866 5 #define LOG(...) do printf(__VA_ARGS__); while (0)
smigielski 8:e9ae7a01d866 6 #endif
smigielski 8:e9ae7a01d866 7
smigielski 8:e9ae7a01d866 8 ADXL362Sensor::ADXL362Sensor(SPI* spi_,DigitalOut* cs_) : BaseSensor() {
smigielski 8:e9ae7a01d866 9 this->spi=spi_;
smigielski 8:e9ae7a01d866 10 this->cs=cs_;
smigielski 9:ed3636e1873f 11 *cs = UP;
smigielski 8:e9ae7a01d866 12 }
smigielski 8:e9ae7a01d866 13
smigielski 8:e9ae7a01d866 14 char* ADXL362Sensor::getSimpleName() {
smigielski 8:e9ae7a01d866 15 return "ADXL362";
smigielski 8:e9ae7a01d866 16 }
smigielski 8:e9ae7a01d866 17
smigielski 8:e9ae7a01d866 18
smigielski 9:ed3636e1873f 19 uint32_t ADXL362Sensor::verifyIntegrity(uint32_t* errorResult) {
smigielski 8:e9ae7a01d866 20 LOG("Start verfication of ADXL362 Sensor");
smigielski 9:ed3636e1873f 21 uint32_t errors = 0;
smigielski 9:ed3636e1873f 22 //Device id is 0xAD
smigielski 9:ed3636e1873f 23 //Device mems id is 0x1D
smigielski 9:ed3636e1873f 24 //Part id is 0xF2
smigielski 9:ed3636e1873f 25 uint32_t sensorId = readRegister32(DEVID_AD);
smigielski 9:ed3636e1873f 26
smigielski 9:ed3636e1873f 27 if (sensorId >> 8 !=0xAD1DF2){
smigielski 9:ed3636e1873f 28 errorResult[errors++] = ERROR_WRONG_DEVICE_ID;
smigielski 9:ed3636e1873f 29 LOG("Wrong sensorId: %X",sensorId);
smigielski 9:ed3636e1873f 30 }
smigielski 9:ed3636e1873f 31
smigielski 9:ed3636e1873f 32 //check status registry
smigielski 9:ed3636e1873f 33 uint8_t status = readRegister(STATUS);
smigielski 9:ed3636e1873f 34
smigielski 9:ed3636e1873f 35 //indicate that SEU error was detetcted
smigielski 9:ed3636e1873f 36 if (status & (1 << 7)){
smigielski 9:ed3636e1873f 37 errorResult[errors++] = ERROR_SEU_ERROR_DETECT;
smigielski 9:ed3636e1873f 38 LOG("SEU error detected: %X",status);
smigielski 9:ed3636e1873f 39 }
smigielski 9:ed3636e1873f 40 //check that chip is in awaken state
smigielski 9:ed3636e1873f 41 if (!(status & (1 << 6))){
smigielski 9:ed3636e1873f 42 errorResult[errors++] = ERROR_DEVICE_SLEEPING;
smigielski 9:ed3636e1873f 43 LOG("Chip not awaken: %X",status);
smigielski 9:ed3636e1873f 44 }
smigielski 9:ed3636e1873f 45
smigielski 9:ed3636e1873f 46 //perform self test
smigielski 9:ed3636e1873f 47 errors+=selfTest(&errorResult[errors]);
smigielski 9:ed3636e1873f 48
smigielski 9:ed3636e1873f 49 return errors;
smigielski 8:e9ae7a01d866 50 }
smigielski 8:e9ae7a01d866 51
smigielski 8:e9ae7a01d866 52 void ADXL362Sensor::getSensorDetails(sensor_t* sensorDetails) {
smigielski 8:e9ae7a01d866 53
smigielski 8:e9ae7a01d866 54 }
smigielski 8:e9ae7a01d866 55
smigielski 9:ed3636e1873f 56 uint32_t ADXL362Sensor::selfTest(uint32_t* errorResult){
smigielski 9:ed3636e1873f 57 uint32_t errors = 0;
smigielski 9:ed3636e1873f 58 // 0. base data
smigielski 9:ed3636e1873f 59 int16_t x12,y12,z12;
smigielski 9:ed3636e1873f 60 int16_t test_x12,test_y12,test_z12;
smigielski 9:ed3636e1873f 61 // 1. Read acceleration data for the x-, y-, and z-axes.
smigielski 9:ed3636e1873f 62 refreshAcceleration12(&x12, &y12, &z12);
smigielski 9:ed3636e1873f 63 // 2. Assert self test by setting the ST bit in the SELF_TEST register, Address 0x2E.
smigielski 9:ed3636e1873f 64 writeRegister(SELF_TEST,0x01);
smigielski 9:ed3636e1873f 65 // 3. Wait 1/ODR for the output to settle to its new value.
smigielski 9:ed3636e1873f 66
smigielski 9:ed3636e1873f 67 // 4. Read acceleration data for the x-, y-, and z-axes.
smigielski 9:ed3636e1873f 68 refreshAcceleration12(&test_x12, &test_y12, &test_z12);
smigielski 9:ed3636e1873f 69 // 5. Compare to the values from Step 1, and convert the difference from LSB to mg by multiplying by the sensitivity. If the observed difference falls within the self test output change specification listed in Table 1, then the device passes self test and is deemed operational.
smigielski 9:ed3636e1873f 70 float reactionX = (x12-test_x12)* ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD / SELF_TEST_SCALE_FACTOR;
smigielski 9:ed3636e1873f 71 float reactionY = (y12-test_y12)* ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD / SELF_TEST_SCALE_FACTOR;
smigielski 9:ed3636e1873f 72 float reactionZ = (z12-test_z12)* ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD / SELF_TEST_SCALE_FACTOR;
smigielski 9:ed3636e1873f 73
smigielski 9:ed3636e1873f 74 if (reactionX<0.450F || reactionX>0.710F ||
smigielski 9:ed3636e1873f 75 reactionY<-0.710F || reactionY>-0.450F ||
smigielski 9:ed3636e1873f 76 reactionZ<0.350F || reactionZ>0.650F){
smigielski 9:ed3636e1873f 77 errorResult[errors++] = ERROR_SELF_TEST_FAILED;
smigielski 9:ed3636e1873f 78 LOG("Reaction: %+5.3f %+5.3f %+5.3f\r\n",reactionX,reactionY,reactionZ);
smigielski 9:ed3636e1873f 79 }
smigielski 9:ed3636e1873f 80
smigielski 9:ed3636e1873f 81 // 6. Deassert self test by clearing the ST bit in the SELF_TEST register, Address 0x2E.
smigielski 9:ed3636e1873f 82 writeRegister(SELF_TEST,0x01);
smigielski 9:ed3636e1873f 83
smigielski 9:ed3636e1873f 84 return errors;
smigielski 9:ed3636e1873f 85 }
smigielski 9:ed3636e1873f 86
smigielski 9:ed3636e1873f 87 void ADXL362Sensor::refreshAcceleration12(int16_t* x, int16_t* y, int16_t* z)
smigielski 9:ed3636e1873f 88 {
smigielski 9:ed3636e1873f 89 int16_t xyzVal[6] = {0, 0, 0, 0, 0, 0};
smigielski 9:ed3636e1873f 90
smigielski 9:ed3636e1873f 91 *cs = DOWN;
smigielski 9:ed3636e1873f 92 spi->write(READ_REGISTER);
smigielski 9:ed3636e1873f 93 spi->write(DATA_12);
smigielski 9:ed3636e1873f 94
smigielski 9:ed3636e1873f 95 for (int i = 0; i < 6; i++) {
smigielski 9:ed3636e1873f 96 xyzVal[i] = spi->write(0x00);
smigielski 9:ed3636e1873f 97 }
smigielski 9:ed3636e1873f 98
smigielski 9:ed3636e1873f 99 *x = (xyzVal[1] << 8) + xyzVal[0];
smigielski 9:ed3636e1873f 100 *y = (xyzVal[3] << 8) + xyzVal[2];
smigielski 9:ed3636e1873f 101 *z = (xyzVal[5] << 8) + xyzVal[4];
smigielski 9:ed3636e1873f 102
smigielski 9:ed3636e1873f 103 *cs = UP;
smigielski 9:ed3636e1873f 104 }
smigielski 9:ed3636e1873f 105
smigielski 9:ed3636e1873f 106 uint32_t ADXL362Sensor::readRegister32( uint8_t reg){
smigielski 9:ed3636e1873f 107 uint32_t val[4] = {0,0,0,0};
smigielski 9:ed3636e1873f 108 *cs = DOWN;
smigielski 9:ed3636e1873f 109 spi->write(READ_REGISTER);
smigielski 9:ed3636e1873f 110 spi->write(reg);
smigielski 9:ed3636e1873f 111 for (int i=0;i<4;i++){
smigielski 9:ed3636e1873f 112 val[i] = spi->write(0x00);
smigielski 9:ed3636e1873f 113 }
smigielski 9:ed3636e1873f 114 *cs = UP;
smigielski 9:ed3636e1873f 115
smigielski 9:ed3636e1873f 116 return (val[0] << 24) + (val[1] << 16) + (val[2] << 8) + val[3];
smigielski 9:ed3636e1873f 117 }
smigielski 8:e9ae7a01d866 118
smigielski 8:e9ae7a01d866 119
smigielski 9:ed3636e1873f 120 uint8_t ADXL362Sensor::readRegister( uint8_t reg){
smigielski 9:ed3636e1873f 121 cs->write(DOWN);
smigielski 9:ed3636e1873f 122 spi->write(READ_REGISTER);
smigielski 9:ed3636e1873f 123 spi->write(reg);
smigielski 9:ed3636e1873f 124 uint8_t val = spi->write(0x00);
smigielski 9:ed3636e1873f 125 cs->write(UP);
smigielski 9:ed3636e1873f 126 return (val);
smigielski 9:ed3636e1873f 127 }
smigielski 9:ed3636e1873f 128
smigielski 9:ed3636e1873f 129 void ADXL362Sensor::writeRegister( uint8_t reg, uint8_t cmd ){
smigielski 9:ed3636e1873f 130 cs->write(DOWN);
smigielski 9:ed3636e1873f 131 spi->write(WRITE_REGISTER);
smigielski 9:ed3636e1873f 132 spi->write(reg);
smigielski 9:ed3636e1873f 133 spi->write(cmd);
smigielski 9:ed3636e1873f 134 cs->write(UP);
smigielski 9:ed3636e1873f 135 }