Power I2C Device through GPIO

Hi, 

I have builded a circuit with a nRF52DK and a mpu9250 IMU. If I power the Sensor with VDD the Zephyr driver and all of the Software performs well and the values from the IMU are displayed correctly in my console. 
Now I have Problems with powering the mpu sensor through the nRF's GPIOs. My first attempt is to set the GPIO_0 to HIGH and bind the mpu with a little delay. I think i had tenable and disable some driver for the TWI bus, but until now I have not found the right way. Maybe you can give me some advise. 
nrf Connect SDK 1.9.1 - VSCode 

	const struct device *gpio_dev1;
	gpio_dev1 = device_get_binding("GPIO_0");

	if (!gpio_dev1) {
		printk("Cannot find %s!\n", "GPIO_0");
		return;
	}

	ret = gpio_pin_configure(gpio_dev1, VDD_PIN1, GPIO_OUTPUT_ACTIVE);	
	if (ret < 0) {
		return;
	}

	gpio_pin_set(gpio_dev1, VDD_PIN1, 1);
	NRFX_DELAY_US(MEASURE_INTERVAL*1000); // 2 Seconds

	const char *const label = DT_LABEL(DT_INST(0, DEVICE_NAME_IMU)); //DEVICE_NAME_IMU = invensense_mpu9250
	const struct device *mpu9250 = device_get_binding(label);
	if (!mpu9250) {
		printf("Failed to find sensor %s\n", label);
		//return;
	}else{
		printk("Sensor connected: %s\n", label);
	}

Console Output: 

[00:00:02.048,858] <inf> sdc_hci_driver: SoftDevice Controller build revision: 
                                         0e e7 c5 66 67 18 3c ac  b3 d2 cc 81 a3 dc f1 c0 |...fg.<. ........
                                         c0 36 02 22                                      |.6."             
[00:00:02.051,208] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
[00:00:02.051,208] <inf> bt_hci_core: HW Variant: nRF52x (0x0002)
[00:00:02.051,208] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 14.50663 Build 1008232294
[00:00:02.052,124] <inf> bt_hci_core: Identity: EF:F0:9B:1E:C2:0B (random)
[00:00:02.052,154] <inf> bt_hci_core: HCI: version 5.2 (0x0b) revision 0x12fe, manufacturer 0x0059
[00:00:02.052,154] <inf> bt_hci_core: LMP: version 5.2 (0x0b) subver 0x12fe
[00:00:02.092,163] <err> i2c_nrfx_twi: Error 0x0BAE0001 occurred for message 0
[00:00:02.092,163] <err> MPU9250: Failed to read data sample.
[0:00:04.102]:2942.578125 mV
[0:00:04.117]:23.3 Cel
[0:00:04.131]:1003 hPa
sample fetch/get failed: -5
[0:00:04.136]:0 minutes
----------------------------------

(P.S.: After powering up the MPU with VDD and then switch the power source of the MPU&I2C Bus to the GPIO it works correctly - so it should not be to less power)

Parents
  • Hello

    The behavior you're seeing is likely the GPIO struggling to supply the initial power spike required when the sensor is turned on. The GPIO should be able to power the sensor during normal operation, but the current required at boot could be problematic. It might help to configure the GPIO pin as GPIO_OPEN_SOURCE, maybe.

    Can you elaborate on the issue you have with the TWI bus?

    Best regards,

    Einar

  • Hi Einar, 
    yes my problem is/ was utilizing the drivers. I have it working now using:

    vin-supply = < &imu-power-ctrl>;
    or 
    supply-gpios = < &gpio0 20 GPIO_ACTIVE_HIGH >;
    Is there a good Tutorial on how to write a propper devicetree implementation? 
    and is it possible in the devicetree setting a delay between powering the sensor and read the sensor via i2c?
    Best regards, Jonas 

  • Many Viewer on this Ticket, so this is my solution: 

    Enable regulator in prj.conf 

    CONFIG_REGULATOR=y


    edits in Devicetree:
     
    	imu_pwr: imu-pwr-ctrl {
    			compatible = "regulator-fixed";
    			label = "imu-pwr-ctrl";
    			regulator-name = "imu-pwr-ctrl";
    			enable-gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
    			regulator-boot-on;
    		};
    vin-supply in Devicetree:
    lsm6dso@6a {
                compatible = "st,lsm6dso";
                reg = <0x6a >;
                label = "LSM6DSO";
    			vin-supply = < &imu_pwr >;
            };    


    with this edits, the devices are being powered and successfully initialized during the boot process. 
Reply
  • Many Viewer on this Ticket, so this is my solution: 

    Enable regulator in prj.conf 

    CONFIG_REGULATOR=y


    edits in Devicetree:
     
    	imu_pwr: imu-pwr-ctrl {
    			compatible = "regulator-fixed";
    			label = "imu-pwr-ctrl";
    			regulator-name = "imu-pwr-ctrl";
    			enable-gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
    			regulator-boot-on;
    		};
    vin-supply in Devicetree:
    lsm6dso@6a {
                compatible = "st,lsm6dso";
                reg = <0x6a >;
                label = "LSM6DSO";
    			vin-supply = < &imu_pwr >;
            };    


    with this edits, the devices are being powered and successfully initialized during the boot process. 
Children
No Data
Related