/*---------------------------------------------------------------------------*/ static int16_t adxl346_read_accel(uint8_t addr1, uint8_t addr2) { uint8_t acceleration[2]; int16_t result; i2c_single_send(ADXL346_ADDRESS, addr1); i2c_single_receive(ADXL346_ADDRESS, &acceleration[0]); i2c_single_send(ADXL346_ADDRESS, addr2); i2c_single_receive(ADXL346_ADDRESS, &acceleration[1]); result = (acceleration[1] << 8) | acceleration[0]; return result; }
/*---------------------------------------------------------------------------*/ uint16_t adxl346_read_z(void) { uint8_t acceleration[2]; uint16_t z; i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAZ0_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[0]); i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAZ1_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[1]); z = (acceleration[0] << 8) | acceleration[1]; return z; }
/*---------------------------------------------------------------------------*/ uint16_t adxl346_read_y(void) { uint8_t acceleration[2]; uint16_t y; i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAY0_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[0]); i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAY1_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[1]); y = (acceleration[0] << 8) | acceleration[1]; return y; }
/*---------------------------------------------------------------------------*/ uint16_t adxl346_read_x(void) { uint8_t acceleration[2]; uint16_t x; i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAX0_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[0]); i2c_single_send(ADXL346_ADDRESS, ADXL346_DATAX1_ADDR); i2c_single_receive(ADXL346_ADDRESS, &acceleration[1]); x = (acceleration[0] << 8) | acceleration[1]; return x; }
/*---------------------------------------------------------------------------*/ uint8_t i2c_burst_send(uint8_t slave_addr, uint8_t *data, uint8_t len) { uint8_t sent; if((len == 0) || (data == NULL)) { return I2CM_STAT_INVALID; } if(len == 1) { return i2c_single_send(slave_addr, data[0]); } i2c_master_set_slave_address(slave_addr, I2C_SEND); i2c_master_data_put(data[0]); i2c_master_command(I2C_MASTER_CMD_BURST_SEND_START); while(i2c_master_busy()); if(i2c_master_error() == I2C_MASTER_ERR_NONE) { for(sent = 1; sent <= (len - 2); sent++) { i2c_master_data_put(data[sent]); i2c_master_command(I2C_MASTER_CMD_BURST_SEND_CONT); while(i2c_master_busy()); } /* This should be the last byte, stop sending */ i2c_master_data_put(data[len - 1]); i2c_master_command(I2C_MASTER_CMD_BURST_SEND_FINISH); while(i2c_master_busy()); } /* Return the STAT register of I2C module if error occurred, I2C_MASTER_ERR_NONE otherwise */ return i2c_master_error(); }
/*---------------------------------------------------------------------------*/ void bme280_arch_i2c_read_mem(uint8_t addr, uint8_t reg, uint8_t *buf, uint8_t bytes) { i2c_master_enable(); if(i2c_single_send(addr, reg) == I2C_MASTER_ERR_NONE) { while(i2c_master_busy()); i2c_burst_receive(addr, buf, bytes); } }
/*---------------------------------------------------------------------------*/ static uint16_t sht25_read_reg(uint8_t reg, uint8_t *buf, uint8_t regNum) { if(i2c_single_send(SHT25_ADDR, reg) == I2C_MASTER_ERR_NONE) { if(i2c_burst_receive(SHT25_ADDR, buf, regNum) == I2C_MASTER_ERR_NONE) { return SHT25_SUCCESS; } } return SHT25_ERROR; }
/*---------------------------------------------------------------------------*/ static uint8_t adxl346_is_present(void) { uint8_t is_present; i2c_single_send(ADXL346_ADDRESS, ADXL346_DEVID_ADDR); i2c_single_receive(ADXL346_ADDRESS, &is_present); return is_present == ADXL346_DEVID_VALUE; }
/*---------------------------------------------------------------------------*/ static int value(int type) { uint8_t temp[2] = { 0, 0 }; /* set pointer to temperature register */ i2c_single_send(SE95_ADDR, 0); /* receive the data */ i2c_burst_receive(SE95_ADDR, temp, 2); return ((( temp[0] << 8 ) + temp[1]) >> 3); }
/*---------------------------------------------------------------------------*/ static uint16_t sht25_read_reg(uint8_t reg, uint8_t *buf, uint8_t num) { if((buf == NULL) || (num <= 0)) { return SHT25_ERROR; } i2c_master_enable(); if(i2c_single_send(SHT25_ADDR, reg) == I2C_MASTER_ERR_NONE) { if(i2c_burst_receive(SHT25_ADDR, buf, num) == I2C_MASTER_ERR_NONE) { return SHT25_SUCCESS; } } return SHT25_ERROR; }