Mbed library for SPS30 i2c communication (Configured to be interfaced with TresidderOS) Inherits members and methods from SensorDriver class

Dependents:   SPS30_TEST

Committer:
ziqiyap
Date:
Wed Mar 06 02:22:52 2019 +0000
Revision:
4:7558ddc3c7d6
Parent:
2:549bee9a4cd0
Child:
5:147de21156cf
removed magical number from lines 25, 26 and placed it as defined constant SPS 30_STRT_MEAS_WRITE_DATA; edited function headers to follow the standardized c++ coding style;

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 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 4:7558ddc3c7d6 68 uint8_t sps30::ReadMeasurement()
ziqiyap 0:9221dac25d3b 69 {
ziqiyap 4:7558ddc3c7d6 70 i2cbuff[0] = SPS30_CMMD_READ_MEAS >> 8;
ziqiyap 4:7558ddc3c7d6 71 i2cbuff[1] = SPS30_CMMD_READ_MEAS & 255;
ziqiyap 4:7558ddc3c7d6 72 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 0:9221dac25d3b 73 if(res) return SPSnoAckERROR;
ziqiyap 0:9221dac25d3b 74
ziqiyap 4:7558ddc3c7d6 75 _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 60, false);
ziqiyap 0:9221dac25d3b 76
ziqiyap 4:7558ddc3c7d6 77 uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1];
ziqiyap 0:9221dac25d3b 78 mass_1p0_m = stat;
ziqiyap 4:7558ddc3c7d6 79 uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 0:9221dac25d3b 80 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 81
ziqiyap 4:7558ddc3c7d6 82 stat = (i2cbuff[3] << 8) | i2cbuff[4];
ziqiyap 0:9221dac25d3b 83 mass_1p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 89 stat = (i2cbuff[6] << 8) | i2cbuff[7];
ziqiyap 0:9221dac25d3b 90 mass_2p5_m = stat;
ziqiyap 4:7558ddc3c7d6 91 dat = sps30::CheckCrc2b(stat, i2cbuff[8]);
ziqiyap 0:9221dac25d3b 92 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 93
ziqiyap 4:7558ddc3c7d6 94 stat = (i2cbuff[9] << 8) | i2cbuff[10];
ziqiyap 0:9221dac25d3b 95 mass_2p5_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 101 stat = (i2cbuff[12] << 8) | i2cbuff[13];
ziqiyap 0:9221dac25d3b 102 mass_4p0_m = stat;
ziqiyap 4:7558ddc3c7d6 103 dat = sps30::CheckCrc2b(stat, i2cbuff[14]);
ziqiyap 0:9221dac25d3b 104 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 105
ziqiyap 4:7558ddc3c7d6 106 stat = (i2cbuff[15] << 8) | i2cbuff[16];
ziqiyap 0:9221dac25d3b 107 mass_4p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 113 stat = (i2cbuff[18] << 8) | i2cbuff[19];
ziqiyap 0:9221dac25d3b 114 mass_10p0_m = stat;
ziqiyap 4:7558ddc3c7d6 115 dat = sps30::CheckCrc2b(stat, i2cbuff[20]);
ziqiyap 0:9221dac25d3b 116 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 117
ziqiyap 4:7558ddc3c7d6 118 stat = (i2cbuff[21] << 8) | i2cbuff[22];
ziqiyap 0:9221dac25d3b 119 mass_10p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 125 stat = (i2cbuff[24] << 8) | i2cbuff[25];
ziqiyap 0:9221dac25d3b 126 num_0p5_m = stat;
ziqiyap 4:7558ddc3c7d6 127 dat = sps30::CheckCrc2b(stat, i2cbuff[26]);
ziqiyap 0:9221dac25d3b 128 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 129
ziqiyap 4:7558ddc3c7d6 130 stat = (i2cbuff[27] << 8) | i2cbuff[28];
ziqiyap 0:9221dac25d3b 131 num_0p5_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 136 stat = (i2cbuff[30] << 8) | i2cbuff[31];
ziqiyap 0:9221dac25d3b 137 num_1p0_m = stat;
ziqiyap 4:7558ddc3c7d6 138 dat = sps30::CheckCrc2b(stat, i2cbuff[32]);
ziqiyap 0:9221dac25d3b 139 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 140
ziqiyap 4:7558ddc3c7d6 141 stat = (i2cbuff[33] << 8) | i2cbuff[34];
ziqiyap 0:9221dac25d3b 142 num_1p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 148 stat = (i2cbuff[36] << 8) | i2cbuff[37];
ziqiyap 0:9221dac25d3b 149 num_2p5_m = stat;
ziqiyap 4:7558ddc3c7d6 150 dat = sps30::CheckCrc2b(stat, i2cbuff[38]);
ziqiyap 0:9221dac25d3b 151 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 152
ziqiyap 4:7558ddc3c7d6 153 stat = (i2cbuff[39] << 8) | i2cbuff[40];
ziqiyap 0:9221dac25d3b 154 num_2p5_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 160 stat = (i2cbuff[42] << 8) | i2cbuff[43];
ziqiyap 0:9221dac25d3b 161 num_4p0_m = stat;
ziqiyap 4:7558ddc3c7d6 162 dat = sps30::CheckCrc2b(stat, i2cbuff[44]);
ziqiyap 0:9221dac25d3b 163 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 164
ziqiyap 4:7558ddc3c7d6 165 stat = (i2cbuff[45] << 8) | i2cbuff[46];
ziqiyap 0:9221dac25d3b 166 num_4p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 171 stat = (i2cbuff[48] << 8) | i2cbuff[49];
ziqiyap 0:9221dac25d3b 172 num_10p0_m = stat;
ziqiyap 4:7558ddc3c7d6 173 dat = sps30::CheckCrc2b(stat, i2cbuff[50]);
ziqiyap 0:9221dac25d3b 174 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 175
ziqiyap 4:7558ddc3c7d6 176 stat = (i2cbuff[51] << 8) | i2cbuff[52];
ziqiyap 0:9221dac25d3b 177 num_10p0_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 182 stat = (i2cbuff[54] << 8) | i2cbuff[55];
ziqiyap 0:9221dac25d3b 183 typ_pm_size_m = stat;
ziqiyap 4:7558ddc3c7d6 184 dat = sps30::CheckCrc2b(stat, i2cbuff[56]);
ziqiyap 0:9221dac25d3b 185 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 0:9221dac25d3b 186
ziqiyap 4:7558ddc3c7d6 187 stat = (i2cbuff[57] << 8) | i2cbuff[58];
ziqiyap 0:9221dac25d3b 188 typ_pm_size_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 251 uint8_t sps30::CheckCrc2b(uint16_t seed, uint8_t crc_in)
ziqiyap 0:9221dac25d3b 252 {
ziqiyap 4:7558ddc3c7d6 253 uint8_t crc_calc = sps30::CalcCrc2b(seed);
ziqiyap 4:7558ddc3c7d6 254 if(crc_calc != crc_in) 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 4:7558ddc3c7d6 261 uint8_t sps30::GetArticleCode()
ziqiyap 0:9221dac25d3b 262 {
ziqiyap 4:7558ddc3c7d6 263 i2cbuff[0] = SPS30_CMMD_READ_ARTICLECODE >> 8;
ziqiyap 4:7558ddc3c7d6 264 i2cbuff[1] = SPS30_CMMD_READ_ARTICLECODE & 255;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 270 for(i = 0; i < sizeof(i2cbuff); i++) i2cbuff[i] = 0;
ziqiyap 0:9221dac25d3b 271
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 290 uint8_t sps30::GetSerialNumber()
ziqiyap 0:9221dac25d3b 291 {
ziqiyap 4:7558ddc3c7d6 292 i2cbuff[0] = SPS30_CMMD_READ_SERIALNBR >> 8;
ziqiyap 4:7558ddc3c7d6 293 i2cbuff[1] = SPS30_CMMD_READ_SERIALNBR & 255;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 299 for(i = 0; i < sizeof(i2cbuff); i++) i2cbuff[i] = 0;
ziqiyap 0:9221dac25d3b 300
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 319 uint8_t sps30::ReadAutoCleanInterval()
ziqiyap 2:549bee9a4cd0 320 {
ziqiyap 4:7558ddc3c7d6 321 i2cbuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 4:7558ddc3c7d6 322 i2cbuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 323
ziqiyap 4:7558ddc3c7d6 324 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 2:549bee9a4cd0 325 if(res) return SPSnoAckERROR;
ziqiyap 2:549bee9a4cd0 326
ziqiyap 4:7558ddc3c7d6 327 _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 6, false);
ziqiyap 2:549bee9a4cd0 328
ziqiyap 4:7558ddc3c7d6 329 uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1];
ziqiyap 2:549bee9a4cd0 330 clean_interval_m = stat;
ziqiyap 4:7558ddc3c7d6 331 uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 2:549bee9a4cd0 332 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 333
ziqiyap 4:7558ddc3c7d6 334 stat = (i2cbuff[3] << 8) | i2cbuff[4];
ziqiyap 2:549bee9a4cd0 335 clean_interval_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 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 4:7558ddc3c7d6 352 i2cbuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 4:7558ddc3c7d6 353 i2cbuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 354
ziqiyap 4:7558ddc3c7d6 355 i2cbuff[2] = set_interval_m >> 8;
ziqiyap 4:7558ddc3c7d6 356 i2cbuff[3] = set_interval_m & 255;
ziqiyap 4:7558ddc3c7d6 357 i2cbuff[4] = sps30::CalcCrc2b(set_interval_m);
ziqiyap 2:549bee9a4cd0 358
ziqiyap 4:7558ddc3c7d6 359 i2cbuff[5] = set_interval_l >> 8;
ziqiyap 4:7558ddc3c7d6 360 i2cbuff[6] = set_interval_l & 255;
ziqiyap 4:7558ddc3c7d6 361 i2cbuff[7] = sps30::CalcCrc2b(set_interval_l);
ziqiyap 2:549bee9a4cd0 362
ziqiyap 4:7558ddc3c7d6 363 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 8, false);
ziqiyap 2:549bee9a4cd0 364 if(res) return SPSnoAckERROR;
ziqiyap 2:549bee9a4cd0 365
ziqiyap 4:7558ddc3c7d6 366 _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 6, false);
ziqiyap 2:549bee9a4cd0 367
ziqiyap 4:7558ddc3c7d6 368 uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1];
ziqiyap 2:549bee9a4cd0 369 clean_interval_m = stat;
ziqiyap 4:7558ddc3c7d6 370 uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 2:549bee9a4cd0 371 if(dat == SPScrcERROR) return SPScrcERROR;
ziqiyap 2:549bee9a4cd0 372
ziqiyap 4:7558ddc3c7d6 373 stat = (i2cbuff[3] << 8) | i2cbuff[4];
ziqiyap 2:549bee9a4cd0 374 clean_interval_l = stat;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 386 uint8_t sps30::StartFanClean()
ziqiyap 2:549bee9a4cd0 387 {
ziqiyap 4:7558ddc3c7d6 388 i2cbuff[0] = SPS30_CMMD_START_FAN_CLEAN >> 8;
ziqiyap 4:7558ddc3c7d6 389 i2cbuff[1] = SPS30_CMMD_START_FAN_CLEAN & 255;
ziqiyap 4:7558ddc3c7d6 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 4:7558ddc3c7d6 398 uint8_t sps30::SoftReset()
ziqiyap 0:9221dac25d3b 399 {
ziqiyap 4:7558ddc3c7d6 400 i2cbuff[0] = SPS30_CMMD_SOFT_RESET >> 8;
ziqiyap 4:7558ddc3c7d6 401 i2cbuff[1] = SPS30_CMMD_SOFT_RESET & 255;
ziqiyap 4:7558ddc3c7d6 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 }