I2C example for nrf52 DK board

I have a nRF52 DK board and all is working fine. I can load the UART peripheral example and talk to my iPhone. I want to add I2C capability to connect to a temperature/Humidity sensor. I tried to run the i2c_api application and I get an error when it tries to build. It tells me to set the correct I2C device. How do I set the correct I2C device and how to I see the SCL and SDA I2C control pins on the external connector. Should they be on P0.26 and P0.27 pins. I was trying to get the i2c_api example working so I could understand how to use the I2c functions. I am very familiar with the I2C protocol. If you can tell me how to select the I2C device, initialize it, and do reads and writes so that SDA/SCL is active on the external connector pins I would be very appreciative. Thanks for you help. I am sure it is operator and error on my part. I am new to the nRF52 DK board.

#if DT_NODE_HAS_STATUS(DT_ALIAS(i2c_0), okay)
#define I2C_DEV_NODE    DT_ALIAS(i2c_0)
#elif DT_NODE_HAS_STATUS(DT_ALIAS(i2c_1), okay)
#define I2C_DEV_NODE    DT_ALIAS(i2c_1)
#elif DT_NODE_HAS_STATUS(DT_ALIAS(i2c_2), okay)
#define I2C_DEV_NODE    DT_ALIAS(i2c_2)
#else
#error "Please set the correct I2C device"
#endif
  • Hi,

    Can you provide your devicetree overlay? Just in general the troubleshooting devicetree section here is a good read. It also covers your question regarding underscore 

    "

    • In C/C++, devicetree names must be lowercased and special characters must be converted to underscores. Zephyr’s generated devicetree header has DTS names converted in this way into the C tokens used by the preprocessor-based <devicetree.h> API.

    • In overlays, use devicetree node and property names the same way they would appear in any DTS file. Zephyr overlays are just DTS fragments.

    A former support member made this example a while back, an simple I2C scanner, I would have a look at it just to compare the overlays. 

    Regards

    Runar

  • if I compile i2c_api application with overlay as follows

    / {
    aliases {
    i2c-0 = &i2c0;
    };
    };

    I can build and run but I get the following errors. I2C does not work. This is the provided standard test in V2.5.0/zephyr/tests/devices. can someone tell me what I have to do to get it running on the nrf52 DK board. the errors are the following:

    *** Booting nRF Connect SDK v2.5.0 ***
    Running TESTSUITE i2c_gy271
    ===================================================================
    START - test_i2c_burst_gy271
    I2C get_config failed

    Assertion failed at ../src/test_i2c.c:159: i2c_gy271_test_i2c_burst_gy271: test_burst_gy271() == TC_PASS is false

    FAIL - test_i2c_burst_gy271 in 0.013 seconds
    ===================================================================
    START - test_i2c_gy271
    I2C get_config failed

    Assertion failed at ../src/test_i2c.c:154: i2c_gy271_test_i2c_gy271: test_gy271() == TC_PASS is false

    FAIL - test_i2c_gy271 in 0.012 seconds
    ===================================================================
    TESTSUITE i2c_gy271 failed.

    ------ TESTSUITE SUMMARY START ------

    SUITE FAIL - 0.00% [i2c_gy271]: pass = 0, fail = 2, skip = 0, total = 2 duration = 0.025 seconds
    - FAIL - [i2c_gy271.test_i2c_burst_gy271] duration = 0.013 seconds
    - FAIL - [i2c_gy271.test_i2c_gy271] duration = 0.012 seconds

    ------ TESTSUITE SUMMARY END ------

    ===================================================================
    PROJECT EXECUTION FAILED

  • Hi Tim,

    Do you have pullup resistors on the device you have connected to the bus? The hardware manual for the DK board shows that pullup resistors on the DK board are only switched into the circuit when an Arduino shield is plugged in: When a shield is connected, there are two analog switches connecting the pull-up resistors to the I2C bus lines (SDA and SCL). This function is using one ground pin on the Arduino shield to control the switch.

    I don't think you have explained enough details above. You are not testing with a gy271 device; correct? You told me offline something about testing with no device on the bus, but I am afraid of misquoting you. I originally thought you were modifying the code for a different device, but now I'm not sure and I assume that DevZone is in the same boat I am in. Spell out the details is my suggestion. And see if I am correct about my concern about pullup resistors not being switched in.

    Burt

  • I'm not familiar with Ztest, so I will need to look into it. However where have you defined gy271 if that is your overlay, nor can I see that that the overlay is enabled. 

    Regards

    Runar

  • Runar: there are no overlays by default in the I2c_api test directory. I created and overlay file and added the i2c-0 alias as you suggested above.

Related