Beispiel #1
0
/**************************************************************************//**
 * @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);
}
Beispiel #2
0
/**************************************************************************//**
 * @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);
}
Beispiel #3
0
/***************************************************************************//**
 * @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);
}
Beispiel #4
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);
}