Self test boot program for testing icarus sensors

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_UARTConsole by Bluetooth Low Energy

Committer:
smigielski
Date:
Wed Apr 15 20:01:16 2015 +0000
Revision:
14:cb369746225d
Parent:
13:ef0ce8fa871f
ADXL362 self test working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
smigielski 8:e9ae7a01d866 1 #include "ADXL362Sensor.h"
smigielski 13:ef0ce8fa871f 2
smigielski 8:e9ae7a01d866 3
smigielski 8:e9ae7a01d866 4
smigielski 13:ef0ce8fa871f 5 ADXL362Sensor::ADXL362Sensor(SPI& spi_,DigitalOut& cs_,void (*debug_)(const char* format, ...)) : BaseSensor(debug_), spi(spi_), cs(cs_) {
smigielski 12:9076e6453115 6 cs = UP;
smigielski 14:cb369746225d 7 writeRegister(ADXL362_SOFT_RESET, 0x52);
smigielski 14:cb369746225d 8 wait_ms(1);
smigielski 14:cb369746225d 9 writeRegister(ADXL362_POWER_CTL,0x02);
smigielski 8:e9ae7a01d866 10 }
smigielski 13:ef0ce8fa871f 11
smigielski 8:e9ae7a01d866 12
smigielski 8:e9ae7a01d866 13 char* ADXL362Sensor::getSimpleName() {
smigielski 8:e9ae7a01d866 14 return "ADXL362";
smigielski 8:e9ae7a01d866 15 }
smigielski 8:e9ae7a01d866 16
smigielski 8:e9ae7a01d866 17
smigielski 9:ed3636e1873f 18 uint32_t ADXL362Sensor::verifyIntegrity(uint32_t* errorResult) {
smigielski 14:cb369746225d 19 LOG("Start verfication of ADXL362 Sensor\r\n");
smigielski 9:ed3636e1873f 20 uint32_t errors = 0;
smigielski 9:ed3636e1873f 21 //Device id is 0xAD
smigielski 9:ed3636e1873f 22 //Device mems id is 0x1D
smigielski 9:ed3636e1873f 23 //Part id is 0xF2
smigielski 10:3a24c970db40 24 uint32_t sensorId = readRegister32(ADXL362_DEVID_AD);
smigielski 9:ed3636e1873f 25
smigielski 9:ed3636e1873f 26 if (sensorId >> 8 !=0xAD1DF2){
smigielski 9:ed3636e1873f 27 errorResult[errors++] = ERROR_WRONG_DEVICE_ID;
smigielski 14:cb369746225d 28 LOG("Wrong sensorId: %X\r\n",sensorId);
smigielski 9:ed3636e1873f 29 }
smigielski 9:ed3636e1873f 30
smigielski 9:ed3636e1873f 31 //check status registry
smigielski 10:3a24c970db40 32 uint8_t status = readRegister(ADXL362_STATUS);
smigielski 9:ed3636e1873f 33
smigielski 9:ed3636e1873f 34 //indicate that SEU error was detetcted
smigielski 9:ed3636e1873f 35 if (status & (1 << 7)){
smigielski 14:cb369746225d 36 errorResult[errors++] = ERROR_WRONG_DEVICE_STATE;
smigielski 14:cb369746225d 37 LOG("SEU error detected: %X\r\n",status);
smigielski 9:ed3636e1873f 38 }
smigielski 9:ed3636e1873f 39 //check that chip is in awaken state
smigielski 9:ed3636e1873f 40 if (!(status & (1 << 6))){
smigielski 9:ed3636e1873f 41 errorResult[errors++] = ERROR_DEVICE_SLEEPING;
smigielski 14:cb369746225d 42 LOG("Chip not awaken: %X\r\n",status);
smigielski 9:ed3636e1873f 43 }
smigielski 9:ed3636e1873f 44
smigielski 9:ed3636e1873f 45 //perform self test
smigielski 9:ed3636e1873f 46 errors+=selfTest(&errorResult[errors]);
smigielski 9:ed3636e1873f 47
smigielski 9:ed3636e1873f 48 return errors;
smigielski 8:e9ae7a01d866 49 }
smigielski 8:e9ae7a01d866 50
smigielski 8:e9ae7a01d866 51 void ADXL362Sensor::getSensorDetails(sensor_t* sensorDetails) {
smigielski 8:e9ae7a01d866 52
smigielski 8:e9ae7a01d866 53 }
smigielski 8:e9ae7a01d866 54
smigielski 9:ed3636e1873f 55 uint32_t ADXL362Sensor::selfTest(uint32_t* errorResult){
smigielski 9:ed3636e1873f 56 uint32_t errors = 0;
smigielski 9:ed3636e1873f 57 // 0. base data
smigielski 9:ed3636e1873f 58 int16_t x12,y12,z12;
smigielski 9:ed3636e1873f 59 int16_t test_x12,test_y12,test_z12;
smigielski 9:ed3636e1873f 60 // 1. Read acceleration data for the x-, y-, and z-axes.
smigielski 13:ef0ce8fa871f 61 refreshAcceleration12(&x12, &y12, &z12);
smigielski 9:ed3636e1873f 62 // 2. Assert self test by setting the ST bit in the SELF_TEST register, Address 0x2E.
smigielski 10:3a24c970db40 63 writeRegister(ADXL362_SELF_TEST,0x01);
smigielski 9:ed3636e1873f 64 // 3. Wait 1/ODR for the output to settle to its new value.
smigielski 14:cb369746225d 65 wait(4.0/ADXL362_ODR);
smigielski 9:ed3636e1873f 66 // 4. Read acceleration data for the x-, y-, and z-axes.
smigielski 9:ed3636e1873f 67 refreshAcceleration12(&test_x12, &test_y12, &test_z12);
smigielski 9:ed3636e1873f 68 // 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 14:cb369746225d 69 float reactionX = (test_x12-x12) * 0.250f;
smigielski 14:cb369746225d 70 float reactionY = (test_y12-y12) * 0.250f;
smigielski 14:cb369746225d 71 float reactionZ = (test_z12-z12) * 0.250f;
smigielski 14:cb369746225d 72
smigielski 9:ed3636e1873f 73
smigielski 14:cb369746225d 74 if (reactionX<230.0F || reactionX>870.0F ||
smigielski 14:cb369746225d 75 reactionY<-870.0F || reactionY>-230.0F ||
smigielski 14:cb369746225d 76 reactionZ<270.0F || reactionZ>800.0F){
smigielski 14:cb369746225d 77 errorResult[errors++] = ERROR_ACCE_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 13:ef0ce8fa871f 82 writeRegister(ADXL362_SELF_TEST,0x00);
smigielski 14:cb369746225d 83 wait(4.0/ADXL362_ODR);
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 12:9076e6453115 91 cs = DOWN;
smigielski 12:9076e6453115 92 spi.write(ADXL362_READ_REGISTER);
smigielski 12:9076e6453115 93 spi.write(ADXL362_DATA_12);
smigielski 9:ed3636e1873f 94
smigielski 9:ed3636e1873f 95 for (int i = 0; i < 6; i++) {
smigielski 12:9076e6453115 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 12:9076e6453115 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 12:9076e6453115 108 cs = DOWN;
smigielski 12:9076e6453115 109 spi.write(ADXL362_READ_REGISTER);
smigielski 12:9076e6453115 110 spi.write(reg);
smigielski 9:ed3636e1873f 111 for (int i=0;i<4;i++){
smigielski 12:9076e6453115 112 val[i] = spi.write(0x00);
smigielski 9:ed3636e1873f 113 }
smigielski 12:9076e6453115 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 12:9076e6453115 121 cs = DOWN;
smigielski 12:9076e6453115 122 spi.write(ADXL362_READ_REGISTER);
smigielski 12:9076e6453115 123 spi.write(reg);
smigielski 12:9076e6453115 124 uint8_t val = spi.write(0x00);
smigielski 12:9076e6453115 125 cs = 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 12:9076e6453115 130 cs = DOWN;
smigielski 12:9076e6453115 131 spi.write(ADXL362_WRITE_REGISTER);
smigielski 12:9076e6453115 132 spi.write(reg);
smigielski 12:9076e6453115 133 spi.write(cmd);
smigielski 12:9076e6453115 134 cs = UP;
smigielski 9:ed3636e1873f 135 }