SPS30 library
Dependents: IZU2021_SPS30 Hybrid_IZU2021_MISSION_v2 Hybrid_IZU2021_MISSION
Diff: sps30.cpp
- Revision:
- 8:f6b216228067
- Parent:
- 6:83ed80f27fff
--- a/sps30.cpp Tue Mar 12 08:25:10 2019 +0000 +++ b/sps30.cpp Fri Mar 15 06:52:32 2019 +0000 @@ -4,27 +4,27 @@ //----------------------------------------------------------------------------- // Constructor -sps30::sps30(PinName sda, PinName scl, int i2c_frequency) : _i2c(sda, scl) { +Sps30::Sps30(PinName sda, PinName scl, int i2c_frequency) : _i2c(sda, scl) { _i2c.frequency(i2c_frequency); } //----------------------------------------------------------------------------- // Destructor -sps30::~sps30() { +Sps30::~Sps30() { } //----------------------------------------------------------------------------- // start auto-measurement // -uint8_t sps30::StartMeasurement() +uint8_t Sps30::StartMeasurement() { i2cbuff[0] = SPS30_CMMD_STRT_MEAS >> 8; i2cbuff[1] = SPS30_CMMD_STRT_MEAS & 255; i2cbuff[2] = SPS30_STRT_MEAS_WRITE_DATA >> 8; i2cbuff[3] = SPS30_STRT_MEAS_WRITE_DATA & 255; - i2cbuff[4] = sps30::CalcCrc2b(SPS30_STRT_MEAS_WRITE_DATA); + i2cbuff[4] = Sps30::CalcCrc2b(SPS30_STRT_MEAS_WRITE_DATA); int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 5, false); if(res) return SPSNOACKERROR; return SPSNOERROR; @@ -33,7 +33,7 @@ //----------------------------------------------------------------------------- // Stop auto-measurement -uint8_t sps30::StopMeasurement() +uint8_t Sps30::StopMeasurement() { i2cbuff[0] = SPS30_CMMD_STOP_MEAS >> 8; i2cbuff[1] = SPS30_CMMD_STOP_MEAS & 255; @@ -45,7 +45,7 @@ //----------------------------------------------------------------------------- // Get ready status value -uint8_t sps30::GetReadyStatus() +uint8_t Sps30::GetReadyStatus() { i2cbuff[0] = SPS30_CMMD_GET_READY_STAT >> 8; i2cbuff[1] = SPS30_CMMD_GET_READY_STAT & 255; @@ -54,8 +54,8 @@ _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, 3, false); uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1]; - ready = stat; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]); + sps_ready = stat; + uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]); if(dat == SPSCRCERROR) return SPSCRCERROR; return SPSNOERROR; @@ -64,7 +64,7 @@ //----------------------------------------------------------------------------- // Get all the measurement values, stick them into the array -uint8_t sps30::ReadMeasurement() +uint8_t Sps30::ReadMeasurement() { i2cbuff[0] = SPS30_CMMD_READ_MEAS >> 8; i2cbuff[1] = SPS30_CMMD_READ_MEAS & 255; @@ -75,117 +75,117 @@ uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1]; mass_1p0_m = stat; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]); + uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[3] << 8) | i2cbuff[4]; mass_1p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[5]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[5]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[6] << 8) | i2cbuff[7]; mass_2p5_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[8]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[8]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[9] << 8) | i2cbuff[10]; mass_2p5_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[11]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[11]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[12] << 8) | i2cbuff[13]; mass_4p0_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[14]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[14]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[15] << 8) | i2cbuff[16]; mass_4p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[17]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[17]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[18] << 8) | i2cbuff[19]; mass_10p0_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[20]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[20]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[21] << 8) | i2cbuff[22]; mass_10p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[23]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[23]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[24] << 8) | i2cbuff[25]; num_0p5_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[26]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[26]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[27] << 8) | i2cbuff[28]; num_0p5_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[29]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[29]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[30] << 8) | i2cbuff[31]; num_1p0_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[32]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[32]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[33] << 8) | i2cbuff[34]; num_1p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[35]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[35]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[36] << 8) | i2cbuff[37]; num_2p5_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[38]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[38]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[39] << 8) | i2cbuff[40]; num_2p5_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[41]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[41]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[42] << 8) | i2cbuff[43]; num_4p0_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[44]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[44]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[45] << 8) | i2cbuff[46]; num_4p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[47]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[47]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[48] << 8) | i2cbuff[49]; num_10p0_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[50]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[50]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[51] << 8) | i2cbuff[52]; num_10p0_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[53]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[53]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[54] << 8) | i2cbuff[55]; typ_pm_size_m = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[56]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[56]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[57] << 8) | i2cbuff[58]; typ_pm_size_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[59]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[59]); if(dat == SPSCRCERROR) return SPSCRCERROR; mass_1p0_i = (mass_1p0_m << 16) | mass_1p0_l; @@ -220,7 +220,7 @@ //----------------------------------------------------------------------------- // Calculate the CRC of a 2 byte value using the SPS30 CRC polynomial -uint8_t sps30::CalcCrc2b(uint16_t seed) +uint8_t Sps30::CalcCrc2b(uint16_t seed) { uint8_t bit; // bit mask uint8_t crc = SPS30_CRC_INIT; // calculated checksum @@ -247,46 +247,17 @@ //----------------------------------------------------------------------------- // Compare the CRC values -uint8_t sps30::CheckCrc2b(uint16_t seed, uint8_t crc_in) +uint8_t Sps30::CheckCrc2b(uint16_t seed, uint8_t crc_in) { - uint8_t crc_calc = sps30::CalcCrc2b(seed); + uint8_t crc_calc = Sps30::CalcCrc2b(seed); if(crc_calc != crc_in) return SPSCRCERROR; return SPSNOERROR; } //----------------------------------------------------------------------------- -// Get article code +// Get Sps30 serial number -uint8_t sps30::GetArticleCode() -{ - i2cbuff[0] = SPS30_CMMD_READ_ARTICLECODE >> 8; - i2cbuff[1] = SPS30_CMMD_READ_ARTICLECODE & 255; - int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false); - if(res) return SPSNOACKERROR; - - int i = 0; - for(i = 0; i < sizeof(acode); i++) acode[i] = 0; - for(i = 0; i < sizeof(i2cbuff); i++) i2cbuff[i] = 0; - - _i2c.read(SPS30_I2C_ADDR | 1, i2cbuff, SPS30_ACODE_SIZE, false); - int t = 0; - for(i = 0; i < SPS30_ACODE_SIZE; i +=3) { - uint16_t stat = (i2cbuff[i] << 8) | i2cbuff[i + 1]; - acode[i - t] = stat >> 8; - acode[i - t + 1] = stat & 255; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[i + 2]); - t++; - if(dat == SPSCRCERROR) return SPSCRCERROR; - if(stat == 0) break; - } - - return SPSNOERROR; -} - -//----------------------------------------------------------------------------- -// Get sps30 serial number - -uint8_t sps30::GetSerialNumber() +uint8_t Sps30::GetSerialNumber() { i2cbuff[0] = SPS30_CMMD_READ_SERIALNBR >> 8; i2cbuff[1] = SPS30_CMMD_READ_SERIALNBR & 255; @@ -303,7 +274,7 @@ uint16_t stat = (i2cbuff[i] << 8) | i2cbuff[i + 1]; sn[i - t] = stat >> 8; sn[i - t + 1] = stat & 255; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[i + 2]); + uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[i + 2]); t++; if(dat == SPSCRCERROR) return SPSCRCERROR; if(stat == 0) break; @@ -315,7 +286,7 @@ //----------------------------------------------------------------------------- // Read Auto Cleaning Interval on the SPS30 -uint8_t sps30::ReadAutoCleanInterval() +uint8_t Sps30::ReadAutoCleanInterval() { i2cbuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8; i2cbuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255; @@ -327,12 +298,12 @@ uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1]; clean_interval_m = stat; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]); + uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[3] << 8) | i2cbuff[4]; clean_interval_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[5]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[5]); if(dat == SPSCRCERROR) return SPSCRCERROR; clean_interval_i = (clean_interval_m << 16) | clean_interval_l; @@ -343,7 +314,7 @@ //----------------------------------------------------------------------------- // Set Auto Cleaning Interval on the SPS30 -uint8_t sps30::SetAutoCleanInterval(uint32_t set_interval) +uint8_t Sps30::SetAutoCleanInterval(uint32_t set_interval) { uint16_t set_interval_m = set_interval >> 16; uint16_t set_interval_l = set_interval & 65535; @@ -353,11 +324,11 @@ i2cbuff[2] = set_interval_m >> 8; i2cbuff[3] = set_interval_m & 255; - i2cbuff[4] = sps30::CalcCrc2b(set_interval_m); + i2cbuff[4] = Sps30::CalcCrc2b(set_interval_m); i2cbuff[5] = set_interval_l >> 8; i2cbuff[6] = set_interval_l & 255; - i2cbuff[7] = sps30::CalcCrc2b(set_interval_l); + i2cbuff[7] = Sps30::CalcCrc2b(set_interval_l); int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 8, false); if(res) return SPSNOACKERROR; @@ -366,12 +337,12 @@ uint16_t stat = (i2cbuff[0] << 8) | i2cbuff[1]; clean_interval_m = stat; - uint8_t dat = sps30::CheckCrc2b(stat, i2cbuff[2]); + uint8_t dat = Sps30::CheckCrc2b(stat, i2cbuff[2]); if(dat == SPSCRCERROR) return SPSCRCERROR; stat = (i2cbuff[3] << 8) | i2cbuff[4]; clean_interval_l = stat; - dat = sps30::CheckCrc2b(stat, i2cbuff[5]); + dat = Sps30::CheckCrc2b(stat, i2cbuff[5]); if(dat == SPSCRCERROR) return SPSCRCERROR; clean_interval_i = (clean_interval_m << 16) | clean_interval_l; @@ -382,7 +353,7 @@ //----------------------------------------------------------------------------- // Perform manual fan cleaning -uint8_t sps30::StartFanClean() +uint8_t Sps30::StartFanClean() { i2cbuff[0] = SPS30_CMMD_START_FAN_CLEAN >> 8; i2cbuff[1] = SPS30_CMMD_START_FAN_CLEAN & 255; @@ -394,11 +365,57 @@ //----------------------------------------------------------------------------- // Perform a soft reset on the SPS30 -uint8_t sps30::SoftReset() +uint8_t Sps30::SoftReset() { i2cbuff[0] = SPS30_CMMD_SOFT_RESET >> 8; i2cbuff[1] = SPS30_CMMD_SOFT_RESET & 255; int res = _i2c.write(SPS30_I2C_ADDR, i2cbuff, 2, false); if(res) return SPSNOACKERROR; return SPSNOERROR; -} \ No newline at end of file +} + +/************************** PUBLIC METHODS **********************************/ + +//----------------------------------------------------------------------------- +// Initialise SPS30 + +uint8_t Sps30::InitSPS30() +{ + uint8_t dat = Sps30::GetSerialNumber(); + if (dat == SPSNOACKERROR) return DISCONNECTED; + + dat = Sps30::StartMeasurement(); + if (dat == SPSNOACKERROR) return DISCONNECTED; + + return CONNECTED; +} + +//----------------------------------------------------------------------------- +// Poll SPS30 + +uint8_t Sps30::PollSPS30() +{ + uint8_t dat = Sps30::GetReadyStatus(); + if (dat == SPSNOACKERROR) return DISCONNECTED; + + if (sps_ready == SPSISREADY) + { + uint8_t crcc = Sps30::ReadMeasurement(); + if (crcc == SPSNOERROR) + { + return DATAREADY; + } + else if (crcc == SPSNOACKERROR) + { + return DISCONNECTED; + } + else + { + return DATAERROR; + } + } + else + { + return DATANOTREADY; + } +}