Runing LIS2DH12 on custom hardware

Hi,

Sorry to be posting a lot about my LIS2DH12 on custom hardware lately. I do believe my different inquiries are to be treated as separate.

My (modified) hardware now has these connections:

Sensor

Sensor Connection
SCL P0.05
SDA P0.02
CS VDD (I2C mode)
SDO VDD (addr LSB=1)
INT1 P0.06
INT2 P0.07

I'm trying the LIS2DH sample, only modified it to give terminal output on RTT for debugging. The output I'm seeing is:
SEGGER J-Link V7.96l - Real time terminal output
SEGGER J-Link (unknown) V1.0, SN=682410030
Process: JLink.exe
Device LIS2DH is not ready
[00:00:00.947,387] <err> lis2dh: Failed to read chip id.
*** Booting nRF Connect SDK 3758bcbfa5cd ***

Here is my code:
main.c

/*
 * Copyright (c) 2019 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <inttypes.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(generallogs,LOG_LEVEL_DBG);

static void fetch_and_display(const struct device *sensor)
{
	static unsigned int count;
	struct sensor_value accel[3];
	struct sensor_value temperature;
	const char *overrun = "";
	int rc = sensor_sample_fetch(sensor);

	++count;
	if (rc == -EBADMSG) {
		/* Sample overrun.  Ignore in polled mode. */
		if (IS_ENABLED(CONFIG_LIS2DH_TRIGGER)) {
			overrun = "[OVERRUN] ";
		}
		rc = 0;
	}
	if (rc == 0) {
		rc = sensor_channel_get(sensor,
					SENSOR_CHAN_ACCEL_XYZ,
					accel);
	}
	if (rc < 0) {
		printf("ERROR: Update failed: %d\n", rc);
	} else {
		printf("#%u @ %u ms: %sx %f , y %f , z %f",
		       count, k_uptime_get_32(), overrun,
		       sensor_value_to_double(&accel[0]),
		       sensor_value_to_double(&accel[1]),
		       sensor_value_to_double(&accel[2]));
	}

	if (IS_ENABLED(CONFIG_LIS2DH_MEASURE_TEMPERATURE)) {
		if (rc == 0) {
			rc = sensor_channel_get(sensor, SENSOR_CHAN_DIE_TEMP, &temperature);
			if (rc < 0) {
				printf("\nERROR: Unable to read temperature:%d\n", rc);
			} else {
				printf(", t %f\n", sensor_value_to_double(&temperature));
			}
		}

	} else {
		printf("\n");
	}
}

#ifdef CONFIG_LIS2DH_TRIGGER
static void trigger_handler(const struct device *dev,
			    const struct sensor_trigger *trig)
{
	fetch_and_display(dev);
}
#endif

int main(void)
{
	const struct device *const sensor = DEVICE_DT_GET_ANY(st_lis2dh);

	if (sensor == NULL) {
		printf("No device found\n");
		return 0;
	}
	if (!device_is_ready(sensor)) {
		printf("Device %s is not ready\n", sensor->name);
		return 0;
	}

#if CONFIG_LIS2DH_TRIGGER
	{
		struct sensor_trigger trig;
		int rc;

		trig.type = SENSOR_TRIG_DATA_READY;
		trig.chan = SENSOR_CHAN_ACCEL_XYZ;

		if (IS_ENABLED(CONFIG_LIS2DH_ODR_RUNTIME)) {
			struct sensor_value odr = {
				.val1 = 1,
			};

			rc = sensor_attr_set(sensor, trig.chan,
					     SENSOR_ATTR_SAMPLING_FREQUENCY,
					     &odr);
			if (rc != 0) {
				printf("Failed to set odr: %d\n", rc);
				return 0;
			}
			printf("Sampling at %u Hz\n", odr.val1);
		}

		rc = sensor_trigger_set(sensor, &trig, trigger_handler);
		if (rc != 0) {
			printf("Failed to set trigger: %d\n", rc);
			return 0;
		}

		printf("Waiting for triggers\n");
		while (true) {
			k_sleep(K_MSEC(2000));
		}
	}
#else /* CONFIG_LIS2DH_TRIGGER */
	printf("Polling at 0.5 Hz\n");
	while (true) {
		fetch_and_display(sensor);
		k_sleep(K_MSEC(2000));
	}
#endif /* CONFIG_LIS2DH_TRIGGER */
}

prj.conf

CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_CBPRINTF_FP_SUPPORT=y

CONFIG_LOG=y
CONFIG_LOG_PRINTK=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y

.dts

// Copyright (c) 2024 Nordic Semiconductor ASA
// SPDX-License-Identifier: Apache-2.0

