2024-07-26 14:46:48 +02:00

85 lines
3.2 KiB
Markdown

# Overview
The eMD driver is TDK Invensense's reference code to drive our IMU from a microcontroller-based system. It is coded in C language and organized around modules.
## Common files
All modules rely on the following files.
Files:
* `imu/inv_imu_transport.h`: Definition of the abstraction layer used to communicate with the IMU.
* `imu/inv_imu_transport.c`: Implementation of the abstraction layer used to communicate with the IMU.
* `imu/inv_imu.h`: Describes IMU specificities and capabilities.
* `imu/inv_imu_regmap_rev_a.h`: Exposes register map using positions and masks.
* `imu/inv_imu_defs.h`: Defines possible values for most used registers.
* `imu/inv_imu_extfunc.h`: Defines system functions required by the driver, which shall be implemented in the application layer.
## Driver
The **driver** contains the generic functionalities required to operate our IMU.
Depends on:
* **Common files**
Files:
* `imu/inv_imu_driver.h`: Definition of the driver API.
* `imu/inv_imu_driver.c`: Implementation of the driver API.
* `imu/inv_imu_version.h`: Contains the driver's version as a string.
## Self-test
The **self-test** module contains the code required to operate IMU's self-test.
Depends on:
* **Driver**
* **Common files**
Files:
* `imu/inv_imu_selftest.h`: Definition of the self-test module API.
* `imu/inv_imu_selftest.c`: Implementation of the self-test module API.
## APEX
The **APEX** module provides API to operate algorithm features (APEX) on-chip. The following features are available:
* Pedometer (step count and step detector)
* FreeFall detection, including Low-G and High-G detection.
* Tilt detection
* Significant Motion Detection
Depends on:
* **Driver**
* **Common files**
Files:
* `imu/inv_imu_apex.h`: Definition of the APEX module API.
* `imu/inv_imu_apex.c`: Implementation of the APEX module API.
# Initializing driver
Please, follow these steps:
* On your application code, create a local variable of type `inv_imu_device_t` and another one of type `inv_imu_serif_t`: `inv_imu_device_t imu_dev;` and `inv_imu_serif_t imu_serif;`
* Initialize serif structure:
* Provide an implementation of the `read_reg` and `write_reg` functions and initialize the corresponding pointers.
* Configure the `max_read` and `max_write` fields which indicates the maximum numbers of bytes allowed per transaction.
* Configure the `serif_type` field which indicates the serial interface used. Available options are listed in `inv_imu_transport.h`.
* The `context` field can be set to 0.
* Initialize sensor event callback pointer in `inv_imu_adv_var_t` structure. This function will be called when a new sensor data will be available.
* Call the `inv_imu_adv_init` function, providing the device and serif objects as well as a callback which will be executed when a new sample is received.
Example of initialization in C:
```C
inv_imu_device_t imu_dev;
inv_imu_serif_t imu_serif;
/* Initialize serial interface */
imu_serif.read_reg = si_io_imu_read_reg;
imu_serif.write_reg = si_io_imu_write_reg;
imu_serif.max_read = 32768;
imu_serif.max_write = 32768;
imu_serif.serif_type = SERIF_TYPE;
imu_serif.context = 0;
/* Init device */
rc |= inv_imu_init(&imu_dev, &imu_serif, sensor_event_cb);
```