STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
dev_ism330dhcx.h
Go to the documentation of this file.
1#ifndef STAR_DEV_ISM330DHCX_H
2#define STAR_DEV_ISM330DHCX_H
3
4/*
5 * ISM330DHCX 6-axis IMU (U4), SPI mode 3. Datasheet DS13012 Rev 7.
6 *
7 * Configuration (page numbers in DS13012):
8 * CTRL3_C 0x44 BDU + IF_INC (p.51): halves of a sample never mix,
9 * burst reads auto-increment
10 * CTRL4_C 0x04 I2C_disable (p.52): SPI3 is shared, never mistake
11 * traffic for I2C
12 * CTRL1_XL 0x74 833 Hz, +-16 g (p.49, Tables 42-43)
13 * CTRL2_G 0x71 833 Hz, +-4000 dps (p.50, Tables 45-46)
14 * COUNTER_BDR_REG1 0x80 pulsed data-ready (p.46): a clean edge per sample
15 * INT1_CTRL 0x01 accelerometer data-ready on INT1 (p.47)
16 *
17 * Scale (p.10, Table 2): 0.488 mg/LSB, 140 mdps/LSB.
18 * Temperature (p.13, Table 4): 256 LSB/degC, 0 LSB at 25 degC.
19 */
20
21#include <stdint.h>
22
23#include "dev_bus.h"
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
29#define ISM330_WHO_AM_I_VALUE 0x6BU
30#define ISM330_ACCEL_UG_PER_LSB 488 /* micro-g */
31#define ISM330_GYRO_MDPS_PER_LSB 140 /* milli-degrees per second */
32#define ISM330_TEMP_LSB_PER_DEGC 256
33
34typedef struct {
35 int16_t temp; /* raw; degC = 25 + temp / 256 */
36 int16_t gyro[3]; /* raw x, y, z */
37 int16_t accel[3]; /* raw x, y, z */
39
40/* Identify, software-reset, configure and verify every register. */
41int ism330_init(const dev_bus_t* bus);
42
43/* Accelerometer and gyro to power-down (Idle): ODR_XL = ODR_G = 0000 in
44 * CTRL1_XL / CTRL2_G (Table 43 p.49, Table 46 p.50); 3 uA (p.13). DRDY
45 * stops. ism330_init() wakes it again. */
46int ism330_power_down(const dev_bus_t* bus);
47
48/* One 14-byte burst from OUT_TEMP_L (20h): temperature, gyro, accel. */
49int ism330_read(const dev_bus_t* bus, ism330_sample_t* out);
50
51#ifdef __cplusplus
52}
53#endif
54#endif
int ism330_init(const dev_bus_t *bus)
int ism330_power_down(const dev_bus_t *bus)
int ism330_read(const dev_bus_t *bus, ism330_sample_t *out)