/**************************************************************************//** * @brief * Reads data from the ADXL345 sensor. * @param[in] i2c * The I2C peripheral to use (not used). * @param[in] addr * The register address of the sensor. * @param[out] data * The data read from the sensor. * @param[in] len * The length of data to be read back * @return * Returns number of bytes read on success. Otherwise returns error codes * based on the I2CDRV. *****************************************************************************/ static int32_t ADXL345_Read_Reg(I2C_TypeDef *i2c, uint8_t reg_addr, uint8_t *data, uint32_t len) { I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t i2c_read_data[len]; uint8_t i2c_write_data[1]; seq.addr = ADXL345I2CADDR; seq.flags = I2C_FLAG_WRITE_READ; /* Select command to issue */ i2c_write_data[0] = reg_addr; seq.buf[0].data = i2c_write_data; seq.buf[0].len = 1; /* Select location/length of data to be read */ seq.buf[1].data = i2c_read_data; seq.buf[1].len = len; ret = I2CSPM_Transfer(i2c, &seq); if (ret != i2cTransferDone) { *data = 0; return((int) ret); } // *data=i2c_read_data[0]; for(uint32_t i=0;i<len;i++) { data[i] = i2c_read_data[i]; } // *data = ((uint32_t) i2c_read_data[0] << 8) + (i2c_read_data[1] & 0xfc); return((int) 2); }
/**************************************************************************//** * @brief * writes data to registers of ADXL345 sensor. * @param[in] i2c * The I2C peripheral to use (not used). * @param[in] addr * The register address of the sensor. * @param[out] data * The data to write to the sensor. * @param[in] len * The length of data to be read back * @return * Returns number of bytes read on success. Otherwise returns error codes * based on the I2CDRV. *****************************************************************************/ static int32_t ADXL345_Single_Write_Reg(I2C_TypeDef *i2c, uint8_t reg_addr, uint8_t data) { I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t i2c_read_data[0]; uint8_t i2c_write_data[2]; seq.addr = ADXL345I2CADDR; seq.flags = I2C_FLAG_WRITE; /* Select command to issue */ i2c_write_data[0] = reg_addr; i2c_write_data[1] = data; seq.buf[0].data = i2c_write_data; seq.buf[0].len = 2; /* Select location/length of data to be read */ seq.buf[1].data = i2c_read_data; seq.buf[1].len = 0; ret = I2CSPM_Transfer(i2c, &seq); if (ret != i2cTransferDone) { return((int) ret); } return((int) 2); }
/***************************************************************************//** * @brief * Read sensor register content. * * @details * If reading the temperature register, when a measurement is completed inside * the sensor device, the new measurement may not be stored. For this reason, * the temperature should not be polled with a higher frequency than the * measurement conversion time for a given resolution configuration. Please * refer to sensor device datasheet. * * @param[in] i2c * Pointer to I2C peripheral register block. * * @param[in] addr * I2C address for temperature sensor, in 8 bit format, where LSB is reserved * for R/W bit. * * @param[in] reg * Register to read. * * @param[out] val * Reference to place register read. * * @return * Returns 0 if register read, <0 if unable to read register. ******************************************************************************/ int TEMPSENS_RegisterGet(I2C_TypeDef *i2c, uint8_t addr, TEMPSENS_Register_TypeDef reg, uint16_t *val) { I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t regid[1]; uint8_t data[2]; seq.addr = addr; seq.flags = I2C_FLAG_WRITE_READ; /* Select register to be read */ regid[0] = ((uint8_t) reg) & 0x3; seq.buf[0].data = regid; seq.buf[0].len = 1; /* Select location/length to place register */ if (reg == tempsensRegConfig) { /* Only 1 byte reg, clear upper 8 bits */ data[0] = 0; seq.buf[1].data = data + 1; seq.buf[1].len = 1; } else { seq.buf[1].data = data; seq.buf[1].len = 2; } ret = I2CSPM_Transfer(i2c, &seq); if (ret != i2cTransferDone) { return((int) ret); } *val = (((uint16_t)(data[0])) << 8) | data[1]; return(0); }
/***************************************************************************//** * @brief * Write to sensor register. * * @param[in] i2c * Pointer to I2C peripheral register block. * * @param[in] addr * I2C address for temperature sensor, in 8 bit format, where LSB is reserved * for R/W bit. * * @param[in] reg * Register to write (temperature register cannot be written). * * @param[in] val * Value used when writing to register. * * @return * Returns 0 if register written, <0 if unable to write to register. ******************************************************************************/ int TEMPSENS_RegisterSet(I2C_TypeDef *i2c, uint8_t addr, TEMPSENS_Register_TypeDef reg, uint16_t val) { I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t data[3]; if (reg == tempsensRegTemp) { return(-1); } seq.addr = addr; seq.flags = I2C_FLAG_WRITE; /* Select register to be written */ data[0] = ((uint8_t) reg) & 0x3; seq.buf[0].data = data; if (reg == tempsensRegConfig) { /* Only 1 byte reg */ data[1] = (uint8_t) val; seq.buf[0].len = 2; } else { data[1] = (uint8_t)(val >> 8); data[2] = (uint8_t) val; seq.buf[0].len = 3; } ret = I2CSPM_Transfer(i2c, &seq); if (ret != i2cTransferDone) { return((int) ret); } return(ret); }