Mbed library for SPS30 i2c communication

Committer:
ziqiyap
Date:
Mon Mar 04 05:58:42 2019 +0000
Revision:
0:9221dac25d3b
Child:
2:549bee9a4cd0
created sps30 library;

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 0:9221dac25d3b 18 // start auto-measurement with barometer reading (in mB)
ziqiyap 0:9221dac25d3b 19 //
ziqiyap 0:9221dac25d3b 20
ziqiyap 0:9221dac25d3b 21 uint8_t sps30::startMeasurement() // done
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 0:9221dac25d3b 36 uint8_t sps30::stopMeasurement() // done
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 0:9221dac25d3b 48 uint8_t sps30::getReadyStatus() // done
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 0:9221dac25d3b 68 uint8_t sps30::readMeasurement() // editing
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 /* TO DO: update the members used in the class */
ziqiyap 0:9221dac25d3b 78 uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
ziqiyap 0:9221dac25d3b 79 mass_1p0_m = stat;
ziqiyap 0:9221dac25d3b 80 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
ziqiyap 0:9221dac25d3b 81 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 82
ziqiyap 0:9221dac25d3b 83 stat = (i2cBuff[3] << 8) | i2cBuff[4];
ziqiyap 0:9221dac25d3b 84 mass_1p0_l = stat;
ziqiyap 0:9221dac25d3b 85 dat = sps30::checkCrc2b(stat, i2cBuff[5]);
ziqiyap 0:9221dac25d3b 86 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 87
ziqiyap 0:9221dac25d3b 88
ziqiyap 0:9221dac25d3b 89
ziqiyap 0:9221dac25d3b 90 stat = (i2cBuff[6] << 8) | i2cBuff[7];
ziqiyap 0:9221dac25d3b 91 mass_2p5_m = stat;
ziqiyap 0:9221dac25d3b 92 dat = sps30::checkCrc2b(stat, i2cBuff[8]);
ziqiyap 0:9221dac25d3b 93 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 94
ziqiyap 0:9221dac25d3b 95 stat = (i2cBuff[9] << 8) | i2cBuff[10];
ziqiyap 0:9221dac25d3b 96 mass_2p5_l = stat;
ziqiyap 0:9221dac25d3b 97 dat = sps30::checkCrc2b(stat, i2cBuff[11]);
ziqiyap 0:9221dac25d3b 98 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 99
ziqiyap 0:9221dac25d3b 100
ziqiyap 0:9221dac25d3b 101
ziqiyap 0:9221dac25d3b 102 stat = (i2cBuff[12] << 8) | i2cBuff[13];
ziqiyap 0:9221dac25d3b 103 mass_4p0_m = stat;
ziqiyap 0:9221dac25d3b 104 dat = sps30::checkCrc2b(stat, i2cBuff[14]);
ziqiyap 0:9221dac25d3b 105 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 106
ziqiyap 0:9221dac25d3b 107 stat = (i2cBuff[15] << 8) | i2cBuff[16];
ziqiyap 0:9221dac25d3b 108 mass_4p0_l = stat;
ziqiyap 0:9221dac25d3b 109 dat = sps30::checkCrc2b(stat, i2cBuff[17]);
ziqiyap 0:9221dac25d3b 110 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 111
ziqiyap 0:9221dac25d3b 112
ziqiyap 0:9221dac25d3b 113
ziqiyap 0:9221dac25d3b 114 stat = (i2cBuff[18] << 8) | i2cBuff[19];
ziqiyap 0:9221dac25d3b 115 mass_10p0_m = stat;
ziqiyap 0:9221dac25d3b 116 dat = sps30::checkCrc2b(stat, i2cBuff[20]);
ziqiyap 0:9221dac25d3b 117 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 118
ziqiyap 0:9221dac25d3b 119 stat = (i2cBuff[21] << 8) | i2cBuff[22];
ziqiyap 0:9221dac25d3b 120 mass_10p0_l = stat;
ziqiyap 0:9221dac25d3b 121 dat = sps30::checkCrc2b(stat, i2cBuff[23]);
ziqiyap 0:9221dac25d3b 122 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 123
ziqiyap 0:9221dac25d3b 124
ziqiyap 0:9221dac25d3b 125
ziqiyap 0:9221dac25d3b 126 stat = (i2cBuff[24] << 8) | i2cBuff[25];
ziqiyap 0:9221dac25d3b 127 num_0p5_m = stat;
ziqiyap 0:9221dac25d3b 128 dat = sps30::checkCrc2b(stat, i2cBuff[26]);
ziqiyap 0:9221dac25d3b 129 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 130
ziqiyap 0:9221dac25d3b 131 stat = (i2cBuff[27] << 8) | i2cBuff[28];
ziqiyap 0:9221dac25d3b 132 num_0p5_l = stat;
ziqiyap 0:9221dac25d3b 133 dat = sps30::checkCrc2b(stat, i2cBuff[29]);
ziqiyap 0:9221dac25d3b 134 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 135
ziqiyap 0:9221dac25d3b 136
ziqiyap 0:9221dac25d3b 137 stat = (i2cBuff[30] << 8) | i2cBuff[31];
ziqiyap 0:9221dac25d3b 138 num_1p0_m = stat;
ziqiyap 0:9221dac25d3b 139 dat = sps30::checkCrc2b(stat, i2cBuff[32]);
ziqiyap 0:9221dac25d3b 140 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 141
ziqiyap 0:9221dac25d3b 142 stat = (i2cBuff[33] << 8) | i2cBuff[34];
ziqiyap 0:9221dac25d3b 143 num_1p0_l = stat;
ziqiyap 0:9221dac25d3b 144 dat = sps30::checkCrc2b(stat, i2cBuff[35]);
ziqiyap 0:9221dac25d3b 145 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 146
ziqiyap 0:9221dac25d3b 147
ziqiyap 0:9221dac25d3b 148
ziqiyap 0:9221dac25d3b 149 stat = (i2cBuff[36] << 8) | i2cBuff[37];
ziqiyap 0:9221dac25d3b 150 num_2p5_m = stat;
ziqiyap 0:9221dac25d3b 151 dat = sps30::checkCrc2b(stat, i2cBuff[38]);
ziqiyap 0:9221dac25d3b 152 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 153
ziqiyap 0:9221dac25d3b 154 stat = (i2cBuff[39] << 8) | i2cBuff[40];
ziqiyap 0:9221dac25d3b 155 num_2p5_l = stat;
ziqiyap 0:9221dac25d3b 156 dat = sps30::checkCrc2b(stat, i2cBuff[41]);
ziqiyap 0:9221dac25d3b 157 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 158
ziqiyap 0:9221dac25d3b 159
ziqiyap 0:9221dac25d3b 160
ziqiyap 0:9221dac25d3b 161 stat = (i2cBuff[42] << 8) | i2cBuff[43];
ziqiyap 0:9221dac25d3b 162 num_4p0_m = stat;
ziqiyap 0:9221dac25d3b 163 dat = sps30::checkCrc2b(stat, i2cBuff[44]);
ziqiyap 0:9221dac25d3b 164 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 165
ziqiyap 0:9221dac25d3b 166 stat = (i2cBuff[45] << 8) | i2cBuff[46];
ziqiyap 0:9221dac25d3b 167 num_4p0_l = stat;
ziqiyap 0:9221dac25d3b 168 dat = sps30::checkCrc2b(stat, i2cBuff[47]);
ziqiyap 0:9221dac25d3b 169 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 170
ziqiyap 0:9221dac25d3b 171
ziqiyap 0:9221dac25d3b 172 stat = (i2cBuff[48] << 8) | i2cBuff[49];
ziqiyap 0:9221dac25d3b 173 num_10p0_m = stat;
ziqiyap 0:9221dac25d3b 174 dat = sps30::checkCrc2b(stat, i2cBuff[50]);
ziqiyap 0:9221dac25d3b 175 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 176
ziqiyap 0:9221dac25d3b 177 stat = (i2cBuff[51] << 8) | i2cBuff[52];
ziqiyap 0:9221dac25d3b 178 num_10p0_l = stat;
ziqiyap 0:9221dac25d3b 179 dat = sps30::checkCrc2b(stat, i2cBuff[53]);
ziqiyap 0:9221dac25d3b 180 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 181
ziqiyap 0:9221dac25d3b 182
ziqiyap 0:9221dac25d3b 183 stat = (i2cBuff[54] << 8) | i2cBuff[55];
ziqiyap 0:9221dac25d3b 184 typ_pm_size_m = stat;
ziqiyap 0:9221dac25d3b 185 dat = sps30::checkCrc2b(stat, i2cBuff[56]);
ziqiyap 0:9221dac25d3b 186 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 187
ziqiyap 0:9221dac25d3b 188 stat = (i2cBuff[57] << 8) | i2cBuff[58];
ziqiyap 0:9221dac25d3b 189 typ_pm_size_l = stat;
ziqiyap 0:9221dac25d3b 190 dat = sps30::checkCrc2b(stat, i2cBuff[59]);
ziqiyap 0:9221dac25d3b 191 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 192
ziqiyap 0:9221dac25d3b 193 mass_1p0_i = (mass_1p0_m << 16) | mass_1p0_l;
ziqiyap 0:9221dac25d3b 194 mass_2p5_i = (mass_2p5_m << 16) | mass_2p5_l;
ziqiyap 0:9221dac25d3b 195 mass_4p0_i = (mass_4p0_m << 16) | mass_4p0_l;
ziqiyap 0:9221dac25d3b 196 mass_10p0_i = (mass_10p0_m << 16) | mass_10p0_l;
ziqiyap 0:9221dac25d3b 197
ziqiyap 0:9221dac25d3b 198 num_0p5_i = (num_0p5_m << 16) | num_0p5_l;
ziqiyap 0:9221dac25d3b 199 num_1p0_i = (num_1p0_m << 16) | num_1p0_l;
ziqiyap 0:9221dac25d3b 200 num_2p5_i = (num_2p5_m << 16) | num_2p5_l;
ziqiyap 0:9221dac25d3b 201 num_4p0_i = (num_4p0_m << 16) | num_4p0_l;
ziqiyap 0:9221dac25d3b 202 num_10p0_i = (num_10p0_m << 16) | num_10p0_l;
ziqiyap 0:9221dac25d3b 203
ziqiyap 0:9221dac25d3b 204 typ_pm_size_i = (typ_pm_size_m << 16) | typ_pm_size_l;
ziqiyap 0:9221dac25d3b 205
ziqiyap 0:9221dac25d3b 206 mass_1p0_f = *(float*)&mass_1p0_i;
ziqiyap 0:9221dac25d3b 207 mass_2p5_f = *(float*)&mass_2p5_i;
ziqiyap 0:9221dac25d3b 208 mass_4p0_f = *(float*)&mass_4p0_i;
ziqiyap 0:9221dac25d3b 209 mass_10p0_f = *(float*)&mass_10p0_i;
ziqiyap 0:9221dac25d3b 210
ziqiyap 0:9221dac25d3b 211 num_0p5_f = *(float*)&num_0p5_i;
ziqiyap 0:9221dac25d3b 212 num_1p0_f = *(float*)&num_1p0_i;
ziqiyap 0:9221dac25d3b 213 num_2p5_f = *(float*)&num_2p5_i;
ziqiyap 0:9221dac25d3b 214 num_4p0_f = *(float*)&num_4p0_i;
ziqiyap 0:9221dac25d3b 215 num_10p0_f = *(float*)&num_10p0_i;
ziqiyap 0:9221dac25d3b 216
ziqiyap 0:9221dac25d3b 217 typ_pm_size_f = *(float*)&typ_pm_size_i;
ziqiyap 0:9221dac25d3b 218
ziqiyap 0:9221dac25d3b 219 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 220 }
ziqiyap 0:9221dac25d3b 221
ziqiyap 0:9221dac25d3b 222 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 223 // Calculate the CRC of a 2 byte value using the SPS30 CRC polynomial
ziqiyap 0:9221dac25d3b 224
ziqiyap 0:9221dac25d3b 225 uint8_t sps30::calcCrc2b(uint16_t seed)
ziqiyap 0:9221dac25d3b 226 {
ziqiyap 0:9221dac25d3b 227 uint8_t bit; // bit mask
ziqiyap 0:9221dac25d3b 228 uint8_t crc = SPS30_CRC_INIT; // calculated checksum
ziqiyap 0:9221dac25d3b 229
ziqiyap 0:9221dac25d3b 230 // calculates 8-Bit checksum with given polynomial
ziqiyap 0:9221dac25d3b 231
ziqiyap 0:9221dac25d3b 232 crc ^= (seed >> 8) & 255;
ziqiyap 0:9221dac25d3b 233 for(bit = 8; bit > 0; --bit)
ziqiyap 0:9221dac25d3b 234 {
ziqiyap 0:9221dac25d3b 235 if(crc & 0x80) crc = (crc << 1) ^ SPS30_POLYNOMIAL;
ziqiyap 0:9221dac25d3b 236 else crc = (crc << 1);
ziqiyap 0:9221dac25d3b 237 }
ziqiyap 0:9221dac25d3b 238
ziqiyap 0:9221dac25d3b 239 crc ^= seed & 255;
ziqiyap 0:9221dac25d3b 240 for(bit = 8; bit > 0; --bit)
ziqiyap 0:9221dac25d3b 241 {
ziqiyap 0:9221dac25d3b 242 if(crc & 0x80) crc = (crc << 1) ^ SPS30_POLYNOMIAL;
ziqiyap 0:9221dac25d3b 243 else crc = (crc << 1);
ziqiyap 0:9221dac25d3b 244 }
ziqiyap 0:9221dac25d3b 245
ziqiyap 0:9221dac25d3b 246 return crc;
ziqiyap 0:9221dac25d3b 247 }
ziqiyap 0:9221dac25d3b 248
ziqiyap 0:9221dac25d3b 249 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 250 // Compare the CRC values
ziqiyap 0:9221dac25d3b 251
ziqiyap 0:9221dac25d3b 252 uint8_t sps30::checkCrc2b(uint16_t seed, uint8_t crcIn)
ziqiyap 0:9221dac25d3b 253 {
ziqiyap 0:9221dac25d3b 254 uint8_t crcCalc = sps30::calcCrc2b(seed);
ziqiyap 0:9221dac25d3b 255 if(crcCalc != crcIn) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 256 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 257 }
ziqiyap 0:9221dac25d3b 258
ziqiyap 0:9221dac25d3b 259 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 260 // Get article code
ziqiyap 0:9221dac25d3b 261
ziqiyap 0:9221dac25d3b 262 uint8_t sps30::getArticleCode()
ziqiyap 0:9221dac25d3b 263 {
ziqiyap 0:9221dac25d3b 264 i2cBuff[0] = SPS30_CMMD_READ_ARTICLECODE >> 8;
ziqiyap 0:9221dac25d3b 265 i2cBuff[1] = SPS30_CMMD_READ_ARTICLECODE & 255;
ziqiyap 0:9221dac25d3b 266 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 267 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 268
ziqiyap 0:9221dac25d3b 269 int i = 0;
ziqiyap 0:9221dac25d3b 270 for(i = 0; i < sizeof(acode); i++) acode[i] = 0;
ziqiyap 0:9221dac25d3b 271 for(i = 0; i < sizeof(i2cBuff); i++) i2cBuff[i] = 0;
ziqiyap 0:9221dac25d3b 272
ziqiyap 0:9221dac25d3b 273 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, SPS30_ACODE_SIZE, false);
ziqiyap 0:9221dac25d3b 274 int t = 0;
ziqiyap 0:9221dac25d3b 275 for(i = 0; i < SPS30_ACODE_SIZE; i +=3) {
ziqiyap 0:9221dac25d3b 276 uint16_t stat = (i2cBuff[i] << 8) | i2cBuff[i + 1];
ziqiyap 0:9221dac25d3b 277 acode[i - t] = stat >> 8;
ziqiyap 0:9221dac25d3b 278 acode[i - t + 1] = stat & 255;
ziqiyap 0:9221dac25d3b 279 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[i + 2]);
ziqiyap 0:9221dac25d3b 280 t++;
ziqiyap 0:9221dac25d3b 281 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 282 if(stat == 0) break;
ziqiyap 0:9221dac25d3b 283 }
ziqiyap 0:9221dac25d3b 284
ziqiyap 0:9221dac25d3b 285 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 286 }
ziqiyap 0:9221dac25d3b 287
ziqiyap 0:9221dac25d3b 288 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 289 // Get sps30 serial number
ziqiyap 0:9221dac25d3b 290
ziqiyap 0:9221dac25d3b 291 uint8_t sps30::getSerialNumber()
ziqiyap 0:9221dac25d3b 292 {
ziqiyap 0:9221dac25d3b 293 i2cBuff[0] = SPS30_CMMD_READ_SERIALNBR >> 8;
ziqiyap 0:9221dac25d3b 294 i2cBuff[1] = SPS30_CMMD_READ_SERIALNBR & 255;
ziqiyap 0:9221dac25d3b 295 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 296 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 297
ziqiyap 0:9221dac25d3b 298 int i = 0;
ziqiyap 0:9221dac25d3b 299 for(i = 0; i < sizeof(sn); i++) sn[i] = 0;
ziqiyap 0:9221dac25d3b 300 for(i = 0; i < sizeof(i2cBuff); i++) i2cBuff[i] = 0;
ziqiyap 0:9221dac25d3b 301
ziqiyap 0:9221dac25d3b 302 _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, SPS30_SN_SIZE, false);
ziqiyap 0:9221dac25d3b 303 int t = 0;
ziqiyap 0:9221dac25d3b 304 for(i = 0; i < SPS30_SN_SIZE; i +=3) {
ziqiyap 0:9221dac25d3b 305 uint16_t stat = (i2cBuff[i] << 8) | i2cBuff[i + 1];
ziqiyap 0:9221dac25d3b 306 sn[i - t] = stat >> 8;
ziqiyap 0:9221dac25d3b 307 sn[i - t + 1] = stat & 255;
ziqiyap 0:9221dac25d3b 308 uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[i + 2]);
ziqiyap 0:9221dac25d3b 309 t++;
ziqiyap 0:9221dac25d3b 310 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 311 if(stat == 0) break;
ziqiyap 0:9221dac25d3b 312 }
ziqiyap 0:9221dac25d3b 313
ziqiyap 0:9221dac25d3b 314 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 315 }
ziqiyap 0:9221dac25d3b 316
ziqiyap 0:9221dac25d3b 317 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 318 // Perform a soft reset on the SPS30
ziqiyap 0:9221dac25d3b 319
ziqiyap 0:9221dac25d3b 320 uint8_t sps30::softReset()
ziqiyap 0:9221dac25d3b 321 {
ziqiyap 0:9221dac25d3b 322 i2cBuff[0] = SPS30_CMMD_SOFT_RESET >> 8;
ziqiyap 0:9221dac25d3b 323 i2cBuff[1] = SPS30_CMMD_SOFT_RESET & 255;
ziqiyap 0:9221dac25d3b 324 int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
ziqiyap 0:9221dac25d3b 325 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 326 return SPSnoERROR;
ziqiyap 0:9221dac25d3b 327 }