SPS30 library

Dependents:   IZU2021_SPS30 Hybrid_IZU2021_MISSION_v2 Hybrid_IZU2021_MISSION

Committer:
ziqiyap
Date:
Fri Mar 08 01:33:37 2019 +0000
Revision:
5:147de21156cf
Parent:
4:7558ddc3c7d6
Child:
6:83ed80f27fff
removed unnecessary return SPSisReady line from GetReadyStatus

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