Демонстрационная прошивка отладочного комплекта МТС NB-IoT
lis3dh_driver.c
См. документацию.
1 #include "lis3dh_driver.h"
2 
9 void __lis3dh_write_regsiter(uint8_t i2c_addr,uint8_t reg_addr,uint8_t reg_value)
10 {
11  i2c_write_with_pointer(I2C1,i2c_addr,reg_addr,1,&reg_value);
12 }
13 
14 uint8_t __lis3dh_read_register(uint8_t i2c_addr,uint8_t reg_addr)
15 {
16  uint8_t reg_value;
17 
18  i2c_read_with_pointer(I2C1,i2c_addr,reg_addr,1,&reg_value);
19 
20  return reg_value;
21 }
22 
23 uint8_t LIS3DH_ReadSignature(uint8_t i2c_addr)
24 {
25  return __lis3dh_read_register(i2c_addr,LIS3DH_REG_WHOAMI);
26 }
27 
28 void LIS3DH_EnableXYZ(uint8_t i2c_addr,uint8_t data_rate,uint8_t fullscale,uint8_t hi_res)
29 {
30  __lis3dh_write_regsiter(i2c_addr,LIS3SH_REG_CTRL_REG1,((data_rate & 0x0F) << 4) | 0x07);
31  __lis3dh_write_regsiter(i2c_addr,LIS3DH_REG_CTRL_REG4,((fullscale & 0x03) << 4) | ((hi_res & 0x01) << 3));
32 }
33 
34 void LIS3DH_EnableDRDYonINT2(uint8_t i2c_addr)
35 {
36  //Map XYZ data ready on internal interrupt source 1
37  __lis3dh_write_regsiter(i2c_addr,LIS3DH_REG_CTRL_REG3,(1<<4));
38  //Map internal interrupt source 1 to physical pin INT2
39  __lis3dh_write_regsiter(i2c_addr,LIS3DH_REG_CTRL_REG6,(1<<6));
40 }
41 
42 inline int16_t extend_sign_10bit(uint16_t value)
43 {
44  if (value & (1<<9))
45  {
46  return value | 0xFC00;
47  }
48  else
49  {
50  return value;
51  }
52 }
53 
54 /*
55 Standard format is 10 bit left aligned:
56 
57  data_H data_L
58  | D9 D8 D7 D6 D5 D4 D3 D2 | D1 D0 0 0 0 0 0 0 |
59 
60 making normal 10-bit value of it.
61 */
62 inline uint16_t collect_int_10bit(uint8_t data_L,uint8_t data_H)
63 {
64  return ((((uint16_t)data_L) >> 6) | (((uint16_t)data_H) << 2));
65 }
66 
67 void LIS3DH_ReadXYZ(uint8_t i2c_addr,int16_t *X,int16_t *Y,int16_t *Z)
68 {
69  uint8_t data_XYZ[6];
70 
71  i2c_read_with_pointer(I2C1,i2c_addr,LIS3DH_XYZ_DATA_ADDR | LIS3DH_SEQ_READ_BIT,6,data_XYZ);
72 
73 #ifndef INVERT_XY_AXES
74  (*X) = extend_sign_10bit(collect_int_10bit(data_XYZ[0],data_XYZ[1]));
75  (*Y) = extend_sign_10bit(collect_int_10bit(data_XYZ[2],data_XYZ[3]));
76 #else
77  (*X) = -extend_sign_10bit(collect_int_10bit(data_XYZ[0],data_XYZ[1]));
78  (*Y) = -extend_sign_10bit(collect_int_10bit(data_XYZ[2],data_XYZ[3]));
79 #endif
80  (*Z) = extend_sign_10bit(collect_int_10bit(data_XYZ[4],data_XYZ[5]));
81 }
82 
83 uint8_t LIS3DH_XYZ_DataReady(uint8_t i2c_addr)
84 {
85  uint8_t reg_value;
86 
87  reg_value = __lis3dh_read_register(i2c_addr,LIS3DH_REG_STATUS_REG);
88 
89  if (reg_value & (1<<3))
90  {
91  return 1;
92  }
93  else
94  {
95  return 0;
96  }
97 }
LIS3DH_ReadXYZ
void LIS3DH_ReadXYZ(uint8_t i2c_addr, int16_t *X, int16_t *Y, int16_t *Z)
Прочесть значения ускорений по осям
Definition: lis3dh_driver.c:67
LIS3DH_REG_WHOAMI
#define LIS3DH_REG_WHOAMI
Адреса внутренних регистров акселерометра
Definition: lis3dh_driver.h:58
lis3dh_driver.h
LIS3DH_ReadSignature
uint8_t LIS3DH_ReadSignature(uint8_t i2c_addr)
Прочесть индентификационный код акселерометра
Definition: lis3dh_driver.c:23
i2c_write_with_pointer
i2c_error_t i2c_write_with_pointer(I2C_TypeDef *i2c_inst, uint8_t i2c_addr, uint8_t pointer_byte, uint16_t write_length, uint8_t *write_buffer)
Функция выполняет запись регистра устройства I2C по правилам, общим для многих I2C-устройств.
Definition: i2c_api.c:251
i2c_read_with_pointer
i2c_error_t i2c_read_with_pointer(I2C_TypeDef *i2c_inst, uint8_t i2c_addr, uint8_t pointer_byte, uint8_t read_length, uint8_t *read_buffer)
Функция выполняет чтение регистра устройства I2C по правилам, общим для многих I2C-устройств.
Definition: i2c_api.c:171
LIS3DH_EnableXYZ
void LIS3DH_EnableXYZ(uint8_t i2c_addr, uint8_t data_rate, uint8_t fullscale, uint8_t hi_res)
Сконфигурировать параметры работы акселерометра
Definition: lis3dh_driver.c:28