I'm using <TWI Scanner> example on nRF52 DK to find my sensor's address.
According to the sensor datasheet, the sensor's address is 0x21. However, <TWI Scanner> finds the address at 0x20.
Any idea, please?
I'm using <TWI Scanner> example on nRF52 DK to find my sensor's address.
According to the sensor datasheet, the sensor's address is 0x21. However, <TWI Scanner> finds the address at 0x20.
Any idea, please?
for (address = 32; address < 34; address++) { NRF_LOG_INFO("Hi %d",address); err_code = nrf_drv_twi_rx(&m_twi, address, &sample_data, sizeof(sample_data)); if (err_code == NRF_SUCCESS) { detected_device = true; NRF_LOG_INFO("TWI device detected at address 0x%x.", address); } NRF_LOG_FLUSH(); }
From the code and graph, you could see that ACK is LOW for address 32 (find the device at 0x20), ACK is HIGH for address 33 (no device at 0x21).
However, my sensor datasheet says that if I connect the sensors' ADDR pin to GND, the address should be 0x21. Very strange issue!
Any one help pls?
Update.
Since my sensor's datasheet page 4 section 3.3 says that if I use a 1.2k resistor, the I2C address will change to 0x22.
Then I tried a 1.4k resistor, but the address is still 0x20.
So I suspect it's the software issue. My full code is here.
Thanks
/** * Copyright (c) 2016 - 2020, Nordic Semiconductor ASA * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** @file * @defgroup tw_scanner main.c * @{ * @ingroup nrf_twi_example * @brief TWI Sensor Example main file. * * This file contains the source code for a sample application using TWI. * */ #include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" /* TWI instance ID. */ #if TWI0_ENABLED #define TWI_INSTANCE_ID 0 #elif TWI1_ENABLED #define TWI_INSTANCE_ID 1 #endif /* Number of possible TWI addresses. */ #define TWI_ADDRESSES 127 /* TWI instance. */ static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); /** * @brief TWI initialization. */ void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = NRF_DRV_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_HIGH, .clear_bus_init = false }; err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&m_twi); } /** * @brief Function for main application entry. */ int main(void) { ret_code_t err_code; uint8_t address; uint8_t sample_data; bool detected_device = false; APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO("TWI scanner started."); NRF_LOG_FLUSH(); twi_init(); for (address = 1; address <= TWI_ADDRESSES; address++) { // NRF_LOG_INFO("Hi %d",address); err_code = nrf_drv_twi_rx(&m_twi, address, &sample_data, sizeof(sample_data)); if (err_code == NRF_SUCCESS) { detected_device = true; NRF_LOG_INFO("TWI device detected at address 0x%x.", address); } NRF_LOG_FLUSH(); } if (!detected_device) { NRF_LOG_INFO("No device was found."); NRF_LOG_FLUSH(); } while (true) { /* Empty loop. */ } } /** @} */
Hi,
Decoding this by hand I see that the first 8 bits are 01000001. The last (LSB) is '1' indicating read, and the rest of th 7 bits are 0100000 = 0x20, as you write. I agree that it does not match with the sensor datasheet, but what you get in your code is correct with regard to what we see from the plots. So 0x20 is definitely correct here.
I suggest you contact the sensor manufacturer if you need to dig deeper into this, as it is difficult for anyone else to know why the sensor answer to another address than what is documented. Could it for instance be that a different revision of the sensor which uses a different address?
Today, I tried to use Arduino UNO to connect with my sensor via I2C. Arduino UNO correctly shows that my address is 0x21. If I change the resistor value at ADDR, the address will be changed to 0x21 or 0x22 or 0x23 successfully (see datasheet page 4, section 3.3).
However, Nordic nRF52 DK (nRF52832) shows my address is still 0x20 no matter which resistor value I use at the ADDR port.
So I guess it's something wrong in code or nRF52 DK.
Hi,
This is puzzling... Can you upload a corresponding plot from when using the Android device so that I can compare with the nRF5 device? Also, if you can upload the full code for Android as well that would be good. Are you using the same configuration in other regards, same frequency?