85 lines
3.2 KiB
Markdown
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);
|
|
```
|