bmi160.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <furi_hal.h>
  2. #include "imu.h"
  3. #include "../../lib/bmi160-api/bmi160.h"
  4. #define BMI160_TAG "BMI160"
  5. #define BMI160_DEV_ADDR (0x69 << 1)
  6. struct bmi160_dev bmi160dev;
  7. struct bmi160_sensor_data bmi160_accel;
  8. struct bmi160_sensor_data bmi160_gyro;
  9. int8_t bmi160_write_i2c(uint8_t dev_addr, uint8_t reg_addr, uint8_t* data, uint16_t len) {
  10. if(furi_hal_i2c_write_mem(&furi_hal_i2c_handle_external, dev_addr, reg_addr, data, len, 50))
  11. return BMI160_OK;
  12. return BMI160_E_COM_FAIL;
  13. }
  14. int8_t bmi160_read_i2c(uint8_t dev_addr, uint8_t reg_addr, uint8_t* read_data, uint16_t len) {
  15. if(furi_hal_i2c_read_mem(&furi_hal_i2c_handle_external, dev_addr, reg_addr, read_data, len, 50))
  16. return BMI160_OK;
  17. return BMI160_E_COM_FAIL;
  18. }
  19. bool bmi160_begin() {
  20. FURI_LOG_I(BMI160_TAG, "Init BMI160");
  21. if(!furi_hal_i2c_is_device_ready(&furi_hal_i2c_handle_external, BMI160_DEV_ADDR, 50)) {
  22. FURI_LOG_E(BMI160_TAG, "Device not ready!");
  23. return false;
  24. }
  25. FURI_LOG_I(BMI160_TAG, "Device ready!");
  26. bmi160dev.id = BMI160_DEV_ADDR;
  27. bmi160dev.intf = BMI160_I2C_INTF;
  28. bmi160dev.read = bmi160_read_i2c;
  29. bmi160dev.write = bmi160_write_i2c;
  30. bmi160dev.delay_ms = furi_delay_ms;
  31. if(bmi160_init(&bmi160dev) != BMI160_OK) {
  32. FURI_LOG_E(BMI160_TAG, "Initialization failure!");
  33. FURI_LOG_E(BMI160_TAG, "Chip ID 0x%X", bmi160dev.chip_id);
  34. return false;
  35. }
  36. bmi160dev.accel_cfg.odr = BMI160_ACCEL_ODR_400HZ;
  37. bmi160dev.accel_cfg.range = BMI160_ACCEL_RANGE_4G;
  38. bmi160dev.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;
  39. bmi160dev.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;
  40. bmi160dev.gyro_cfg.odr = BMI160_GYRO_ODR_400HZ;
  41. bmi160dev.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
  42. bmi160dev.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;
  43. bmi160dev.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;
  44. if(bmi160_set_sens_conf(&bmi160dev) != BMI160_OK) {
  45. FURI_LOG_E(BMI160_TAG, "Initialization failure!");
  46. FURI_LOG_E(BMI160_TAG, "Chip ID 0x%X", bmi160dev.chip_id);
  47. return false;
  48. }
  49. FURI_LOG_I(BMI160_TAG, "Initialization success!");
  50. FURI_LOG_I(BMI160_TAG, "Chip ID 0x%X", bmi160dev.chip_id);
  51. return true;
  52. }
  53. int bmi160_read(double* vec) {
  54. if(bmi160_get_sensor_data(
  55. (BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &bmi160_accel, &bmi160_gyro, &bmi160dev) !=
  56. BMI160_OK) {
  57. return 0;
  58. }
  59. vec[0] = ((double)bmi160_accel.x * 4 / 32768) * GRAVITY;
  60. vec[1] = ((double)bmi160_accel.y * 4 / 32768) * GRAVITY;
  61. vec[2] = ((double)bmi160_accel.z * 4 / 32768) * GRAVITY;
  62. vec[3] = ((double)bmi160_gyro.x * 2000 / 32768) * DEG_TO_RAD;
  63. vec[4] = ((double)bmi160_gyro.y * 2000 / 32768) * DEG_TO_RAD;
  64. vec[5] = ((double)bmi160_gyro.z * 2000 / 32768) * DEG_TO_RAD;
  65. return ACC_DATA_READY | GYR_DATA_READY;
  66. }
  67. void bmi160_end() {
  68. }
  69. struct imu_t imu_bmi160 = {
  70. BMI160_DEV_ADDR,
  71. bmi160_begin,
  72. bmi160_end,
  73. bmi160_read,
  74. BMI160_TAG
  75. };