c6dofimu3  2.0.0.0
c6dofimu3.h
Go to the documentation of this file.
1 /*
2  * MikroSDK - MikroE Software Development Kit
3  * Copyright© 2020 MikroElektronika d.o.o.
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
22  * OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
33 // ----------------------------------------------------------------------------
34 
35 #ifndef C6DOFIMU3_H
36 #define C6DOFIMU3_H
37 #define c6dofimu3_obj_t const uint8_t*
38 #define C6DOFIMU3_RETVAL_T uint8_t
39 
40 
41 #include "drv_digital_out.h"
42 #include "drv_digital_in.h"
43 #include "drv_i2c_master.h"
44 #include "drv_spi_master.h"
45 
46 // -------------------------------------------------------------- PUBLIC MACROS
57 #define C6DOFIMU3_MAP_MIKROBUS( cfg, mikrobus ) \
58  cfg.scl = MIKROBUS( mikrobus, MIKROBUS_SCL ); \
59  cfg.sda = MIKROBUS( mikrobus, MIKROBUS_SDA ); \
60  cfg.miso = MIKROBUS( mikrobus, MIKROBUS_MISO ); \
61  cfg.mosi = MIKROBUS( mikrobus, MIKROBUS_MOSI ); \
62  cfg.sck = MIKROBUS( mikrobus, MIKROBUS_SCK ); \
63  cfg.cs = MIKROBUS( mikrobus, MIKROBUS_CS ); \
64  cfg.rst = MIKROBUS( mikrobus, MIKROBUS_RST ); \
65  cfg.int_pin = MIKROBUS( mikrobus, MIKROBUS_INT )
66 
72 #define C6DOFIMU3_MASTER_I2C 0
73 #define C6DOFIMU3_MASTER_SPI 1
74 
80 #define C6DOFIMU3_RETVAL uint8_t
81 
82 #define C6DOFIMU3_OK 0x00
83 #define C6DOFIMU3_INIT_ERROR 0xFF
84 
90 #define C6DOFIMU3_REG_I2C_ADDR_0 0x1E
91 #define C6DOFIMU3_REG_I2C_ADDR_1 0x1D
92 #define C6DOFIMU3_REG_I2C_ADDR_2 0x1C
93 #define C6DOFIMU3_REG_I2C_ADDR_3 0x1F
94 
100 #define C6DOFIMU3_STATUS 0x00
101 #define C6DOFIMU3_DR_STATUS 0x00
102 #define C6DOFIMU3_F_STATUS 0x00
103 #define C6DOFIMU3_OUT_X_MSB 0x01
104 #define C6DOFIMU3_OUT_X_LSB 0x02
105 #define C6DOFIMU3_OUT_Y_MSB 0x03
106 #define C6DOFIMU3_OUT_Y_LSB 0x04
107 #define C6DOFIMU3_OUT_Z_MSB 0x05
108 #define C6DOFIMU3_OUT_Z_LSB 0x06
109 #define C6DOFIMU3_F_SETUP 0x09
110 #define C6DOFIMU3_TRIG_CFG 0x0A
111 #define C6DOFIMU3_SYSMOD 0x0B
112 #define C6DOFIMU3_INT_SOURCE 0x0C
113 #define C6DOFIMU3_WHO_AM_I 0x0D
114 #define C6DOFIMU3_XYZ_DATA_CFG 0x0E
115 #define C6DOFIMU3_HP_FILTER_CUTOFF 0x0F
116 #define C6DOFIMU3_PL_STATUS 0x10
117 #define C6DOFIMU3_PL_CFG 0x11
118 #define C6DOFIMU3_PL_COUNT 0x12
119 #define C6DOFIMU3_PL_BF_ZCOMP 0x13
120 #define C6DOFIMU3_P_L_THS_REG 0x14
121 #define C6DOFIMU3_A_FFMT_CFG 0x15
122 #define C6DOFIMU3_A_FFMT_SRC 0x16
123 #define C6DOFIMU3_A_FFMT_THS 0x17
124 #define C6DOFIMU3_A_FFMT_COUNT 0x18
125 #define C6DOFIMU3_TRANSIENT_CFG 0x1D
126 #define C6DOFIMU3_TRANSIENT_SRC 0x1E
127 #define C6DOFIMU3_TRANSIENT_THS 0x1F
128 #define C6DOFIMU3_TRANSIENT_COUNT 0x20
129 #define C6DOFIMU3_PULSE_CFG 0x21
130 #define C6DOFIMU3_PULSE_SRC 0x22
131 #define C6DOFIMU3_PULSE_THSX 0x23
132 #define C6DOFIMU3_PULSE_THSY 0x24
133 #define C6DOFIMU3_PULSE_THSZ 0x25
134 #define C6DOFIMU3_PULSE_TMLT 0x26
135 #define C6DOFIMU3_PULSE_LTCY 0x27
136 #define C6DOFIMU3_PULSE_WIND 0x28
137 #define C6DOFIMU3_ASLP_COUNT 0x29
138 #define C6DOFIMU3_CTRL_REG1 0x2A
139 #define C6DOFIMU3_CTRL_REG2 0x2B
140 #define C6DOFIMU3_CTRL_REG3 0x2C
141 #define C6DOFIMU3_CTRL_REG4 0x2D
142 #define C6DOFIMU3_CTRL_REG5 0x2E
143 #define C6DOFIMU3_OFF_X 0x2F
144 #define C6DOFIMU3_OFF_Y 0x30
145 #define C6DOFIMU3_OFF_Z 0x31
146 #define C6DOFIMU3_M_DR_STATUS 0x32
147 #define C6DOFIMU3_M_OUT_X_MSB 0x33
148 #define C6DOFIMU3_M_OUT_X_LSB 0x34
149 #define C6DOFIMU3_M_OUT_Y_MSB 0x35
150 #define C6DOFIMU3_M_OUT_Y_LSB 0x36
151 #define C6DOFIMU3_M_OUT_Z_MSB 0x37
152 #define C6DOFIMU3_M_OUT_Z_LSB 0x38
153 #define C6DOFIMU3_CMP_OUT_X_MSB 0x39
154 #define C6DOFIMU3_CMP_OUT_X_LSB 0x3A
155 #define C6DOFIMU3_CMP_OUT_Y_MSB 0x3B
156 #define C6DOFIMU3_CMP_OUT_Y_LSB 0x3C
157 #define C6DOFIMU3_CMP_OUT_Z_MSB 0x3D
158 #define C6DOFIMU3_CMP_OUT_Z_LSB 0x3E
159 #define C6DOFIMU3_M_OFF_X_MSB 0x3F
160 #define C6DOFIMU3_M_OFF_X_LSB 0x40
161 #define C6DOFIMU3_M_OFF_Y_MSB 0x41
162 #define C6DOFIMU3_M_OFF_Y_LSB 0x42
163 #define C6DOFIMU3_M_OFF_Z_MSB 0x43
164 #define C6DOFIMU3_M_OFF_Z_LSB 0x44
165 #define C6DOFIMU3_MAX_X_MSB 0x45
166 #define C6DOFIMU3_MAX_X_LSB 0x46
167 #define C6DOFIMU3_MAX_Y_MSB 0x47
168 #define C6DOFIMU3_MAX_Y_LSB 0x48
169 #define C6DOFIMU3_MAX_Z_MSB 0x49
170 #define C6DOFIMU3_MAX_Z_LSB 0x4A
171 #define C6DOFIMU3_MIN_X_MSB 0x4B
172 #define C6DOFIMU3_MIN_X_LSB 0x4C
173 #define C6DOFIMU3_MIN_Y_MSB 0x4D
174 #define C6DOFIMU3_MIN_Y_LSB 0x4E
175 #define C6DOFIMU3_MIN_Z_MSB 0x4F
176 #define C6DOFIMU3_MIN_Z_LSB 0x50
177 #define C6DOFIMU3_TEMP 0x51
178 #define C6DOFIMU3_M_THS_CFG 0x52
179 #define C6DOFIMU3_M_THS_SRC 0x53
180 #define C6DOFIMU3_M_THS_X_MSB 0x54
181 #define C6DOFIMU3_M_THS_X_LSB 0x55
182 #define C6DOFIMU3_M_THS_Y_MSB 0x56
183 #define C6DOFIMU3_M_THS_Y_LSB 0x57
184 #define C6DOFIMU3_M_THS_Z_MSB 0x58
185 #define C6DOFIMU3_M_THS_Z_LSB 0x59
186 #define C6DOFIMU3_M_THS_COUNT 0x5A
187 #define C6DOFIMU3_M_CTRL_REG1 0x5B
188 #define C6DOFIMU3_M_CTRL_REG2 0x5C
189 #define C6DOFIMU3_M_CTRL_REG3 0x5D
190 #define C6DOFIMU3_M_INT_SRC 0x5E
191 #define C6DOFIMU3_A_VECM_CFG 0x5F
192 #define C6DOFIMU3_A_VECM_THS_MSB 0x60
193 #define C6DOFIMU3_A_VECM_THS_LSB 0x61
194 #define C6DOFIMU3_A_VECM_CNT 0x62
195 #define C6DOFIMU3_A_VECM_INITX_MSB 0x63
196 #define C6DOFIMU3_A_VECM_INITX_LSB 0x64
197 #define C6DOFIMU3_A_VECM_INITY_MSB 0x65
198 #define C6DOFIMU3_A_VECM_INITY_LSB 0x66
199 #define C6DOFIMU3_A_VECM_INITZ_MSB 0x67
200 #define C6DOFIMU3_A_VECM_INITZ_LSB 0x68
201 #define C6DOFIMU3_M_VECM_CFG 0x69
202 #define C6DOFIMU3_M_VECM_THS_MSB 0x6A
203 #define C6DOFIMU3_M_VECM_THS_LSB 0x6B
204 #define C6DOFIMU3_M_VECM_CNT 0x6C
205 #define C6DOFIMU3_M_VECM_INITX_MSB 0x6D
206 #define C6DOFIMU3_M_VECM_INITX_LSB 0x6E
207 #define C6DOFIMU3_M_VECM_INITY_MSB 0x6F
208 #define C6DOFIMU3_M_VECM_INITY_LSB 0x70
209 #define C6DOFIMU3_M_VECM_INITZ_MSB 0x71
210 #define C6DOFIMU3_M_VECM_INITZ_LSB 0x72
211 #define C6DOFIMU3_A_FFMT_THS_X_MSB 0x73
212 #define C6DOFIMU3_A_FFMT_THS_X_LSB 0x74
213 #define C6DOFIMU3_A_FFMT_THS_Y_MSB 0x75
214 #define C6DOFIMU3_A_FFMT_THS_Y_LSB 0x76
215 #define C6DOFIMU3_A_FFMT_THS_Z_MSB 0x77
216 #define C6DOFIMU3_A_FFMT_THS_Z_LSB 0x78
217 
223 #define C6DOFIMU3_ACCEL_RES_2G 0.244
224 #define C6DOFIMU3_ACCEL_RES_4G 0.488
225 #define C6DOFIMU3_ACCEL_RES_8G 0.976
226 
232 #define C6DOFIMU3_MAGNETOMETER_RES 0.1
233 
239 #define C6DOFIMU3_DEVICE_ID_VAL 0xC7
240 
246 #define C6DOFIMU3_ERROR 0x00
247 #define C6DOFIMU3_SUCCESS 0x01
248 
254 #define C6DOFIMU3_BIT_MASK_SPI_CMD_WRITE 0x80
255 #define C6DOFIMU3_BIT_MASK_SPI_CMD_READ 0x7F
256 #define C6DOFIMU3_BIT_MASK_BIT_7 0x80
257 
263 #define C6DOFIMU3_DR_STATUS_XYZ_DATA_ERROR 0x00
264 
270 #define C6DOFIMU3_RST_PIN_STATE_LOW 0x00
271 #define C6DOFIMU3_RST_PIN_STATE_HIGH 0x01
272 
278 #define C6DOFIMU3_SPI_COMMUNICATION_DUMMY 0x00
279 
285 #define SPI_COMMUNICATION 1
286 #define I2C_COMMUNICATION 2
287  // End group macro
290 // --------------------------------------------------------------- PUBLIC TYPES
295 typedef struct
296 {
297  float x;
298  float y;
299  float z;
300 }
302 
303 typedef struct
304 {
305  float x;
306  float y;
307  float z;
308 }
310 
314 typedef uint8_t c6dofimu3_select_t;
315 
319 typedef void ( *c6dofimu3_master_io_t )( struct c6dofimu3_s*, uint8_t, uint8_t*, uint8_t );
320 
324 typedef struct c6dofimu3_s
325 {
326  // Output pins
327 
328  digital_out_t cs;
329  digital_out_t rst;
330 
331  // Input pins
332 
333  digital_in_t int_pin;
334 
335  // Modules
336 
337  i2c_master_t i2c;
338  spi_master_t spi;
339 
340  // ctx variable
341 
342  uint8_t slave_address;
343  pin_name_t chip_select;
344 
348 
350 
351 } c6dofimu3_t;
352 
356 typedef struct
357 {
358  // Communication gpio pins
359 
360  pin_name_t scl;
361  pin_name_t sda;
362  pin_name_t miso;
363  pin_name_t mosi;
364  pin_name_t sck;
365  pin_name_t cs;
366 
367  // Additional gpio pins
368 
369  pin_name_t rst;
370  pin_name_t int_pin;
371 
372  // static variable
373 
374  uint32_t i2c_speed;
375  uint8_t i2c_address;
376 
377  uint32_t spi_speed;
378  spi_master_mode_t spi_mode;
379  spi_master_chip_select_polarity_t cs_polarity;
380 
382 
384  // End types group
386 // ----------------------------------------------- PUBLIC FUNCTION DECLARATIONS
392 #ifdef __cplusplus
393 extern "C"{
394 #endif
395 
405 
415 
423 void c6dofimu3_default_cfg ( c6dofimu3_t *ctx );
424 
435 void c6dofimu3_generic_write ( c6dofimu3_t *ctx, uint8_t reg, uint8_t *data_buf, uint8_t len );
436 
447 void c6dofimu3_generic_read ( c6dofimu3_t *ctx, uint8_t reg, uint8_t *data_buf, uint8_t len );
448 
459 void c6dofimu3_set_rst ( c6dofimu3_t *ctx, uint8_t rst_state );
460 
474 void c6dofimu3_multi_write ( c6dofimu3_t *ctx, uint8_t reg, uint8_t *p_tx_data, uint8_t n_bytes );
475 
489 void c6dofimu3_multi_read ( c6dofimu3_t *ctx, uint8_t reg, uint8_t *p_rx_data, uint8_t n_bytes );
490 
503 
516 
526 void c6dofimu3_standby ( c6dofimu3_t *ctx );
527 
536 void c6dofimu3_active ( c6dofimu3_t *ctx );
537 
551 
565 
579 
594 uint8_t c6dofimu3_check_int1 ( c6dofimu3_t *ctx );
595 
596 #ifdef __cplusplus
597 }
598 #endif
599 #endif // _C6DOFIMU3_H_
600  // End public_function group
603 
604 // ------------------------------------------------------------------------- END
c6dofimu3_select_t
uint8_t c6dofimu3_select_t
Communication type.
Definition: c6dofimu3.h:314
c6dofimu3_cfg_t::scl
pin_name_t scl
Definition: c6dofimu3.h:360
mag_data
c6dofimu3_mag_t mag_data
Definition: main.c:31
c6dofimu3_master_io_t
void(* c6dofimu3_master_io_t)(struct c6dofimu3_s *, uint8_t, uint8_t *, uint8_t)
Master Input/Output type.
Definition: c6dofimu3.h:319
c6dofimu3_cfg_t::sck
pin_name_t sck
Definition: c6dofimu3.h:364
c6dofimu3_s::communication_interface
uint8_t communication_interface
Definition: c6dofimu3.h:349
c6dofimu3_s
Click ctx object definition.
Definition: c6dofimu3.h:324
c6dofimu3_cfg_t::spi_mode
spi_master_mode_t spi_mode
Definition: c6dofimu3.h:378
c6dofimu3_s::write_f
c6dofimu3_master_io_t write_f
Definition: c6dofimu3.h:345
c6dofimu3_generic_write
void c6dofimu3_generic_write(c6dofimu3_t *ctx, uint8_t reg, uint8_t *data_buf, uint8_t len)
Generic write function.
c6dofimu3_cfg_setup
void c6dofimu3_cfg_setup(c6dofimu3_cfg_t *cfg)
Config Object Initialization function.
c6dofimu3_cfg_t::i2c_address
uint8_t i2c_address
Definition: c6dofimu3.h:375
c6dofimu3_read_accel_data
void c6dofimu3_read_accel_data(c6dofimu3_t *ctx, c6dofimu3_accel_t *accel_data)
Read Accel data function.
c6dofimu3_accel_t
Definition: c6dofimu3.h:295
c6dofimu3_active
void c6dofimu3_active(c6dofimu3_t *ctx)
Set active mode function.
c6dofimu3_mag_t::x
float x
Definition: c6dofimu3.h:305
c6dofimu3_cfg_t::i2c_speed
uint32_t i2c_speed
Definition: c6dofimu3.h:374
c6dofimu3_accel_t::x
float x
Definition: c6dofimu3.h:297
c6dofimu3_s::spi
spi_master_t spi
Definition: c6dofimu3.h:338
c6dofimu3_s::chip_select
pin_name_t chip_select
Definition: c6dofimu3.h:343
c6dofimu3_s::read_f
c6dofimu3_master_io_t read_f
Definition: c6dofimu3.h:346
c6dofimu3_cfg_t
Click configuration structure definition.
Definition: c6dofimu3.h:356
c6dofimu3_s::i2c
i2c_master_t i2c
Definition: c6dofimu3.h:337
c6dofimu3_cfg_t::spi_speed
uint32_t spi_speed
Definition: c6dofimu3.h:377
c6dofimu3_cfg_t::cs_polarity
spi_master_chip_select_polarity_t cs_polarity
Definition: c6dofimu3.h:379
c6dofimu3_cfg_t::int_pin
pin_name_t int_pin
Definition: c6dofimu3.h:370
c6dofimu3_accel_t::z
float z
Definition: c6dofimu3.h:299
c6dofimu3_mag_t::z
float z
Definition: c6dofimu3.h:307
c6dofimu3_standby
void c6dofimu3_standby(c6dofimu3_t *ctx)
Set standby mode function.
c6dofimu3_mag_t
Definition: c6dofimu3.h:303
c6dofimu3_cfg_t::rst
pin_name_t rst
Definition: c6dofimu3.h:369
c6dofimu3_check_int1
uint8_t c6dofimu3_check_int1(c6dofimu3_t *ctx)
Get interrupt ststus function.
c6dofimu3_read_mag_data
void c6dofimu3_read_mag_data(c6dofimu3_t *ctx, c6dofimu3_mag_t *mag_data)
Read Magnetometer data function.
c6dofimu3_cfg_t::sda
pin_name_t sda
Definition: c6dofimu3.h:361
c6dofimu3_multi_write
void c6dofimu3_multi_write(c6dofimu3_t *ctx, uint8_t reg, uint8_t *p_tx_data, uint8_t n_bytes)
Multi data write function.
c6dofimu3_s::slave_address
uint8_t slave_address
Definition: c6dofimu3.h:342
c6dofimu3_cfg_t::sel
c6dofimu3_select_t sel
Definition: c6dofimu3.h:381
c6dofimu3_check_id
C6DOFIMU3_RETVAL_T c6dofimu3_check_id(c6dofimu3_t *ctx)
Check ID function.
c6dofimu3_s::cs
digital_out_t cs
Definition: c6dofimu3.h:328
c6dofimu3_multi_read
void c6dofimu3_multi_read(c6dofimu3_t *ctx, uint8_t reg, uint8_t *p_rx_data, uint8_t n_bytes)
Multi data read function.
c6dofimu3_s::master_sel
c6dofimu3_select_t master_sel
Definition: c6dofimu3.h:347
c6dofimu3_t
struct c6dofimu3_s c6dofimu3_t
Click ctx object definition.
c6dofimu3_generic_read
void c6dofimu3_generic_read(c6dofimu3_t *ctx, uint8_t reg, uint8_t *data_buf, uint8_t len)
Generic read function.
c6dofimu3_default_cfg
void c6dofimu3_default_cfg(c6dofimu3_t *ctx)
Click Default Configuration function.
C6DOFIMU3_RETVAL
#define C6DOFIMU3_RETVAL
Definition: c6dofimu3.h:80
c6dofimu3_cfg_t::cs
pin_name_t cs
Definition: c6dofimu3.h:365
c6dofimu3_s::int_pin
digital_in_t int_pin
Definition: c6dofimu3.h:333
c6dofimu3_cfg_t::mosi
pin_name_t mosi
Definition: c6dofimu3.h:363
accel_data
c6dofimu3_accel_t accel_data
Definition: main.c:30
c6dofimu3_set_rst
void c6dofimu3_set_rst(c6dofimu3_t *ctx, uint8_t rst_state)
Set RST pin state function.
c6dofimu3_init
C6DOFIMU3_RETVAL c6dofimu3_init(c6dofimu3_t *ctx, c6dofimu3_cfg_t *cfg)
Initialization function.
c6dofimu3_cfg_t::miso
pin_name_t miso
Definition: c6dofimu3.h:362
c6dofimu3_check_data_ready
C6DOFIMU3_RETVAL_T c6dofimu3_check_data_ready(c6dofimu3_t *ctx)
Check data ready function.
c6dofimu3_get_data
void c6dofimu3_get_data(c6dofimu3_t *ctx, c6dofimu3_accel_t *accel_data, c6dofimu3_mag_t *mag_data)
Read Accel and Magnetometer data function.
c6dofimu3_mag_t::y
float y
Definition: c6dofimu3.h:306
C6DOFIMU3_RETVAL_T
#define C6DOFIMU3_RETVAL_T
Definition: c6dofimu3.h:38
c6dofimu3_accel_t::y
float y
Definition: c6dofimu3.h:298
c6dofimu3_s::rst
digital_out_t rst
Definition: c6dofimu3.h:329