/*---------------------------------------------------------------------------*/ 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_receive(uint8_t slave_addr, uint8_t *data, uint8_t len) { uint8_t recv = 0; if((len == 0) || data == NULL) { return I2CM_STAT_INVALID; } if(len == 1) { return i2c_single_receive(slave_addr, &data[0]); } i2c_master_set_slave_address(slave_addr, I2C_RECEIVE); i2c_master_command(I2C_MASTER_CMD_BURST_RECEIVE_START); while(i2c_master_busy()); if(i2c_master_error() == I2C_MASTER_ERR_NONE) { data[0] = i2c_master_data_get(); /* If we got 2 or more bytes pending to be received, keep going*/ for(recv = 1; recv <= (len - 2); recv++) { i2c_master_command(I2C_MASTER_CMD_BURST_RECEIVE_CONT); while(i2c_master_busy()); data[recv] = i2c_master_data_get(); } /* This should be the last byte, stop receiving */ i2c_master_command(I2C_MASTER_CMD_BURST_RECEIVE_FINISH); while(i2c_master_busy()); data[len - 1] = i2c_master_data_get(); } return i2c_master_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; }