From ed2bb9d3f8aee600a53920ee8ec9991c7456a231 Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Wed, 25 Jan 2017 14:53:10 +0100 Subject: [PATCH] drivers/lis3dh: fixed bug and simplified init() - changed to SPI_MODE_0 - made init() function use the params struct as parameter --- boards/mulle/include/board.h | 1 - drivers/Makefile.dep | 5 +++ drivers/include/lis3dh.h | 8 +--- drivers/lis3dh/lis3dh.c | 22 ++++++----- sys/auto_init/saul/auto_init_lis3dh.c | 5 +-- tests/driver_lis3dh/Makefile | 14 ------- tests/driver_lis3dh/main.c | 55 ++++++--------------------- 7 files changed, 32 insertions(+), 78 deletions(-) diff --git a/boards/mulle/include/board.h b/boards/mulle/include/board.h index a875dbae2..063705fdd 100644 --- a/boards/mulle/include/board.h +++ b/boards/mulle/include/board.h @@ -120,7 +120,6 @@ void board_init(void); * @name LIS3DH configuration * @{ */ - #define LIS3DH_INT1 GPIO_PIN(PORT_C, 18) #define LIS3DH_INT2 GPIO_PIN(PORT_C, 17) #define LIS3DH_CS GPIO_PIN(PORT_D, 0) diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep index e511c53a5..38c4cf497 100644 --- a/drivers/Makefile.dep +++ b/drivers/Makefile.dep @@ -108,6 +108,11 @@ ifneq (,$(filter kw2xrf,$(USEMODULE))) endif endif +ifneq (,$(filter lis3dh,$(USEMODULE))) + FEATURES_REQUIRED += periph_gpio + FEATURES_REQUIRED += periph_spi +endif + ifneq (,$(filter lm75a,$(USEMODULE))) USEMODULE += xtimer endif diff --git a/drivers/include/lis3dh.h b/drivers/include/lis3dh.h index a0015fdc7..78e9e0fff 100644 --- a/drivers/include/lis3dh.h +++ b/drivers/include/lis3dh.h @@ -714,16 +714,12 @@ typedef struct __attribute__((packed)) * @brief Initialize a LIS3DH sensor instance * * @param[in] dev Device descriptor of sensor to initialize - * @param[in] spi SPI bus the accelerometer is connected to - * @param[in] clk SPI bus speed - * @param[in] cs_pin GPIO connected to the chip select pin of the accelerometer - * @param[in] scale Initial scale setting of the sensor + * @param[in] params Configuration parameters * * @return 0 on success * @return -1 on error */ -int lis3dh_init(lis3dh_t *dev, spi_t spi, spi_clk_t clk, - gpio_t cs_pin, uint8_t scale); +int lis3dh_init(lis3dh_t *dev, const lis3dh_params_t *params); /** * @brief Read 3D acceleration data from the accelerometer diff --git a/drivers/lis3dh/lis3dh.c b/drivers/lis3dh/lis3dh.c index 808687bae..bc13314c1 100644 --- a/drivers/lis3dh/lis3dh.c +++ b/drivers/lis3dh/lis3dh.c @@ -24,6 +24,9 @@ #include "periph/spi.h" #include "lis3dh.h" +#define ENABLE_DEBUG (0) +#include "debug.h" + #define SPI_MODE SPI_MODE_0 static inline int lis3dh_write_bits(const lis3dh_t *dev, const lis3dh_reg_t reg, @@ -33,27 +36,26 @@ static int lis3dh_write_reg(const lis3dh_t *dev, const lis3dh_reg_t reg, static int lis3dh_read_regs(const lis3dh_t *dev, const lis3dh_reg_t reg, const uint8_t len, uint8_t *buf); -int lis3dh_init(lis3dh_t *dev, spi_t spi, spi_clk_t clk, - gpio_t cs_pin, uint8_t scale) +int lis3dh_init(lis3dh_t *dev, const lis3dh_params_t *params) { uint8_t test; - dev->spi = spi; - dev->clk = clk; - dev->cs = cs_pin; - dev->scale = 0; + dev->spi = params->spi; + dev->clk = params->clk; + dev->cs = params->cs; + dev->scale = params->scale; /* initialize the chip select line */ if (spi_init_cs(dev->spi, dev->cs) != SPI_OK) { + DEBUG("[lis3dh] error while initializing CS pin\n"); return -1; } /* test connection to the device */ - spi_acquire(dev->spi, dev->cs, SPI_MODE, dev->clk); - test = spi_transfer_reg(dev->spi, dev->cs, LIS3DH_REG_WHO_AM_I, 0); - spi_release(dev->spi); + lis3dh_read_regs(dev, LIS3DH_REG_WHO_AM_I, 1, &test); if (test != LIS3DH_WHO_AM_I_RESPONSE) { /* chip is not responding correctly */ + DEBUG("[lis3dh] error reading the who am i reg [0x%02x]\n", (int)test); return -1; } @@ -74,7 +76,7 @@ int lis3dh_init(lis3dh_t *dev, spi_t spi, spi_clk_t clk, lis3dh_write_reg(dev, LIS3DH_REG_CTRL_REG6, 0); /* Configure scale */ - lis3dh_set_scale(dev, scale); + lis3dh_set_scale(dev, dev->scale); return 0; } diff --git a/sys/auto_init/saul/auto_init_lis3dh.c b/sys/auto_init/saul/auto_init_lis3dh.c index 4890069e4..a5c796736 100644 --- a/sys/auto_init/saul/auto_init_lis3dh.c +++ b/sys/auto_init/saul/auto_init_lis3dh.c @@ -50,17 +50,16 @@ extern saul_driver_t lis3dh_saul_driver; void auto_init_lis3dh(void) { for (unsigned int i = 0; i < LIS3DH_NUM; i++) { - const lis3dh_params_t *p = &lis3dh_params[i]; int res; LOG_DEBUG("[auto_init_saul] initializing lis3dh #%u\n", i); - res = lis3dh_init(&lis3dh_devs[i], p->spi, p->clk, p->cs, p->scale); + res = lis3dh_init(&lis3dh_devs[i], &lis3dh_params[i]); if (res < 0) { LOG_ERROR("[auto_init_saul] error initializing lis3dh #%u\n", i); continue; } - res = lis3dh_set_odr(&lis3dh_devs[i], p->odr); + res = lis3dh_set_odr(&lis3dh_devs[i], lis3dh_params[i].odr); if (res < 0) { LOG_ERROR("[auto_init_saul] error setting ODR for lis3dh #%u\n", i); continue; diff --git a/tests/driver_lis3dh/Makefile b/tests/driver_lis3dh/Makefile index 5e10cf99f..a495db4ae 100644 --- a/tests/driver_lis3dh/Makefile +++ b/tests/driver_lis3dh/Makefile @@ -1,21 +1,7 @@ APPLICATION = driver_lis3dh include ../Makefile.tests_common -FEATURES_REQUIRED = periph_spi periph_gpio - USEMODULE += lis3dh USEMODULE += xtimer -# set default device parameters in case they are undefined -TEST_LIS3DH_SPI ?= SPI_DEV\(0\) -TEST_LIS3DH_CS ?= GPIO_PIN\(0,0\) -TEST_LIS3DH_INT1 ?= GPIO_PIN\(0,1\) -TEST_LIS3DH_INT2 ?= GPIO_PIN\(0,2\) - -# export parameters -CFLAGS += -DTEST_LIS3DH_SPI=$(TEST_LIS3DH_SPI) -CFLAGS += -DTEST_LIS3DH_CS=$(TEST_LIS3DH_CS) -CFLAGS += -DTEST_LIS3DH_INT1=$(TEST_LIS3DH_INT1) -CFLAGS += -DTEST_LIS3DH_INT2=$(TEST_LIS3DH_INT2) - include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_lis3dh/main.c b/tests/driver_lis3dh/main.c index 6dfb770a2..7abe5e360 100644 --- a/tests/driver_lis3dh/main.c +++ b/tests/driver_lis3dh/main.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2015 Eistec AB + * 2017 Freie Universität Berlin * * 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 @@ -13,55 +14,20 @@ * @file * @brief Test application for the LIS3DH accelerometer driver * - * @author Joakim Nohlgård + * @author Hauke Petersen * * @} */ #include -#include "board.h" #include "xtimer.h" -#include "periph/spi.h" -#include "periph/gpio.h" #include "lis3dh.h" +#include "lis3dh_params.h" + -/* Check for definition of hardware pins, default to board.h values if not set. */ -#ifndef TEST_LIS3DH_SPI -#ifdef LIS3DH_SPI -#define TEST_LIS3DH_SPI LIS3DH_SPI -#else -#error "TEST_LIS3DH_SPI not defined" -#endif -#endif -#ifndef TEST_LIS3DH_CS -#ifdef LIS3DH_CS -#define TEST_LIS3DH_CS LIS3DH_CS -#else -#error "TEST_LIS3DH_CS not defined" -#endif -#endif -#ifndef TEST_LIS3DH_INT1 -#ifdef LIS3DH_INT1 -#define TEST_LIS3DH_INT1 LIS3DH_INT1 -#else -#error "TEST_LIS3DH_INT1 not defined" -#endif -#endif -#ifndef TEST_LIS3DH_INT2 -#ifdef LIS3DH_INT2 -#define TEST_LIS3DH_INT2 LIS3DH_INT2 -#else -#error "TEST_LIS3DH_INT2 not defined" -#endif -#endif - - -#define SCALE 4 -#define ODR LIS3DH_ODR_100Hz #define SLEEP (100 * 1000U) -#define SPI_CONF (SPI_CONF_SECOND_FALLING) -#define SPI_CLK (SPI_CLK_10MHZ) #define WATERMARK_LEVEL 16 @@ -81,7 +47,7 @@ int main(void) puts("LIS3DH accelerometer driver test application\n"); puts("Initializing LIS3DH sensor... "); - if (lis3dh_init(&dev, TEST_LIS3DH_SPI, SPI_CLK, TEST_LIS3DH_CS, SCALE) == 0) { + if (lis3dh_init(&dev, &lis3dh_params[0]) == 0) { puts("[OK]"); } else { @@ -90,7 +56,7 @@ int main(void) } puts("Set ODR... "); - if (lis3dh_set_odr(&dev, ODR) == 0) { + if (lis3dh_set_odr(&dev, lis3dh_params[0].odr) == 0) { puts("[OK]"); } else { @@ -99,7 +65,7 @@ int main(void) } puts("Set scale... "); - if (lis3dh_set_scale(&dev, SCALE) == 0) { + if (lis3dh_set_scale(&dev, lis3dh_params[0].scale) == 0) { puts("[OK]"); } else { @@ -144,7 +110,8 @@ int main(void) } puts("Set INT1 callback"); - if (gpio_init_int(TEST_LIS3DH_INT1, GPIO_IN, GPIO_RISING, test_int1, (void*)&int1_count) == 0) { + if (gpio_init_int(lis3dh_params[0].int1, GPIO_IN, GPIO_RISING, + test_int1, (void*)&int1_count) == 0) { puts("[OK]"); } else { @@ -172,7 +139,7 @@ int main(void) puts("[Failed]\n"); return 1; } - int1 = gpio_read(TEST_LIS3DH_INT1); + int1 = gpio_read(lis3dh_params[0].int1); printf("X: %6d Y: %6d Z: %6d Temp: %6d, INT1: %08x\n", acc_data.acc_x, acc_data.acc_y, acc_data.acc_z, temperature, int1); --fifo_level;