ICM42688P.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #pragma once
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. typedef enum {
  8. DataRate32kHz = 0x01,
  9. DataRate16kHz = 0x02,
  10. DataRate8kHz = 0x03,
  11. DataRate4kHz = 0x04,
  12. DataRate2kHz = 0x05,
  13. DataRate1kHz = 0x06,
  14. DataRate200Hz = 0x07,
  15. DataRate100Hz = 0x08,
  16. DataRate50Hz = 0x09,
  17. DataRate25Hz = 0x0A,
  18. DataRate12_5Hz = 0x0B,
  19. DataRate6_25Hz = 0x0C, // Accelerometer only
  20. DataRate3_125Hz = 0x0D, // Accelerometer only
  21. DataRate1_5625Hz = 0x0E, // Accelerometer only
  22. DataRate500Hz = 0x0F,
  23. } ICM42688PDataRate;
  24. typedef enum {
  25. AccelFullScale16G = 0,
  26. AccelFullScale8G,
  27. AccelFullScale4G,
  28. AccelFullScale2G,
  29. AccelFullScaleTotal,
  30. } ICM42688PAccelFullScale;
  31. typedef enum {
  32. GyroFullScale2000DPS = 0,
  33. GyroFullScale1000DPS,
  34. GyroFullScale500DPS,
  35. GyroFullScale250DPS,
  36. GyroFullScale125DPS,
  37. GyroFullScale62_5DPS,
  38. GyroFullScale31_25DPS,
  39. GyroFullScale15_625DPS,
  40. GyroFullScaleTotal,
  41. } ICM42688PGyroFullScale;
  42. typedef struct {
  43. int16_t x;
  44. int16_t y;
  45. int16_t z;
  46. } __attribute__((packed)) ICM42688PRawData;
  47. typedef struct {
  48. uint8_t header;
  49. int16_t a_x;
  50. int16_t a_y;
  51. int16_t a_z;
  52. int16_t g_x;
  53. int16_t g_y;
  54. int16_t g_z;
  55. uint8_t temp;
  56. uint16_t ts;
  57. } __attribute__((packed)) ICM42688PFifoPacket;
  58. typedef struct {
  59. float x;
  60. float y;
  61. float z;
  62. } ICM42688PScaledData;
  63. typedef struct ICM42688P ICM42688P;
  64. typedef void (*ICM42688PIrqCallback)(void* ctx);
  65. ICM42688P* icm42688p_alloc(FuriHalSpiBusHandle* spi_bus, const GpioPin* irq_pin);
  66. bool icm42688p_init(ICM42688P* icm42688p);
  67. bool icm42688p_deinit(ICM42688P* icm42688p);
  68. void icm42688p_free(ICM42688P* icm42688p);
  69. bool icm42688p_accel_config(
  70. ICM42688P* icm42688p,
  71. ICM42688PAccelFullScale full_scale,
  72. ICM42688PDataRate rate);
  73. float icm42688p_accel_get_full_scale(ICM42688P* icm42688p);
  74. bool icm42688p_gyro_config(
  75. ICM42688P* icm42688p,
  76. ICM42688PGyroFullScale full_scale,
  77. ICM42688PDataRate rate);
  78. float icm42688p_gyro_get_full_scale(ICM42688P* icm42688p);
  79. bool icm42688p_read_accel_raw(ICM42688P* icm42688p, ICM42688PRawData* data);
  80. bool icm42688p_read_gyro_raw(ICM42688P* icm42688p, ICM42688PRawData* data);
  81. bool icm42688p_write_gyro_offset(ICM42688P* icm42688p, ICM42688PScaledData* scaled_data);
  82. void icm42688p_apply_scale(ICM42688PRawData* raw_data, float full_scale, ICM42688PScaledData* data);
  83. void icm42688p_apply_scale_fifo(
  84. ICM42688P* icm42688p,
  85. ICM42688PFifoPacket* fifo_data,
  86. ICM42688PScaledData* accel_data,
  87. ICM42688PScaledData* gyro_data);
  88. float icm42688p_read_temp(ICM42688P* icm42688p);
  89. void icm42688_fifo_enable(
  90. ICM42688P* icm42688p,
  91. ICM42688PIrqCallback irq_callback,
  92. void* irq_context);
  93. void icm42688_fifo_disable(ICM42688P* icm42688p);
  94. uint16_t icm42688_fifo_get_count(ICM42688P* icm42688p);
  95. bool icm42688_fifo_read(ICM42688P* icm42688p, ICM42688PFifoPacket* data);
  96. #ifdef __cplusplus
  97. }
  98. #endif