/dts-v1/;
#include <nordic/nrf52810_qfaa.dtsi>
#include "myboard-pinctrl.dtsi"

/ {
	model = "my board";
	compatible = "manuf,myboard";

	chosen {
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
	};


	buttons {
		compatible = "gpio-keys";
		sw0: button_0 {
			label = "button_0";
			gpios = <&gpio0 31 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
		};
	};

	leds {
		compatible = "gpio-leds";
		led_r: led_r {
			label = "Red LED";
			gpios = <&gpio0 29 (GPIO_ACTIVE_LOW | (1 << 8))>;
		};

		led_g: led_g {
			label = "Green LED";
			gpios = <&gpio0 30 (GPIO_ACTIVE_LOW | (1 << 8))>;
		};

		led_b: led_b {
			label = "Blue LED";
			gpios = <&gpio0 28 (GPIO_ACTIVE_LOW | (1 << 8))>;
		};
	};
};

&flash0 {
	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x0 0xc000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0xc000 0xa000>;
		};
		slot1_partition: partition@16000 {
			label = "image-1";
			reg = <0x16000 0xa000>;
		};
		scratch_partition: partition@20000 {
			label = "image-scratch";
			reg = <0x20000 0xa000>;
		};
		storage_partition: partition@2a000 {
			label = "storage";
			reg = <0x2a000 0x6000>;
		};
	};
};


&gpio0 {
	status = "okay";
};

&gpiote {
	status = "okay";
};

&i2c0 {
	status = "okay";
	pinctrl-0 = <&i2c0_default>;
	pinctrl-1 = <&i2c0_sleep>;
	pinctrl-names = "default", "sleep";

	lis2dh@19 {
		compatible = "st,lis2dh";
		reg = <0x19>;
		label = "LIS2DH";
		irq-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>, <&gpio0 7 GPIO_ACTIVE_LOW>;
	};
};

/*&spi0 {
	cs-gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
	status = "okay";
	max-frequency = <DT_FREQ_M(8)>;
	pinctrl-0 = <&spi0_default>;
	pinctrl-names = "default";

	lis2dh_spi@0 {
		compatible = "st,lis2dh";
		reg = <0>;
		supply-gpios = <&gpio0 8 0>;
		spi-max-frequency = <DT_FREQ_M(8)>;
		irq-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>, <&gpio0 7 GPIO_ACTIVE_LOW>;
	};
};*/

&adc {
	status = "okay";
};

&pinctrl {
	i2c0_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 2)>, 
					<NRF_PSEL(TWIM_SCL, 0, 5)>;
		};
	};

	i2c0_sleep {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 2)>, 
					<NRF_PSEL(TWIM_SCL, 0, 5)>;
		};
	};
};

pinctrl.dtsi

 &pinctrl {
    i2c0_default: i2c0_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 2)>,
				<NRF_PSEL(TWIM_SCL, 0, 5)>;
		};
	};

	i2c0_sleep: i2c0_sleep {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 2)>,
				<NRF_PSEL(TWIM_SCL, 0, 5)>;
			low-power-enable;
		};
	};

    pwm0_default: pwm0_default {
        group1 {
            psels = <NRF_PSEL(PWM_OUT0, 0, 29)>;
            nordic,invert;
        };
    };
    
    pwm0_sleep: pwm0_sleep {
        group1 {
            psels = <NRF_PSEL(PWM_OUT0, 0, 29)>;
            low-power-enable;
        };
    };

 };


Parents
  • Hello,

    The error shoes that application can not connect to the sensor. There could be several reasons for that. Have you checked that pins are not overlapping with other peripherals?

    In our default board (nRF52dk_nrf52810) Pin 0.05 is for RTS and pin P0.06 is for TX.

    You have several tickets for same problem. It is convenient and easy to follow if you stick on one ticket.

  • Hi Kazi,
    Thank you for replying. 

    On my custom hardware there is only this sensor, one button (P0.31) and RGB LED (P0.28-30) connected to GPIO pins. Other than that of course decoupling, power supply, antenna, crystals etc.

    Very sorry for all the threads. I initially thought my problems were related to different things but wound up preceeding on the development while still having open tickets. My past two threads are somewhat related so I hope to keep them open until I have this problem figured out.

Reply
  • Hi Kazi,
    Thank you for replying. 

    On my custom hardware there is only this sensor, one button (P0.31) and RGB LED (P0.28-30) connected to GPIO pins. Other than that of course decoupling, power supply, antenna, crystals etc.

    Very sorry for all the threads. I initially thought my problems were related to different things but wound up preceeding on the development while still having open tickets. My past two threads are somewhat related so I hope to keep them open until I have this problem figured out.

Children
No Data
Related