diff --git a/tests/driver_itg320x/Makefile b/tests/driver_itg320x/Makefile new file mode 100644 index 0000000000..3e972cddd7 --- /dev/null +++ b/tests/driver_itg320x/Makefile @@ -0,0 +1,6 @@ +include ../Makefile.tests_common + +USEMODULE += itg320x +USEMODULE += xtimer + +include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_itg320x/README.md b/tests/driver_itg320x/README.md new file mode 100644 index 0000000000..19008d233b --- /dev/null +++ b/tests/driver_itg320x/README.md @@ -0,0 +1,29 @@ +# About + +This is a manual test application for the InvenSense ITG320X 3-axis gyroscope driver. + +# Usage + +The test application demonstrates the use of the ITG320X. It uses the +default configuration parameters: + +- Low pass filter bandwidth (LPF_BW) of 5 Hz (`ITG320X_LPF_BW_5`) +- Internal sample rate (ISR) of 1 kHz which results from LPF_BW of 5 Hz +- Internal sample rate divider (ISR_DIV) of 99 (`ITG320X_PARAM_ISR_DIV`) +- Output data rate (ODR) of 10 Hz resulting from ODR = ISR / (ISR_DIV + 1) + +The application may use two different approaches to retrieve new data, +either + +- periodically fetching the data at a rate lower than the sensor's + output data rate (ODR), or +- fetching the data when the data-ready interrupt is triggered. + +To use the latter approach, module `itg320x_int` has to be enabled and the +GPIO to which the sensor's **INT** output pin is connected has to be +defined by #ITG320X_PARAM_INT_PIN, for example: + +``` +USEMODULE=itg320x_int CFLAGS="-DITG320X_PARAM_INT_PIN=\(GPIO_PIN\(0,3\)\)" \ +make flash -C tests/driver_itg320x BOARD=... +``` diff --git a/tests/driver_itg320x/main.c b/tests/driver_itg320x/main.c new file mode 100644 index 0000000000..2770045fa6 --- /dev/null +++ b/tests/driver_itg320x/main.c @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2018 Gunar Schorcht + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @brief Test application for InvenSense ITG320X 3-axis gyroscope + * @author Gunar Schorcht + * @file + * + * The test application demonstrates the use of the ITG320X. It uses the + * default configuration parameters: + * + * - Low pass filter bandwidth (LPF_BW) of 5 Hz (#ITG320X_LPF_BW_5) + * - Internal sample rate (ISR) of 1 kHz which results from LPF_BW of 5 Hz + * - Internal sample rate divider (ISR_DIV) of 99 (#ITG320X_PARAM_ISR_DIV) + * - Output data rate (ODR) of 10 Hz resulting from + * + * ODR = ISR / (ISR_DIV + 1) + * + * The application may use two different approaches to retrieve new data, + * either + * + * - periodically fetching the data at a rate lower than the sensor's + * output data rate (ODR), or + * - fetching the data when the data-ready interrupt is triggered. + * + * To use the latter approach, module `itg320x_int` has to be enabled and the + * GPIO to which the sensor's **INT** output pin is connected has to be + * defined by #ITG320X_PARAM_INT_PIN, for example: + * + * ``` + * USEMODULE=itg320x_int CFLAGS="-DITG320X_PARAM_INT_PIN=\(GPIO_PIN\(0,3\)\)" \ + * make flash -C tests/driver_itg320x BOARD=... + * ``` +*/ + +#include + +#include "thread.h" +#include "xtimer.h" + +#include "itg320x.h" +#include "itg320x_params.h" + +#define ITG320X_SLEEP (50 * US_PER_MS) + +static kernel_pid_t p_main; + +#ifdef MODULE_ITG320X_INT +static void itg320x_isr_data_ready (void *arg) +{ + (void)arg; + /* send a message to trigger main thread to handle the interrupt */ + msg_t msg; + msg_send(&msg, p_main); +} +#endif + + +int main(void) +{ + itg320x_t dev; + + p_main = sched_active_pid; + + puts("ITG320X gyroscope driver test application\n"); + puts("Initializing ITG320X sensor"); + + /* initialize the sensor with default configuration parameters */ + if (itg320x_init(&dev, &itg320x_params[0]) == ITG320X_OK) { + puts("[OK]\n"); + } + else { + puts("[Failed]"); + return 1; + } + +#ifdef MODULE_ITG320X_INT + /* init interrupt */ + itg320x_init_int(&dev, itg320x_isr_data_ready, 0); +#endif + + while (1) { +#ifdef MODULE_ITG320X_INT + /* wait for data ready interrupt */ + msg_t msg; + msg_receive(&msg); +#else + while (1) { + /* wait longer than period of ITG320X DOR */ + xtimer_usleep(ITG320X_SLEEP); + if (itg320x_data_ready(&dev) == ITG320X_OK) { + break; + } + } +#endif + /* read and print data in any case */ + itg320x_data_t data; + if (itg320x_read(&dev, &data) == ITG320X_OK) { + printf("gyro [dps/10] x: " + "%+5" PRIi16 " y: %+5" PRIi16 " z: %+5" PRIi16 "\n", + data.x, data.y, data.z); + } + } + + return 0; +}