SPS30 library

Dependents:   IZU2021_SPS30 Hybrid_IZU2021_MISSION_v2 Hybrid_IZU2021_MISSION

Committer:
ziqiyap
Date:
Tue Mar 05 07:01:55 2019 +0000
Revision:
2:549bee9a4cd0
Parent:
0:9221dac25d3b
Child:
4:7558ddc3c7d6
added auto clean and manual clean class methods

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ziqiyap 0:9221dac25d3b 1 #include "mbed.h"
ziqiyap 0:9221dac25d3b 2 #include "sps30.h"
ziqiyap 0:9221dac25d3b 3
ziqiyap 0:9221dac25d3b 4 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 5 // Constructor
ziqiyap 0:9221dac25d3b 6
ziqiyap 0:9221dac25d3b 7 sps30::sps30(PinName sda, PinName scl, int i2cFrequency) : _i2c(sda, scl) {
ziqiyap 0:9221dac25d3b 8 _i2c.frequency(i2cFrequency);
ziqiyap 0:9221dac25d3b 9 }
ziqiyap 0:9221dac25d3b 10
ziqiyap 0:9221dac25d3b 11 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 12 // Destructor
ziqiyap 0:9221dac25d3b 13
ziqiyap 0:9221dac25d3b 14 sps30::~sps30() {
ziqiyap 0:9221dac25d3b 15 }
ziqiyap 0:9221dac25d3b 16
ziqiyap 0:9221dac25d3b 17 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 18 // start auto-measurement
ziqiyap 0:9221dac25d3b 19 //
ziqiyap 0:9221dac25d3b 20
ziqiyap 2:549bee9a4cd0 21 uint8_t sps30::startMeasurement()
ziqiyap 0:9221dac25d3b 22 {
ziqiyap 0:9221dac25d3b 23 i2cBuff[0] = SPS30_CMMD_STRT_MEAS >> 8;
ziqiyap 0:9221dac25d3b 24 i2cBuff[1] = SPS30_CMMD_STRT_MEAS & 255;
ziqiyap 0:9221dac25d3b 25 i2cBuff[2] = 0x03;
ziqiyap 0:9221dac25d3b 26 i2cBuff[3] = 0x00;
ziqiyap 0:9221dac25d3b 27 i2cBuff[4] = sps30::calcCrc2b(0x0300);
ziqiyap 0:9221dac25d3b 28 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 5, false);
ziqiyap 0:9221dac25d3b 29 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 30 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 31 }
ziqiyap 0:9221dac25d3b 32
ziqiyap 0:9221dac25d3b 33 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 34 // Stop auto-measurement
ziqiyap 0:9221dac25d3b 35
ziqiyap 2:549bee9a4cd0 36 uint8_t sps30::stopMeasurement()
ziqiyap 0:9221dac25d3b 37 {
ziqiyap 0:9221dac25d3b 38 i2cBuff[0] = SPS30_CMMD_STOP_MEAS >> 8;
ziqiyap 0:9221dac25d3b 39 i2cBuff[1] = SPS30_CMMD_STOP_MEAS & 255;
ziqiyap 0:9221dac25d3b 40 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 41 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 42 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 43 }
ziqiyap 0:9221dac25d3b 44
ziqiyap 0:9221dac25d3b 45 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 46 // Get ready status value
ziqiyap 0:9221dac25d3b 47
ziqiyap 2:549bee9a4cd0 48 uint8_t sps30::getReadyStatus()
ziqiyap 0:9221dac25d3b 49 {
ziqiyap 0:9221dac25d3b 50 i2cBuff[0] = SPS30_CMMD_GET_READY_STAT >> 8;
ziqiyap 0:9221dac25d3b 51 i2cBuff[1] = SPS30_CMMD_GET_READY_STAT & 255;
ziqiyap 0:9221dac25d3b 52 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 53 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 54
ziqiyap 0:9221dac25d3b 55 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 3, false);
ziqiyap 0:9221dac25d3b 56 uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
ziqiyap 0:9221dac25d3b 57 ready = stat;
ziqiyap 0:9221dac25d3b 58 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
ziqiyap 0:9221dac25d3b 59
ziqiyap 0:9221dac25d3b 60 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 61 if(dat == SPSisReady) return SPSisReady;
ziqiyap 0:9221dac25d3b 62 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 63 }
ziqiyap 0:9221dac25d3b 64
ziqiyap 0:9221dac25d3b 65 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 66 // Get all the measurement values, stick them into the array
ziqiyap 0:9221dac25d3b 67
ziqiyap 2:549bee9a4cd0 68 uint8_t sps30::readMeasurement()
ziqiyap 0:9221dac25d3b 69 {
ziqiyap 0:9221dac25d3b 70 i2cBuff[0] = SPS30_CMMD_READ_MEAS >> 8;
ziqiyap 0:9221dac25d3b 71 i2cBuff[1] = SPS30_CMMD_READ_MEAS & 255;
ziqiyap 0:9221dac25d3b 72 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 73 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 74
ziqiyap 0:9221dac25d3b 75 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 60, false);
ziqiyap 0:9221dac25d3b 76
ziqiyap 0:9221dac25d3b 77 uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
ziqiyap 0:9221dac25d3b 78 mass_1p0_m = stat;
ziqiyap 0:9221dac25d3b 79 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
ziqiyap 0:9221dac25d3b 80 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 81
ziqiyap 0:9221dac25d3b 82 stat = (i2cBuff[3] << 8) | i2cBuff[4];
ziqiyap 0:9221dac25d3b 83 mass_1p0_l = stat;
ziqiyap 0:9221dac25d3b 84 dat = sps30::checkCrc2b(stat, i2cBuff[5]);
ziqiyap 0:9221dac25d3b 85 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 86
ziqiyap 0:9221dac25d3b 87
ziqiyap 0:9221dac25d3b 88
ziqiyap 0:9221dac25d3b 89 stat = (i2cBuff[6] << 8) | i2cBuff[7];
ziqiyap 0:9221dac25d3b 90 mass_2p5_m = stat;
ziqiyap 0:9221dac25d3b 91 dat = sps30::checkCrc2b(stat, i2cBuff[8]);
ziqiyap 0:9221dac25d3b 92 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 93
ziqiyap 0:9221dac25d3b 94 stat = (i2cBuff[9] << 8) | i2cBuff[10];
ziqiyap 0:9221dac25d3b 95 mass_2p5_l = stat;
ziqiyap 0:9221dac25d3b 96 dat = sps30::checkCrc2b(stat, i2cBuff[11]);
ziqiyap 0:9221dac25d3b 97 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 98
ziqiyap 0:9221dac25d3b 99
ziqiyap 0:9221dac25d3b 100
ziqiyap 0:9221dac25d3b 101 stat = (i2cBuff[12] << 8) | i2cBuff[13];
ziqiyap 0:9221dac25d3b 102 mass_4p0_m = stat;
ziqiyap 0:9221dac25d3b 103 dat = sps30::checkCrc2b(stat, i2cBuff[14]);
ziqiyap 0:9221dac25d3b 104 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 105
ziqiyap 0:9221dac25d3b 106 stat = (i2cBuff[15] << 8) | i2cBuff[16];
ziqiyap 0:9221dac25d3b 107 mass_4p0_l = stat;
ziqiyap 0:9221dac25d3b 108 dat = sps30::checkCrc2b(stat, i2cBuff[17]);
ziqiyap 0:9221dac25d3b 109 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 110
ziqiyap 0:9221dac25d3b 111
ziqiyap 0:9221dac25d3b 112
ziqiyap 0:9221dac25d3b 113 stat = (i2cBuff[18] << 8) | i2cBuff[19];
ziqiyap 0:9221dac25d3b 114 mass_10p0_m = stat;
ziqiyap 0:9221dac25d3b 115 dat = sps30::checkCrc2b(stat, i2cBuff[20]);
ziqiyap 0:9221dac25d3b 116 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 117
ziqiyap 0:9221dac25d3b 118 stat = (i2cBuff[21] << 8) | i2cBuff[22];
ziqiyap 0:9221dac25d3b 119 mass_10p0_l = stat;
ziqiyap 0:9221dac25d3b 120 dat = sps30::checkCrc2b(stat, i2cBuff[23]);
ziqiyap 0:9221dac25d3b 121 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 122
ziqiyap 0:9221dac25d3b 123
ziqiyap 0:9221dac25d3b 124
ziqiyap 0:9221dac25d3b 125 stat = (i2cBuff[24] << 8) | i2cBuff[25];
ziqiyap 0:9221dac25d3b 126 num_0p5_m = stat;
ziqiyap 0:9221dac25d3b 127 dat = sps30::checkCrc2b(stat, i2cBuff[26]);
ziqiyap 0:9221dac25d3b 128 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 129
ziqiyap 0:9221dac25d3b 130 stat = (i2cBuff[27] << 8) | i2cBuff[28];
ziqiyap 0:9221dac25d3b 131 num_0p5_l = stat;
ziqiyap 0:9221dac25d3b 132 dat = sps30::checkCrc2b(stat, i2cBuff[29]);
ziqiyap 0:9221dac25d3b 133 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 134
ziqiyap 0:9221dac25d3b 135
ziqiyap 0:9221dac25d3b 136 stat = (i2cBuff[30] << 8) | i2cBuff[31];
ziqiyap 0:9221dac25d3b 137 num_1p0_m = stat;
ziqiyap 0:9221dac25d3b 138 dat = sps30::checkCrc2b(stat, i2cBuff[32]);
ziqiyap 0:9221dac25d3b 139 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 140
ziqiyap 0:9221dac25d3b 141 stat = (i2cBuff[33] << 8) | i2cBuff[34];
ziqiyap 0:9221dac25d3b 142 num_1p0_l = stat;
ziqiyap 0:9221dac25d3b 143 dat = sps30::checkCrc2b(stat, i2cBuff[35]);
ziqiyap 0:9221dac25d3b 144 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 145
ziqiyap 0:9221dac25d3b 146
ziqiyap 0:9221dac25d3b 147
ziqiyap 0:9221dac25d3b 148 stat = (i2cBuff[36] << 8) | i2cBuff[37];
ziqiyap 0:9221dac25d3b 149 num_2p5_m = stat;
ziqiyap 0:9221dac25d3b 150 dat = sps30::checkCrc2b(stat, i2cBuff[38]);
ziqiyap 0:9221dac25d3b 151 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 152
ziqiyap 0:9221dac25d3b 153 stat = (i2cBuff[39] << 8) | i2cBuff[40];
ziqiyap 0:9221dac25d3b 154 num_2p5_l = stat;
ziqiyap 0:9221dac25d3b 155 dat = sps30::checkCrc2b(stat, i2cBuff[41]);
ziqiyap 0:9221dac25d3b 156 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 157
ziqiyap 0:9221dac25d3b 158
ziqiyap 0:9221dac25d3b 159
ziqiyap 0:9221dac25d3b 160 stat = (i2cBuff[42] << 8) | i2cBuff[43];
ziqiyap 0:9221dac25d3b 161 num_4p0_m = stat;
ziqiyap 0:9221dac25d3b 162 dat = sps30::checkCrc2b(stat, i2cBuff[44]);
ziqiyap 0:9221dac25d3b 163 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 164
ziqiyap 0:9221dac25d3b 165 stat = (i2cBuff[45] << 8) | i2cBuff[46];
ziqiyap 0:9221dac25d3b 166 num_4p0_l = stat;
ziqiyap 0:9221dac25d3b 167 dat = sps30::checkCrc2b(stat, i2cBuff[47]);
ziqiyap 0:9221dac25d3b 168 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 169
ziqiyap 0:9221dac25d3b 170
ziqiyap 0:9221dac25d3b 171 stat = (i2cBuff[48] << 8) | i2cBuff[49];
ziqiyap 0:9221dac25d3b 172 num_10p0_m = stat;
ziqiyap 0:9221dac25d3b 173 dat = sps30::checkCrc2b(stat, i2cBuff[50]);
ziqiyap 0:9221dac25d3b 174 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 175
ziqiyap 0:9221dac25d3b 176 stat = (i2cBuff[51] << 8) | i2cBuff[52];
ziqiyap 0:9221dac25d3b 177 num_10p0_l = stat;
ziqiyap 0:9221dac25d3b 178 dat = sps30::checkCrc2b(stat, i2cBuff[53]);
ziqiyap 0:9221dac25d3b 179 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 180
ziqiyap 0:9221dac25d3b 181
ziqiyap 0:9221dac25d3b 182 stat = (i2cBuff[54] << 8) | i2cBuff[55];
ziqiyap 0:9221dac25d3b 183 typ_pm_size_m = stat;
ziqiyap 0:9221dac25d3b 184 dat = sps30::checkCrc2b(stat, i2cBuff[56]);
ziqiyap 0:9221dac25d3b 185 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 186
ziqiyap 0:9221dac25d3b 187 stat = (i2cBuff[57] << 8) | i2cBuff[58];
ziqiyap 0:9221dac25d3b 188 typ_pm_size_l = stat;
ziqiyap 0:9221dac25d3b 189 dat = sps30::checkCrc2b(stat, i2cBuff[59]);
ziqiyap 0:9221dac25d3b 190 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 191
ziqiyap 0:9221dac25d3b 192 mass_1p0_i = (mass_1p0_m << 16) | mass_1p0_l;
ziqiyap 0:9221dac25d3b 193 mass_2p5_i = (mass_2p5_m << 16) | mass_2p5_l;
ziqiyap 0:9221dac25d3b 194 mass_4p0_i = (mass_4p0_m << 16) | mass_4p0_l;
ziqiyap 0:9221dac25d3b 195 mass_10p0_i = (mass_10p0_m << 16) | mass_10p0_l;
ziqiyap 0:9221dac25d3b 196
ziqiyap 0:9221dac25d3b 197 num_0p5_i = (num_0p5_m << 16) | num_0p5_l;
ziqiyap 0:9221dac25d3b 198 num_1p0_i = (num_1p0_m << 16) | num_1p0_l;
ziqiyap 0:9221dac25d3b 199 num_2p5_i = (num_2p5_m << 16) | num_2p5_l;
ziqiyap 0:9221dac25d3b 200 num_4p0_i = (num_4p0_m << 16) | num_4p0_l;
ziqiyap 0:9221dac25d3b 201 num_10p0_i = (num_10p0_m << 16) | num_10p0_l;
ziqiyap 0:9221dac25d3b 202
ziqiyap 0:9221dac25d3b 203 typ_pm_size_i = (typ_pm_size_m << 16) | typ_pm_size_l;
ziqiyap 0:9221dac25d3b 204
ziqiyap 0:9221dac25d3b 205 mass_1p0_f = *(float*)&mass_1p0_i;
ziqiyap 0:9221dac25d3b 206 mass_2p5_f = *(float*)&mass_2p5_i;
ziqiyap 0:9221dac25d3b 207 mass_4p0_f = *(float*)&mass_4p0_i;
ziqiyap 0:9221dac25d3b 208 mass_10p0_f = *(float*)&mass_10p0_i;
ziqiyap 0:9221dac25d3b 209
ziqiyap 0:9221dac25d3b 210 num_0p5_f = *(float*)&num_0p5_i;
ziqiyap 0:9221dac25d3b 211 num_1p0_f = *(float*)&num_1p0_i;
ziqiyap 0:9221dac25d3b 212 num_2p5_f = *(float*)&num_2p5_i;
ziqiyap 0:9221dac25d3b 213 num_4p0_f = *(float*)&num_4p0_i;
ziqiyap 0:9221dac25d3b 214 num_10p0_f = *(float*)&num_10p0_i;
ziqiyap 0:9221dac25d3b 215
ziqiyap 0:9221dac25d3b 216 typ_pm_size_f = *(float*)&typ_pm_size_i;
ziqiyap 0:9221dac25d3b 217
ziqiyap 0:9221dac25d3b 218 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 219 }
ziqiyap 0:9221dac25d3b 220
ziqiyap 0:9221dac25d3b 221 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 222 // Calculate the CRC of a 2 byte value using the SPS30 CRC polynomial
ziqiyap 0:9221dac25d3b 223
ziqiyap 0:9221dac25d3b 224 uint8_t sps30::calcCrc2b(uint16_t seed)
ziqiyap 0:9221dac25d3b 225 {
ziqiyap 0:9221dac25d3b 226 uint8_t bit; // bit mask
ziqiyap 0:9221dac25d3b 227 uint8_t crc = SPS30_CRC_INIT; // calculated checksum
ziqiyap 0:9221dac25d3b 228
ziqiyap 0:9221dac25d3b 229 // calculates 8-Bit checksum with given polynomial
ziqiyap 0:9221dac25d3b 230
ziqiyap 0:9221dac25d3b 231 crc ^= (seed >> 8) & 255;
ziqiyap 0:9221dac25d3b 232 for(bit = 8; bit > 0; --bit)
ziqiyap 0:9221dac25d3b 233 {
ziqiyap 0:9221dac25d3b 234 if(crc & 0x80) crc = (crc << 1) ^ SPS30_POLYNOMIAL;
ziqiyap 0:9221dac25d3b 235 else crc = (crc << 1);
ziqiyap 0:9221dac25d3b 236 }
ziqiyap 0:9221dac25d3b 237
ziqiyap 0:9221dac25d3b 238 crc ^= seed & 255;
ziqiyap 0:9221dac25d3b 239 for(bit = 8; bit > 0; --bit)
ziqiyap 0:9221dac25d3b 240 {
ziqiyap 0:9221dac25d3b 241 if(crc & 0x80) crc = (crc << 1) ^ SPS30_POLYNOMIAL;
ziqiyap 0:9221dac25d3b 242 else crc = (crc << 1);
ziqiyap 0:9221dac25d3b 243 }
ziqiyap 0:9221dac25d3b 244
ziqiyap 0:9221dac25d3b 245 return crc;
ziqiyap 0:9221dac25d3b 246 }
ziqiyap 0:9221dac25d3b 247
ziqiyap 0:9221dac25d3b 248 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 249 // Compare the CRC values
ziqiyap 0:9221dac25d3b 250
ziqiyap 0:9221dac25d3b 251 uint8_t sps30::checkCrc2b(uint16_t seed, uint8_t crcIn)
ziqiyap 0:9221dac25d3b 252 {
ziqiyap 0:9221dac25d3b 253 uint8_t crcCalc = sps30::calcCrc2b(seed);
ziqiyap 0:9221dac25d3b 254 if(crcCalc != crcIn) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 255 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 256 }
ziqiyap 0:9221dac25d3b 257
ziqiyap 0:9221dac25d3b 258 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 259 // Get article code
ziqiyap 0:9221dac25d3b 260
ziqiyap 0:9221dac25d3b 261 uint8_t sps30::getArticleCode()
ziqiyap 0:9221dac25d3b 262 {
ziqiyap 0:9221dac25d3b 263 i2cBuff[0] = SPS30_CMMD_READ_ARTICLECODE >> 8;
ziqiyap 0:9221dac25d3b 264 i2cBuff[1] = SPS30_CMMD_READ_ARTICLECODE & 255;
ziqiyap 0:9221dac25d3b 265 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 266 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 267
ziqiyap 0:9221dac25d3b 268 int i = 0;
ziqiyap 0:9221dac25d3b 269 for(i = 0; i < sizeof(acode); i++) acode[i] = 0;
ziqiyap 0:9221dac25d3b 270 for(i = 0; i < sizeof(i2cBuff); i++) i2cBuff[i] = 0;
ziqiyap 0:9221dac25d3b 271
ziqiyap 0:9221dac25d3b 272 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, SPS30_ACODE_SIZE, false);
ziqiyap 0:9221dac25d3b 273 int t = 0;
ziqiyap 0:9221dac25d3b 274 for(i = 0; i < SPS30_ACODE_SIZE; i +=3) {
ziqiyap 0:9221dac25d3b 275 uint16_t stat = (i2cBuff[i] << 8) | i2cBuff[i + 1];
ziqiyap 0:9221dac25d3b 276 acode[i - t] = stat >> 8;
ziqiyap 0:9221dac25d3b 277 acode[i - t + 1] = stat & 255;
ziqiyap 0:9221dac25d3b 278 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[i + 2]);
ziqiyap 0:9221dac25d3b 279 t++;
ziqiyap 0:9221dac25d3b 280 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 281 if(stat == 0) break;
ziqiyap 0:9221dac25d3b 282 }
ziqiyap 0:9221dac25d3b 283
ziqiyap 0:9221dac25d3b 284 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 285 }
ziqiyap 0:9221dac25d3b 286
ziqiyap 0:9221dac25d3b 287 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 288 // Get sps30 serial number
ziqiyap 0:9221dac25d3b 289
ziqiyap 0:9221dac25d3b 290 uint8_t sps30::getSerialNumber()
ziqiyap 0:9221dac25d3b 291 {
ziqiyap 0:9221dac25d3b 292 i2cBuff[0] = SPS30_CMMD_READ_SERIALNBR >> 8;
ziqiyap 0:9221dac25d3b 293 i2cBuff[1] = SPS30_CMMD_READ_SERIALNBR & 255;
ziqiyap 0:9221dac25d3b 294 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 295 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 296
ziqiyap 0:9221dac25d3b 297 int i = 0;
ziqiyap 0:9221dac25d3b 298 for(i = 0; i < sizeof(sn); i++) sn[i] = 0;
ziqiyap 0:9221dac25d3b 299 for(i = 0; i < sizeof(i2cBuff); i++) i2cBuff[i] = 0;
ziqiyap 0:9221dac25d3b 300
ziqiyap 0:9221dac25d3b 301 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, SPS30_SN_SIZE, false);
ziqiyap 0:9221dac25d3b 302 int t = 0;
ziqiyap 0:9221dac25d3b 303 for(i = 0; i < SPS30_SN_SIZE; i +=3) {
ziqiyap 0:9221dac25d3b 304 uint16_t stat = (i2cBuff[i] << 8) | i2cBuff[i + 1];
ziqiyap 0:9221dac25d3b 305 sn[i - t] = stat >> 8;
ziqiyap 0:9221dac25d3b 306 sn[i - t + 1] = stat & 255;
ziqiyap 0:9221dac25d3b 307 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[i + 2]);
ziqiyap 0:9221dac25d3b 308 t++;
ziqiyap 0:9221dac25d3b 309 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 310 if(stat == 0) break;
ziqiyap 0:9221dac25d3b 311 }
ziqiyap 0:9221dac25d3b 312
ziqiyap 0:9221dac25d3b 313 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 314 }
ziqiyap 0:9221dac25d3b 315
ziqiyap 0:9221dac25d3b 316 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 317 // Read Auto Cleaning Interval on the SPS30
ziqiyap 2:549bee9a4cd0 318
ziqiyap 2:549bee9a4cd0 319 uint8_t sps30::readAutoCleanInterval()
ziqiyap 2:549bee9a4cd0 320 {
ziqiyap 2:549bee9a4cd0 321 i2cBuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 2:549bee9a4cd0 322 i2cBuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 323
ziqiyap 2:549bee9a4cd0 324 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 2:549bee9a4cd0 325 if(res) return SPSnoAckERROR;
ziqiyap 2:549bee9a4cd0 326
ziqiyap 2:549bee9a4cd0 327 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 6, false);
ziqiyap 2:549bee9a4cd0 328
ziqiyap 2:549bee9a4cd0 329 uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
ziqiyap 2:549bee9a4cd0 330 clean_interval_m = stat;
ziqiyap 2:549bee9a4cd0 331 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
ziqiyap 2:549bee9a4cd0 332 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 333
ziqiyap 2:549bee9a4cd0 334 stat = (i2cBuff[3] << 8) | i2cBuff[4];
ziqiyap 2:549bee9a4cd0 335 clean_interval_l = stat;
ziqiyap 2:549bee9a4cd0 336 dat = sps30::checkCrc2b(stat, i2cBuff[5]);
ziqiyap 2:549bee9a4cd0 337 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 338
ziqiyap 2:549bee9a4cd0 339 clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
ziqiyap 2:549bee9a4cd0 340
ziqiyap 2:549bee9a4cd0 341 return SPSnoERROR;
ziqiyap 2:549bee9a4cd0 342 }
ziqiyap 2:549bee9a4cd0 343
ziqiyap 2:549bee9a4cd0 344 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 345 // Set Auto Cleaning Interval on the SPS30
ziqiyap 2:549bee9a4cd0 346
ziqiyap 2:549bee9a4cd0 347 uint8_t sps30::setAutoCleanInterval(uint32_t set_interval)
ziqiyap 2:549bee9a4cd0 348 {
ziqiyap 2:549bee9a4cd0 349 uint16_t set_interval_m = set_interval >> 16;
ziqiyap 2:549bee9a4cd0 350 uint16_t set_interval_l = set_interval & 65535;
ziqiyap 2:549bee9a4cd0 351
ziqiyap 2:549bee9a4cd0 352 i2cBuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 2:549bee9a4cd0 353 i2cBuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 354
ziqiyap 2:549bee9a4cd0 355 i2cBuff[2] = set_interval_m >> 8;
ziqiyap 2:549bee9a4cd0 356 i2cBuff[3] = set_interval_m & 255;
ziqiyap 2:549bee9a4cd0 357 i2cBuff[4] = sps30::calcCrc2b(set_interval_m);
ziqiyap 2:549bee9a4cd0 358
ziqiyap 2:549bee9a4cd0 359 i2cBuff[5] = set_interval_l >> 8;
ziqiyap 2:549bee9a4cd0 360 i2cBuff[6] = set_interval_l & 255;
ziqiyap 2:549bee9a4cd0 361 i2cBuff[7] = sps30::calcCrc2b(set_interval_l);
ziqiyap 2:549bee9a4cd0 362
ziqiyap 2:549bee9a4cd0 363 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 8, false);
ziqiyap 2:549bee9a4cd0 364 if(res) return SPSnoAckERROR;
ziqiyap 2:549bee9a4cd0 365
ziqiyap 2:549bee9a4cd0 366 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 6, false);
ziqiyap 2:549bee9a4cd0 367
ziqiyap 2:549bee9a4cd0 368 uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
ziqiyap 2:549bee9a4cd0 369 clean_interval_m = stat;
ziqiyap 2:549bee9a4cd0 370 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
ziqiyap 2:549bee9a4cd0 371 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 372
ziqiyap 2:549bee9a4cd0 373 stat = (i2cBuff[3] << 8) | i2cBuff[4];
ziqiyap 2:549bee9a4cd0 374 clean_interval_l = stat;
ziqiyap 2:549bee9a4cd0 375 dat = sps30::checkCrc2b(stat, i2cBuff[5]);
ziqiyap 2:549bee9a4cd0 376 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 377
ziqiyap 2:549bee9a4cd0 378 clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
ziqiyap 2:549bee9a4cd0 379
ziqiyap 2:549bee9a4cd0 380 return SPSnoERROR;
ziqiyap 2:549bee9a4cd0 381 }
ziqiyap 2:549bee9a4cd0 382
ziqiyap 2:549bee9a4cd0 383 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 384 // Perform manual fan cleaning
ziqiyap 2:549bee9a4cd0 385
ziqiyap 2:549bee9a4cd0 386 uint8_t sps30::startFanClean()
ziqiyap 2:549bee9a4cd0 387 {
ziqiyap 2:549bee9a4cd0 388 i2cBuff[0] = SPS30_CMMD_START_FAN_CLEAN >> 8;
ziqiyap 2:549bee9a4cd0 389 i2cBuff[1] = SPS30_CMMD_START_FAN_CLEAN & 255;
ziqiyap 2:549bee9a4cd0 390 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 2:549bee9a4cd0 391 if(res) return SPSnoAckERROR;
ziqiyap 2:549bee9a4cd0 392 return SPSnoERROR;
ziqiyap 2:549bee9a4cd0 393 }
ziqiyap 2:549bee9a4cd0 394
ziqiyap 2:549bee9a4cd0 395 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 396 // Perform a soft reset on the SPS30
ziqiyap 0:9221dac25d3b 397
ziqiyap 0:9221dac25d3b 398 uint8_t sps30::softReset()
ziqiyap 0:9221dac25d3b 399 {
ziqiyap 0:9221dac25d3b 400 i2cBuff[0] = SPS30_CMMD_SOFT_RESET >> 8;
ziqiyap 0:9221dac25d3b 401 i2cBuff[1] = SPS30_CMMD_SOFT_RESET & 255;
ziqiyap 0:9221dac25d3b 402 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 403 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 404 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 405 }