nRF54L15-DK I2C voltage issues with sensors failing to be detected as "ready" unless voltage reduced to below 3.3V

Hello,

As part of an effort to migrate applications to nRF5415 devices, I've encountered voltage sensitivity issues when using existing sensors (bme688, bme280). After reviewing and trying out various overlay & pinctrl settings for a few days and cross-referencing them against the nRF5L15-DK pin assignments , I was at a loss as to why the sensors were not being recognized. 

I decided to vary the nRF54L15DK VDD using the Nordic Board Configurator (v1.1.3). As soon as the VDD was dropped below 3.3V to 2.5V and then 1.8V, the BME sensors got detected as "Ready" and they worked flawlessly. The SSD1306 OLED displays that are being used with the nRF54L15DK worked without any issues in the range 1.8V - 3.3V.

I suspect the issue may be to do with I2c sensor driver or perhaps the way nRF54L15DK works with I2C that causes these sensors not to be detected.  

The BME280 and BME688 sensors (Pimoroni) are rated at 2V-5V range. They have been working without any issues at 1.8v - 3.3V on several existing devices (nRF52840, nRF5340, Raspberry Pi Pico, and ESP32). 

In the tests conducted with nRF54L15-DK, the BME280 and BME688 sensors failed to be detected in "ready" state unless the voltage was reduced below 3.3V. For BME280, the working range was found to be in the range 1.8V- 2.7V , and 1.8-V-2.4V for BME688. The sensors were configured to use the internal pull-ups. 

The Board Configurator was used to vary the voltage range. The TWIM_SDA, TWIM_SCL and VDD on the nRF54L15-DK  were verified for the voltage range using a multimeter. Unfortunately, as I currently don't have an oscilloscope, I wasn't able to look at I2C signal timings, etc.

Below are the configuration and overlay used with the nRF54L15-DK.

I've used quite a few I2C sensors on multiple platforms but haven't encountered such behaviour before.


Do you have any suggestions as to why the peculiar voltage behaviour of the nRF54L15DK with these sensors? Thank you.


Environment:

  • nRF54L15DK with nRF Connect SDK 3.2.1 on macOS 15.7.3 and latest VS Code / nRF Connect

Devices used

  • nRF54L15-DK, Particle_Xenon (nRF52840), and Thingy53

nRF and Zephyr samples

  • Verified sensor I2C detection on nRF54L15-DK with samples bme68x_iaq and bme280 

Sensors

  • BME688 (Pimoroni, rated at 2-5V)
  • BME280 (Pimoroni, rated at 2-5V)

I2C overlay

  • Used i2c22 
  • Also tested with i2c21  (pinctrl TWIM_SDA  1,12 and TWIM_SCL 1,11)

&i2c22 {
    /delete-property/ status;compatible = "nordic,nrf-twim";
    compatible = "nordic,nrf-twim","i2c-device";
    status = "okay";
    clock-frequency = <I2C_BITRATE_FAST>;
    zephyr,concat-buf-size = <4096>;
    pinctrl-0 = <&i2c22_default>;
    pinctrl-1 = <&i2c22_sleep>;
    pinctrl-names = "default", "sleep";
    
    bme688: bme688@76 {
        compatible = "bosch,bme680";
        reg = <0x76>;
    };
};

&pinctrl {
    i2c22_default: i2c22_default {
        group1 {
            psels = <NRF_PSEL(TWIM_SDA, 1, 12)>,
                    <NRF_PSEL(TWIM_SCL, 1, 11)>;
                    nordic,drive-mode = <NRF_DRIVE_H0H1>;
                    bias-pull-up;         
        };
    };

    i2c22_sleep: i2c22_sleep {
        group1 {
            psels = <NRF_PSEL(TWIM_SDA, 1, 12)>,
                    <NRF_PSEL(TWIM_SCL, 1, 11)>;
                    low-power-enable;
        };
    };
};

prj.conf

CONFIG_SENSOR=y
CONFIG_SENSOR_INFO=y

CONFIG_BME680=n
CONFIG_BME68X_IAQ=y

#I2C configuration
CONFIG_I2C=y
CONFIG_I2C_SHELL=y
CONFIG_I2C_LOG_LEVEL_DBG=y

CONFIG_APP_TRIGGER=n


nRF54L15-DK and SSD1306 OLED setup with a Sparkfun QWICC multiplexer.

Results

  • nRF52840 and Thingy53
    • No issues
    • Both BM688 and BME280 worked, as expected, with device and sensor voltages at 3.3V.

  • nRF54L15-DK
    • Sensors BME280 and BME688 were not detected on the I2C at VDD 3.3V. “Device not ready” message observed.
    • However, SSD1306 was detected correctly at 3.3V
    • Using the Board Configurator v1.1.3, tried several setting between 1.8V to 3.3.V

    • BME280 sensor was detected and output sensor values correctly for voltage range 1.8V - 2.7V. Failed to be detected on I2C above 2.7V.
    • BME688 sensor was detected successfully on the I2C bus for voltage range 1.8V - 2.4V. It failed I2C detection above 2.4V

