lis3dh/README.md

90 lines
2.5 KiB
Markdown
Raw Normal View History

2023-12-19 10:21:40 +00:00
# LIS3DH
2024-01-03 15:41:58 +00:00
A C89 driver for the 3-axis accelerometer LIS3DH. Supports both I2C and SPI.
2024-01-03 15:41:58 +00:00
### Features
> - FIFO
> - HP filter
> - 2G, 4G, 8G and 16G
2024-01-01 13:34:11 +00:00
> - Low-power mode, normal mode and high-resolution mode
2024-01-03 15:41:58 +00:00
> - ADC and temperature sensing
> - Interrupt generation
2024-01-03 15:41:58 +00:00
> - Free-fall detection
> - Single-click detection
2024-01-01 13:08:06 +00:00
> - Double-click detection
2024-01-03 16:48:22 +00:00
> - 4D/6D orientation detection
2024-01-03 15:41:58 +00:00
## Examples
2024-01-06 23:53:38 +00:00
See the `example/` dir for complete code examples and explanations of LIS3DH terminology
2023-12-27 20:59:47 +00:00
## Implementation
2024-01-03 15:41:58 +00:00
This driver requires the user to implement the following interface functions:
2023-12-27 19:54:47 +00:00
This project has example interface code for I2C and SPI used on Raspberry Pi 4, and for STM32.
2023-12-27 20:59:47 +00:00
```c
/* initialise the "interface" */
int init(void);
2024-01-06 17:25:44 +00:00
/* read from register `reg', `size' amount of bytes, and write them to `dst' */
2023-12-27 20:59:47 +00:00
int read(uint8_t reg, uint8_t *dst, uint32_t size);
2024-01-06 17:25:44 +00:00
/* write `value' to register `reg' */
2023-12-27 20:59:47 +00:00
int write(uint8_t reg, uint8_t value);
2024-01-06 17:25:44 +00:00
/* sleep for `dur_us' microseconds */
2023-12-27 20:59:47 +00:00
int sleep(uint32_t dur_us);
/* deinitalise the "interface" */
int deinit(void);
```
2024-01-03 15:41:58 +00:00
All above functions return `0` on success, and any non-zero value on error.
2023-12-27 19:54:47 +00:00
2024-01-04 14:37:44 +00:00
If `init` and/or `deinit` are set to `NULL`, they will be ignored. Useful on microcontrollers.
2023-12-29 23:24:15 +00:00
2024-01-03 15:41:58 +00:00
---
2024-01-06 17:53:39 +00:00
## Functions
2023-12-27 19:54:47 +00:00
2024-01-06 17:53:39 +00:00
```c
int lis3dh_init(lis3dh_t *lis3dh);
int lis3dh_deinit(lis3dh_t *lis3dh);
int lis3dh_configure(lis3dh_t *lis3dh);
int lis3dh_read(lis3dh_t *lis3dh);
int lis3dh_read_fifo(lis3dh_t *lis3dh, struct lis3dh_fifo_data *fifo);
int lis3dh_read_int1(lis3dh_t *lis3dh);
int lis3dh_read_int2(lis3dh_t *lis3dh);
int lis3dh_read_click(lis3dh_t *lis3dh);
int lis3dh_reference(lis3dh_t *lis3dh);
int lis3dh_reset(lis3dh_t *lis3dh);
int lis3dh_read_adc(lis3dh_t *lis3dh);
int lis3dh_read_temp(lis3dh_t *lis3dh);
2024-01-06 23:28:58 +00:00
int lis3dh_fifo_reset(lis3dh_t *lis3dh);
2024-01-06 17:53:39 +00:00
```
All functions return `0` on success, and any non-zero value on error.
## STM32
Example i2c and SPI functions that work
### i2c
```c
2024-01-06 17:25:44 +00:00
#define LIS3DH_I2C_ADDR 0x18 /* can also be 0x19 */
int i2c_write(uint8_t reg, uint8_t value) {
2023-12-27 19:59:29 +00:00
uint8_t buf[2] = { reg, value };
HAL_I2C_Master_Transmit(&hi2c2, LIS3DH_I2C_ADDR << 1, buf, 2, HAL_MAX_DELAY);
return 0;
}
int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) {
if (size > 1) {
reg |= 0x80; /* auto-increment bit */
}
2023-12-27 19:59:29 +00:00
uint8_t send[2] = { reg, 0x00 };
HAL_I2C_Master_Transmit(&hi2c2, LIS3DH_I2C_ADDR << 1, send, 2, HAL_MAX_DELAY);
HAL_I2C_Master_Receive(&hi2c2, LIS3DH_I2C_ADDR << 1, dst, size, HAL_MAX_DELAY);
return 0;
}
2023-12-27 19:54:47 +00:00
```
2024-01-06 17:53:39 +00:00
### SPI
```c
TODO
```