Mbed library for SPS30 i2c communication

Committer:
ziqiyap
Date:
Fri Mar 15 06:52:32 2019 +0000
Revision:
8:f6b216228067
Parent:
6:83ed80f27fff
changed naming from sps30 to Sps30; created new higher functioning public API that can be accessed by sensor_driver

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 8:f6b216228067 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 8:f6b216228067 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 8:f6b216228067 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 8:f6b216228067 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 6:83ed80f27fff 29 if(res) return SPSNOACKERROR;
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 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 6:83ed80f27fff 41 if(res) return SPSNOACKERROR;
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 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 6:83ed80f27fff 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 8:f6b216228067 57 sps_ready = stat;
ziqiyap 8:f6b216228067 58 uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 0:9221dac25d3b 59
ziqiyap 6:83ed80f27fff 60 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 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 6:83ed80f27fff 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 8:f6b216228067 78 uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 83 dat = Sps30::CheckCrc2b(stat, i2cbuff[5]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 90 dat = Sps30::CheckCrc2b(stat, i2cbuff[8]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 95 dat = Sps30::CheckCrc2b(stat, i2cbuff[11]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 102 dat = Sps30::CheckCrc2b(stat, i2cbuff[14]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 107 dat = Sps30::CheckCrc2b(stat, i2cbuff[17]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 114 dat = Sps30::CheckCrc2b(stat, i2cbuff[20]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 119 dat = Sps30::CheckCrc2b(stat, i2cbuff[23]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 126 dat = Sps30::CheckCrc2b(stat, i2cbuff[26]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 131 dat = Sps30::CheckCrc2b(stat, i2cbuff[29]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 137 dat = Sps30::CheckCrc2b(stat, i2cbuff[32]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 142 dat = Sps30::CheckCrc2b(stat, i2cbuff[35]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 149 dat = Sps30::CheckCrc2b(stat, i2cbuff[38]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 154 dat = Sps30::CheckCrc2b(stat, i2cbuff[41]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 161 dat = Sps30::CheckCrc2b(stat, i2cbuff[44]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 166 dat = Sps30::CheckCrc2b(stat, i2cbuff[47]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 172 dat = Sps30::CheckCrc2b(stat, i2cbuff[50]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 177 dat = Sps30::CheckCrc2b(stat, i2cbuff[53]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 183 dat = Sps30::CheckCrc2b(stat, i2cbuff[56]);
ziqiyap 6:83ed80f27fff 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 8:f6b216228067 188 dat = Sps30::CheckCrc2b(stat, i2cbuff[59]);
ziqiyap 6:83ed80f27fff 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 6:83ed80f27fff 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 8:f6b216228067 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 8:f6b216228067 250 uint8_t Sps30::CheckCrc2b(uint16_t seed, uint8_t crc_in)
ziqiyap 0:9221dac25d3b 251 {
ziqiyap 8:f6b216228067 252 uint8_t crc_calc = Sps30::CalcCrc2b(seed);
ziqiyap 6:83ed80f27fff 253 if(crc_calc != crc_in) return SPSCRCERROR;
ziqiyap 6:83ed80f27fff 254 return SPSNOERROR;
ziqiyap 0:9221dac25d3b 255 }
ziqiyap 0:9221dac25d3b 256
ziqiyap 0:9221dac25d3b 257 //-----------------------------------------------------------------------------
ziqiyap 8:f6b216228067 258 // Get Sps30 serial number
ziqiyap 0:9221dac25d3b 259
ziqiyap 8:f6b216228067 260 uint8_t Sps30::GetSerialNumber()
ziqiyap 0:9221dac25d3b 261 {
ziqiyap 4:7558ddc3c7d6 262 i2cbuff[0] = SPS30_CMMD_READ_SERIALNBR >> 8;
ziqiyap 4:7558ddc3c7d6 263 i2cbuff[1] = SPS30_CMMD_READ_SERIALNBR & 255;
ziqiyap 4:7558ddc3c7d6 264 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 6:83ed80f27fff 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(sn); i++) sn[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_SN_SIZE, false);
ziqiyap 0:9221dac25d3b 272 int t = 0;
ziqiyap 0:9221dac25d3b 273 for(i = 0; i < SPS30_SN_SIZE; i +=3) {
ziqiyap 4:7558ddc3c7d6 274 uint16_t stat = (i2cbuff[i] << 8) | i2cbuff[i + 1];
ziqiyap 0:9221dac25d3b 275 sn[i - t] = stat >> 8;
ziqiyap 0:9221dac25d3b 276 sn[i - t + 1] = stat & 255;
ziqiyap 8:f6b216228067 277 uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[i + 2]);
ziqiyap 0:9221dac25d3b 278 t++;
ziqiyap 6:83ed80f27fff 279 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 0:9221dac25d3b 280 if(stat == 0) break;
ziqiyap 0:9221dac25d3b 281 }
ziqiyap 0:9221dac25d3b 282
ziqiyap 6:83ed80f27fff 283 return SPSNOERROR;
ziqiyap 0:9221dac25d3b 284 }
ziqiyap 0:9221dac25d3b 285
ziqiyap 0:9221dac25d3b 286 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 287 // Read Auto Cleaning Interval on the SPS30
ziqiyap 2:549bee9a4cd0 288
ziqiyap 8:f6b216228067 289 uint8_t Sps30::ReadAutoCleanInterval()
ziqiyap 2:549bee9a4cd0 290 {
ziqiyap 4:7558ddc3c7d6 291 i2cbuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 4:7558ddc3c7d6 292 i2cbuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 293
ziqiyap 4:7558ddc3c7d6 294 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 6:83ed80f27fff 295 if(res) return SPSNOACKERROR;
ziqiyap 2:549bee9a4cd0 296
ziqiyap 4:7558ddc3c7d6 297 _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 6, false);
ziqiyap 2:549bee9a4cd0 298
ziqiyap 4:7558ddc3c7d6 299 uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1];
ziqiyap 2:549bee9a4cd0 300 clean_interval_m = stat;
ziqiyap 8:f6b216228067 301 uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 6:83ed80f27fff 302 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 2:549bee9a4cd0 303
ziqiyap 4:7558ddc3c7d6 304 stat = (i2cbuff[3] << 8) | i2cbuff[4];
ziqiyap 2:549bee9a4cd0 305 clean_interval_l = stat;
ziqiyap 8:f6b216228067 306 dat = Sps30::CheckCrc2b(stat, i2cbuff[5]);
ziqiyap 6:83ed80f27fff 307 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 2:549bee9a4cd0 308
ziqiyap 2:549bee9a4cd0 309 clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
ziqiyap 2:549bee9a4cd0 310
ziqiyap 6:83ed80f27fff 311 return SPSNOERROR;
ziqiyap 2:549bee9a4cd0 312 }
ziqiyap 2:549bee9a4cd0 313
ziqiyap 2:549bee9a4cd0 314 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 315 // Set Auto Cleaning Interval on the SPS30
ziqiyap 2:549bee9a4cd0 316
ziqiyap 8:f6b216228067 317 uint8_t Sps30::SetAutoCleanInterval(uint32_t set_interval)
ziqiyap 2:549bee9a4cd0 318 {
ziqiyap 2:549bee9a4cd0 319 uint16_t set_interval_m = set_interval >> 16;
ziqiyap 2:549bee9a4cd0 320 uint16_t set_interval_l = set_interval & 65535;
ziqiyap 2:549bee9a4cd0 321
ziqiyap 4:7558ddc3c7d6 322 i2cbuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
ziqiyap 4:7558ddc3c7d6 323 i2cbuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
ziqiyap 2:549bee9a4cd0 324
ziqiyap 4:7558ddc3c7d6 325 i2cbuff[2] = set_interval_m >> 8;
ziqiyap 4:7558ddc3c7d6 326 i2cbuff[3] = set_interval_m & 255;
ziqiyap 8:f6b216228067 327 i2cbuff[4] = Sps30::CalcCrc2b(set_interval_m);
ziqiyap 2:549bee9a4cd0 328
ziqiyap 4:7558ddc3c7d6 329 i2cbuff[5] = set_interval_l >> 8;
ziqiyap 4:7558ddc3c7d6 330 i2cbuff[6] = set_interval_l & 255;
ziqiyap 8:f6b216228067 331 i2cbuff[7] = Sps30::CalcCrc2b(set_interval_l);
ziqiyap 2:549bee9a4cd0 332
ziqiyap 4:7558ddc3c7d6 333 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 8, false);
ziqiyap 6:83ed80f27fff 334 if(res) return SPSNOACKERROR;
ziqiyap 2:549bee9a4cd0 335
ziqiyap 4:7558ddc3c7d6 336 _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 6, false);
ziqiyap 2:549bee9a4cd0 337
ziqiyap 4:7558ddc3c7d6 338 uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1];
ziqiyap 2:549bee9a4cd0 339 clean_interval_m = stat;
ziqiyap 8:f6b216228067 340 uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]);
ziqiyap 6:83ed80f27fff 341 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 2:549bee9a4cd0 342
ziqiyap 4:7558ddc3c7d6 343 stat = (i2cbuff[3] << 8) | i2cbuff[4];
ziqiyap 2:549bee9a4cd0 344 clean_interval_l = stat;
ziqiyap 8:f6b216228067 345 dat = Sps30::CheckCrc2b(stat, i2cbuff[5]);
ziqiyap 6:83ed80f27fff 346 if(dat == SPSCRCERROR) return SPSCRCERROR;
ziqiyap 2:549bee9a4cd0 347
ziqiyap 2:549bee9a4cd0 348 clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
ziqiyap 2:549bee9a4cd0 349
ziqiyap 6:83ed80f27fff 350 return SPSNOERROR;
ziqiyap 2:549bee9a4cd0 351 }
ziqiyap 2:549bee9a4cd0 352
ziqiyap 2:549bee9a4cd0 353 //-----------------------------------------------------------------------------
ziqiyap 2:549bee9a4cd0 354 // Perform manual fan cleaning
ziqiyap 2:549bee9a4cd0 355
ziqiyap 8:f6b216228067 356 uint8_t Sps30::StartFanClean()
ziqiyap 2:549bee9a4cd0 357 {
ziqiyap 4:7558ddc3c7d6 358 i2cbuff[0] = SPS30_CMMD_START_FAN_CLEAN >> 8;
ziqiyap 4:7558ddc3c7d6 359 i2cbuff[1] = SPS30_CMMD_START_FAN_CLEAN & 255;
ziqiyap 4:7558ddc3c7d6 360 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 6:83ed80f27fff 361 if(res) return SPSNOACKERROR;
ziqiyap 6:83ed80f27fff 362 return SPSNOERROR;
ziqiyap 2:549bee9a4cd0 363 }
ziqiyap 2:549bee9a4cd0 364
ziqiyap 2:549bee9a4cd0 365 //-----------------------------------------------------------------------------
ziqiyap 0:9221dac25d3b 366 // Perform a soft reset on the SPS30
ziqiyap 0:9221dac25d3b 367
ziqiyap 8:f6b216228067 368 uint8_t Sps30::SoftReset()
ziqiyap 0:9221dac25d3b 369 {
ziqiyap 4:7558ddc3c7d6 370 i2cbuff[0] = SPS30_CMMD_SOFT_RESET >> 8;
ziqiyap 4:7558ddc3c7d6 371 i2cbuff[1] = SPS30_CMMD_SOFT_RESET & 255;
ziqiyap 4:7558ddc3c7d6 372 int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false);
ziqiyap 6:83ed80f27fff 373 if(res) return SPSNOACKERROR;
ziqiyap 6:83ed80f27fff 374 return SPSNOERROR;
ziqiyap 8:f6b216228067 375 }
ziqiyap 8:f6b216228067 376
ziqiyap 8:f6b216228067 377 /************************** PUBLIC METHODS **********************************/
ziqiyap 8:f6b216228067 378
ziqiyap 8:f6b216228067 379 //-----------------------------------------------------------------------------
ziqiyap 8:f6b216228067 380 // Initialise SPS30
ziqiyap 8:f6b216228067 381
ziqiyap 8:f6b216228067 382 uint8_t Sps30::InitSPS30()
ziqiyap 8:f6b216228067 383 {
ziqiyap 8:f6b216228067 384 uint8_t dat = Sps30::GetSerialNumber();
ziqiyap 8:f6b216228067 385 if (dat == SPSNOACKERROR) return DISCONNECTED;
ziqiyap 8:f6b216228067 386
ziqiyap 8:f6b216228067 387 dat = Sps30::StartMeasurement();
ziqiyap 8:f6b216228067 388 if (dat == SPSNOACKERROR) return DISCONNECTED;
ziqiyap 8:f6b216228067 389
ziqiyap 8:f6b216228067 390 return CONNECTED;
ziqiyap 8:f6b216228067 391 }
ziqiyap 8:f6b216228067 392
ziqiyap 8:f6b216228067 393 //-----------------------------------------------------------------------------
ziqiyap 8:f6b216228067 394 // Poll SPS30
ziqiyap 8:f6b216228067 395
ziqiyap 8:f6b216228067 396 uint8_t Sps30::PollSPS30()
ziqiyap 8:f6b216228067 397 {
ziqiyap 8:f6b216228067 398 uint8_t dat = Sps30::GetReadyStatus();
ziqiyap 8:f6b216228067 399 if (dat == SPSNOACKERROR) return DISCONNECTED;
ziqiyap 8:f6b216228067 400
ziqiyap 8:f6b216228067 401 if (sps_ready == SPSISREADY)
ziqiyap 8:f6b216228067 402 {
ziqiyap 8:f6b216228067 403 uint8_t crcc = Sps30::ReadMeasurement();
ziqiyap 8:f6b216228067 404 if (crcc == SPSNOERROR)
ziqiyap 8:f6b216228067 405 {
ziqiyap 8:f6b216228067 406 return DATAREADY;
ziqiyap 8:f6b216228067 407 }
ziqiyap 8:f6b216228067 408 else if (crcc == SPSNOACKERROR)
ziqiyap 8:f6b216228067 409 {
ziqiyap 8:f6b216228067 410 return DISCONNECTED;
ziqiyap 8:f6b216228067 411 }
ziqiyap 8:f6b216228067 412 else
ziqiyap 8:f6b216228067 413 {
ziqiyap 8:f6b216228067 414 return DATAERROR;
ziqiyap 8:f6b216228067 415 }
ziqiyap 8:f6b216228067 416 }
ziqiyap 8:f6b216228067 417 else
ziqiyap 8:f6b216228067 418 {
ziqiyap 8:f6b216228067 419 return DATANOTREADY;
ziqiyap 8:f6b216228067 420 }
ziqiyap 8:f6b216228067 421 }