BME688 console output - VDD set to 2.4V

*** Booting nRF Connect SDK v3.2.1-d8887f6f32df ***
*** Using Zephyr OS v4.2.99-ec78104f1569 ***
[00:00:00.018,858] <inf> app: App started
uart:~$ 
[00:00:05.018,951] <inf> app: temp: 25.80; press: 100549.60; humidity: 27.91; iaq: 50; CO2: 500.00; VOC: 0.49
uart:~$  device list
devices:
- clock@10e000 (READY)
  DT node labels: clock
- gpio@10a000 (READY)
  DT node labels: gpio0
- gpio@d8200 (READY)
  DT node labels: gpio1
- gpio@50400 (READY)
  DT node labels: gpio2
- uart@c6000 (READY)
  DT node labels: uart20
- rram-controller@5004b000 (READY)
  DT node labels: rram_controller
- i2c@c8000 (READY)
  DT node labels: i2c22
- spi@4a000 (READY)
  DT node labels: spi00
- mx25r6435f@0 (READY)
  DT node labels: mx25r64
- temp@d7000 (READY)
  DT node labels: temp
- bme688@76 (READY)
  DT node labels: bme688
[00:00:15.019,052] <inf> app: temp: 24.27; press: 100546.75; humidity: 29.87; iaq: 50; CO2: 500.00; VOC: 0.49
uart:~$ 

i2c scan i2c22: BME688 detected at address 0x76

uart:~$ i2c scan i2c22
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:             -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --                         
1 devices found on i2c22

BME688 console output - VDD set to 3.3V

[00:00:00.016,272] <err> bsec: Failed to init bme68x: -2
*** Booting nRF Connect SDK v3.2.1-d8887f6f32df ***
*** Using Zephyr OS v4.2.99-ec78104f1569 ***
[00:00:00.016,499] <inf> app: App started
uart:~$ 

i2c scan i2c22: Failed to detect BME688 on the I2C bus

uart:~$ i2c scan i2c22
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:             -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
0 devices found on i2c22
[00:00:05.016,590] <err> app: device is not ready
uart:~$ 
uart:~$ i2c scan i2c22
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:             -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
0 devices found on i2c22

  • Hi,

     

    Here's a quick setup, with i2c shell, with nRF54L15-dk connected to the SDA/SCL of a thingy53 (3.3V):

    uart:~$ i2c scan i2c@c8000
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:             -- -- -- -- -- -- -- -- -- -- -- -- 
    10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    70: -- -- -- -- -- -- 76 --                         
    3 devices found on i2c@c8000

    It was not a problem to detect the address of the bme-sensor.

    zpm1066 said:
    A scope access is unlikely for a while.

    I would strongly recommend that you obtain these tools for development, such as logic analyzer and/or oscilloscope.

     

    Kind regards,

    Håkon

  • Hi  

    Thanks. What VDD voltage setting do you have for the nRF54L15-DK when using the Board Configurator?

    I tried taking the 3.3V from the Thingy53's Qwicc connector with common ground to nRF54L15-DK and used the Board Configurator to set VDD to 3.3V on the nRF54L15. 10kOhm pull-ups used and "bias-disable" set in the pinctrl of the nrf54l15dk_nrf54l15_cpuapp_ns.overlay. The BME688 still failed unless VDD was reduced to 2.4V.

  • My setup is direct connection so only one Power rail. Håkon used the Thingy:53. Key thing is bypass the level shifters and have same VDD on the SoC and the sensor. This does work so if it fails on your side it is a connection issue so check that you have the external pull-ups and no additional load on the lines. And not too long lines on the I2C as that increases the capacitive load.

    An oscilloscope is the tool to debug this.

  • Thanks. Agree regarding the need to debug the issue with a oscilloscope. Unfortunately, I don't have access to store one yet.

    I've been using the VDDIO on the nRF54L15. with 0K external pull-ups. Also, tried using the Thingy53's 3.3V from the Quick connector. 

    The nRF54L155-DK does seem to be more sensitive than the other devices. I've had no issues at all when using the BME688/BME280 with  nRF5340-DK, nRF9151-DK, various nRF52840 boards or the ESP32/Raspberry Picos.

  • HI Håkon,

    How did you connect the Thingy53 to the nRF54L15-DK? I used the  3.3V from the Qwicc connector with 10KOhm external pull-ups.

    What VDD voltage setting did you have for the nRF54L15-DK when using the Board Configurator? Thanks.


    Best Regards,
    Ravi

Related