Custom 52832 board, NRF Connect 2.4.0 - TWIM doesn't work (TWI - does)

Hello,

I am trying to access I2C device - onboard Holyiot 21061 board. When setting in DT the compatibility to "nordic,nrf-twim" - I2C isn't able to communicate with a device. I do not have an analyser, but all APIs return -EIO.
In the output of I2C shell "i2c scan" command - no devices are found. But when I change the compatibility to "nordic, nr-twi" (w/o trailing "m") - everything works OK. 

/dts-v1/;
#include <nordic/nrf52832_qfaa.dtsi>
#include "holyiot_21061-pinctrl.dtsi"

/ {
	model = "Holyiot 21061";
	compatible = "holyiot,21061";

	chosen {
		zephyr,console = &uart0;
		zephyr,shell-uart = &uart0;
		zephyr,uart-mcumgr = &uart0;
		zephyr,bt-mon-uart = &uart0;
		zephyr,bt-c2h-uart = &uart0;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;	
	};

	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
			label = "LED0";
		};
		led1: led_1 {
			gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
			label = "LED1";
		};	
		led2: led_2 {
			gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
			label = "LED2";
		};	
	};

	/* These aliases are provided for compatibility with samples */
	aliases {
		ledr = &led0;
		ledg = &led1;
		ledb = &led2;
		watchdog0 = &wdt0;
	};
};

&gpio0 {
	status = "okay";

	pin_as_output_low {
		gpio-hog;
		gpios = <30 GPIO_ACTIVE_HIGH>, <1 GPIO_ACTIVE_HIGH>, <27 GPIO_ACTIVE_HIGH>; // VDD_EN
		output-low; /* or output-low */
		line-name = "pin_as_output_low";
	};

	pin_as_output_high {
		gpio-hog;
		gpios = <5 GPIO_ACTIVE_HIGH>; // Ad0 & CS
		output-high; /* or output-low */
		line-name = "pin_as_output_high";
	};

};

&gpiote {
	status = "okay";
};


&flash0 {

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

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0xc000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0x0000C000 0x37000>;
		};
		slot1_partition: partition@43000 {
			label = "image-1";
			reg = <0x00043000 0x37000>;
		};
		storage_partition: partition@7a000 {
			label = "storage";
			reg = <0x0007a000 0x00006000>;
		};
	};
};

i2c0: &i2c0 { 
	status = "okay";
	compatible = "nordic,nrf-twi";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c0_default>;
	pinctrl-1 = <&i2c0_sleep>;
	label = "I2C_0";

};

i2c1: &i2c1 { 
	status = "okay";
	compatible = "nordic,nrf-twi";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_default>;
	pinctrl-1 = <&i2c1_sleep>;
	label = "I2C_1";

};

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

	i2c0_sleep: i2c0_sleep {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 3)>,
				<NRF_PSEL(TWIM_SCL, 0, 4)>;
			low-power-enable;
		};
	};
	i2c1_default: i2c1_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 26)>,
				<NRF_PSEL(TWIM_SCL, 0, 25)>;
		};
	};

	i2c1_sleep: i2c1_sleep {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 26)>,
				<NRF_PSEL(TWIM_SCL, 0, 25)>;
			low-power-enable;
		};
	};
};

CONFIG_GPIO=y
CONFIG_GPIO_HOGS=y

CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_RTT=y

# choose RTT console
CONFIG_USE_SEGGER_RTT=y
CONFIG_CONSOLE=y
CONFIG_RTT_CONSOLE=y

# General config
CONFIG_LOG=y
CONFIG_LOG_PRINTK=y

CONFIG_I2C=y
CONFIG_NRFX_GPIOTE=y
CONFIG_I2C_NRFX=y

Please advise (main() function is just an endless loop of k_msleep(1000))

Parents
  • Hi,

    Do you see the same issue if you add the devicetree changes to an overlay for a different board (e.g. nrf52dk_nrf52832 target)?

    Can you post your exact sample with the custom board files, along with screenshots of the steps used to reproduce the issue? I tried to add similar overlay to the nRF52 DK, but I'm not able to reproduce the issue you are describing:

    Best regards,
    Jørgen

  • Yes, it reproduces on at least one different (also custom) board.

    But I did some mixing and matching and found that channel one, where both SCL and SDA lines are pulled up via 10 k resistors - works in both modes, and channel zero w/o external pull-ups - doesn't. Could it be the cause - say, TWI engages an internal pull-ups and TWIM has to be "told" to? 

    In your tests - were the lines pulled up?


    Thanks,

Reply
  • Yes, it reproduces on at least one different (also custom) board.

    But I did some mixing and matching and found that channel one, where both SCL and SDA lines are pulled up via 10 k resistors - works in both modes, and channel zero w/o external pull-ups - doesn't. Could it be the cause - say, TWI engages an internal pull-ups and TWIM has to be "told" to? 

    In your tests - were the lines pulled up?


    Thanks,

Children
No Data
Related