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;
        };
    };

 };


Related