i2c_burst_read(0x0) failed, ret=-5 on ncs v2.4.2

I use nRF52832 device to test I2C reading/writing registers. But it failed with error code -5. What is meaning of error code -5 and how to fix this issue?

00> *** Booting Zephyr OS build v3.3.99-ncs1-1 ***
00> Starting button Test example
00> device_is_ready() ok
00> nrfx_gpiote_input_configure() okay for button
00> val=1
00> button released
00> start a timer
00> now-1-11-30 0:0:0
00> 0
00> ledDriverInit
00> tca6424aReadReg(regAddr=0x0)
00> LP5861_REG_ADDR_HIGH(regAddr)=0x0, LP5861_REG_ADDR_LOW(regAddr)=0x0
00> devAddr=0x81, startAddr=0x0
00> [00:00:00.501,129] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
00> i2c_burst_read(0x0) failed, ret=-5
00> _buttonTimerHandler: 3000
00> now-1-11-30 0:0:0
00> button released

Procedures to reproduce this issue are as follows.

1. Unzipping custom_nrf52832.zip to C:\ncs\v2.4.2\nrf\boards folder.

2. Unzipping minimal_log_led.zip to C:\ncs\v2.4.2\nrf\samples folder.

3. cd C:\ncs\v2.4.2\nrf\samples\minimal_log_led

4. west build -b custom_nrf52832

5. west flash

6. Rebooting nRF52832 device and connecting to RTT Viewer.

Parents
  • /*
     * Copyright (c) 2018 Nordic Semiconductor
     *
     * SPDX-License-Identifier: Apache-2.0
     */
     
    #if CONFIG_BOARD_CUSTOM_NRF52832 || CONFIG_BOARD_CUSTOM_NRF5340_CPUAPP || CONFIG_BOARD_NRF5340DK_NRF5340_CPUAPP
    
    #include <zephyr/drivers/gpio/gpio_utils.h>
    #include <zephyr/drivers/gpio.h>
    #include <zephyr/drivers/i2c.h>
    #include <zephyr/logging/log.h>
    #include <zephyr/sys/byteorder.h>
    #include <zephyr/sys/util.h>
    #include "error.h"
    
    #define LP5861_CHIP_ADDRESS_INDEPENDENT 0x10//0x80
    #define LP5861_CHIP_ADDRESS_BROADCAST   0xA8
    #define LP5861_CHIP_ADDRESS             LP5861_CHIP_ADDRESS_INDEPENDENT
    #define LP5861_REG_ADDR_CHIP_EN       0x0000
    #define LP5861_REG_ADDR_DEV_INITIAL   0x0001
    #define LP5861_REG_ADDR_DEV_CONFIG1   0x0002
    #define LP5861_REG_ADDR_DEV_CONFIG2   0x0003
    #define LP5861_REG_ADDR_DEV_CONFIG3   0x0004
    #define LP5861_REG_ADDR_GLOBAL_BRI    0x0005
    #define LP5861_REG_ADDR_GROUP0_BRI    0x0006
    #define LP5861_REG_ADDR_GROUP1_BRI    0x0007
    #define LP5861_REG_ADDR_GROUP2_BRI    0x0008
    #define LP5861_REG_ADDR_R_CURRENT_SET 0x0009
    #define LP5861_REG_ADDR_G_CURRENT_SET 0x000A
    #define LP5861_REG_ADDR_B_CURRENT_SET 0x000B
    #define LP5861_REG_ADDR_DOT_GRP_SEL0  0x000C
    #define LP5861_REG_ADDR_DOT_GRP_SEL1  0x000D
    #define LP5861_REG_ADDR_DOT_GRP_SEL2  0x000E
    #define LP5861_REG_ADDR_DOT_GRP_SEL3  0x000F
    #define LP5861_REG_ADDR_DOT_GRP_SEL4  0x0010
    #define LP5861_REG_ADDR_DOT_ONOFF0    0x0043
    #define LP5861_REG_ADDR_DOT_ONOFF1    0x0044
    #define LP5861_REG_ADDR_DOT_ONOFF2    0x0045
    #define LP5861_REG_ADDR_FAULT_STATE   0x0064
    #define LP5861_REG_ADDR_DOT_LOD0      0x0065
    #define LP5861_REG_ADDR_DOT_LOD1      0x0066
    #define LP5861_REG_ADDR_DOT_LOD2      0x0067
    #define LP5861_REG_ADDR_DOT_LSD0      0x0086
    #define LP5861_REG_ADDR_DOT_LSD1      0x0087
    #define LP5861_REG_ADDR_DOT_LSD2      0x0088
    #define LP5861_REG_ADDR_LOD_CLEAR     0x00A7
    #define LP5861_REG_ADDR_LSD_CLEAR     0x00A8
    #define LP5861_REG_ADDR_LSD_RESET     0x00A9
    #define LP5861_REG_ADDR_DC0           0x0100
    #define LP5861_REG_ADDR_DC1           0x0101
    #define LP5861_REG_ADDR_DC2           0x0102
    #define LP5861_REG_ADDR_DC3           0x0103
    #define LP5861_REG_ADDR_DC4           0x0104
    #define LP5861_REG_ADDR_DC5           0x0105
    #define LP5861_REG_ADDR_DC6           0x0106
    #define LP5861_REG_ADDR_DC7           0x0107
    #define LP5861_REG_ADDR_DC8           0x0108
    #define LP5861_REG_ADDR_DC9           0x0109
    #define LP5861_REG_ADDR_DC10          0x010A
    #define LP5861_REG_ADDR_DC11          0x010B
    #define LP5861_REG_ADDR_DC12          0x010C
    #define LP5861_REG_ADDR_DC13          0x010D
    #define LP5861_REG_ADDR_DC14          0x010E
    #define LP5861_REG_ADDR_DC15          0x010F
    #define LP5861_REG_ADDR_DC16          0x0110
    #define LP5861_REG_ADDR_DC17          0x0111
    #define LP5861_REG_ADDR_PWM_BRI0      0x0200
    #define LP5861_REG_ADDR_PWM_BRI1      0x0201
    #define LP5861_REG_ADDR_PWM_BRI2      0x0202
    #define LP5861_REG_ADDR_PWM_BRI3      0x0203
    #define LP5861_REG_ADDR_PWM_BRI4      0x0204
    #define LP5861_REG_ADDR_PWM_BRI5      0x0205
    #define LP5861_REG_ADDR_PWM_BRI6      0x0206
    #define LP5861_REG_ADDR_PWM_BRI7      0x0207
    #define LP5861_REG_ADDR_PWM_BRI8      0x0208
    #define LP5861_REG_ADDR_PWM_BRI9      0x0209
    #define LP5861_REG_ADDR_PWM_BRI10     0x020A
    #define LP5861_REG_ADDR_PWM_BRI11     0x020B
    #define LP5861_REG_ADDR_PWM_BRI12     0x020C
    #define LP5861_REG_ADDR_PWM_BRI13     0x020D
    #define LP5861_REG_ADDR_PWM_BRI14     0x020E
    #define LP5861_REG_ADDR_PWM_BRI15     0x020F
    #define LP5861_REG_ADDR_PWM_BRI16     0x0210
    #define LP5861_REG_ADDR_PWM_BRI17     0x0211
    #define LP5861_REG_ADDR_PWM_BRI18     0x0212
    #define LP5861_REG_ADDR_PWM_BRI19     0x0213
    #define LP5861_REG_ADDR_PWM_BRI20     0x0214
    #define LP5861_REG_ADDR_PWM_BRI21     0x0215
    #define LP5861_REG_ADDR_PWM_BRI22     0x0216
    #define LP5861_REG_ADDR_PWM_BRI23     0x0217
    #define LP5861_REG_ADDR_PWM_BRI24     0x0218
    #define LP5861_REG_ADDR_PWM_BRI25     0x0219
    #define LP5861_REG_ADDR_PWM_BRI26     0x021A
    #define LP5861_REG_ADDR_PWM_BRI27     0x021B
    #define LP5861_REG_ADDR_PWM_BRI28     0x021C
    #define LP5861_REG_ADDR_PWM_BRI29     0x021D
    #define LP5861_REG_ADDR_PWM_BRI30     0x021E
    #define LP5861_REG_ADDR_PWM_BRI31     0x021F
    #define LP5861_REG_ADDR_PWM_BRI32     0x0220
    #define LP5861_REG_ADDR_PWM_BRI33     0x0221
    #define LP5861_REG_ADDR_PWM_BRI34     0x0222
    #define LP5861_REG_ADDR_PWM_BRI35     0x0223
    //#define LP5861_REG_ADDR_HIGH_MSK  GENMASK(9, 8)
    //#define LP5861_REG_ADDR_HIGH(x)   FIELD_PREP(LP5861_REG_ADDR_HIGH_MSK, x)
    //#define LP5861_REG_ADDR_LOW_MSK   GENMASK(7, 0)
    //#define LP5861_REG_ADDR_LOW(x)    FIELD_PREP(LP5861_REG_ADDR_LOW_MSK, x)
    #define LP5861_REG_READ_MSK    0x01
    #define I2C_INST DT_NODELABEL(i2c1)
    
    static const struct device *const _gI2cDev = DEVICE_DT_GET(I2C_INST);
    
    LOG_MODULE_REGISTER(lp5861);
    
    static int _lp5861ReadReg(uint16_t regAddr, uint8_t *regVal) {
        printk("tca6424aReadReg(regAddr=0x%x)\n", regAddr);
        //printk("LP5861_REG_ADDR_HIGH(regAddr)=0x%lx, LP5861_REG_ADDR_LOW(regAddr)=0x%lx\n", LP5861_REG_ADDR_HIGH(regAddr), LP5861_REG_ADDR_LOW(regAddr));
    #if 1
        uint8_t addrBuf[2];
    
        addrBuf[1] = regAddr & 0xFF;
        addrBuf[0] = regAddr >> 8;
        const int ret = i2c_write_read(_gI2cDev, LP5861_CHIP_ADDRESS, addrBuf, sizeof(addrBuf), regVal, 1);
    #else
        const uint16_t devAddr   = LP5861_CHIP_ADDRESS | LP5861_REG_ADDR_HIGH(regAddr) >> 7 | LP5861_REG_READ_MSK;
        const uint8_t  startAddr = LP5861_REG_ADDR_LOW(regAddr);
        printk("devAddr=0x%x, startAddr=0x%x\n", devAddr, startAddr);
        const int ret = i2c_burst_read(_gI2cDev, LP5861_CHIP_ADDRESS, regAddr, regVal, 1);
    #endif
        if (ret < 0) {
            printk("i2c_burst_read(0x%x) failed, ret=%d\n", regAddr, ret);
            return ERROR_I2C_READ_FAIL;
        }
    
        return 0;
    }
    
    static int _lp5861WriteReg(uint16_t regAddr, uint8_t regVal) {
        printk("tca6424aWriteReg(0x%x, 0x%x)\n", regAddr, regVal);
    #if 1
        uint8_t addrBuf[2];
        struct i2c_msg msg[2];
    
        addrBuf[1] = regAddr & 0xFFU;
        addrBuf[0] = regAddr >> 8U;
        msg[0].buf = addrBuf;
        msg[0].len = 2UL;
        msg[0].flags = I2C_MSG_WRITE;
    
        msg[1].buf = (uint8_t *)&regVal;
        msg[1].len = sizeof(regVal);
        msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
    
        const int ret = i2c_transfer(_gI2cDev, msg, 2, LP5861_CHIP_ADDRESS);
    #else
        const uint8_t buf[1] = { regVal };
        const int ret =  i2c_burst_write(_gI2cDev, LP5861_CHIP_ADDRESS, regAddr, buf, 1);
    #endif
        if (ret < 0) {
            printk("i2c_burst_write(0x%x) failed, ret=%d\n", regAddr, ret);
            return ERROR_I2C_WRITE_FAIL;
        }
    
        return 0;
    }
    
    int ledDriverInit(void) {
        printk("ledDriverInit\n");
    
        uint8_t regVal;
        while (1) {
            _lp5861ReadReg(LP5861_REG_ADDR_CHIP_EN, &regVal);
            k_sleep(K_SECONDS(1));
        }
    
        return 0;
    }
    
    #endif

  • The attached file is result of https://github.com/crfosse/ncs_projects/tree/main/peripheral_zephyr/i2c I2C scanner. The result is very strange since it found a lot of I2C devices.

    00> *** Booting Zephyr OS build v3.3.99-ncs1-1 ***
    00> The I2C scanner started
    00> Value of NRF_TWIM2->PSEL.SCL : 4 
    00> Value of NRF_TWIM2->PSEL.SDA : 5 
    00> Value of NRF_TWIM2->FREQUENCY: 26738688 
    00> 26738688 -> 100k
    00> 0x 4 FOUND
    00> 0x 5 FOUND
    00> [00:00:01.690,704] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:02.190,948] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:02.691,192] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:03.191,436] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:03.691,711] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:04.191,925] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:04.692,169] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:05.192,413] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:05.692,657] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:06.192,871] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:06.693,115] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:07.193,359] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:07.693,572] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:08.193,817] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:08.694,061] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:09.194,274] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:09.694,519] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:10.194,763] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:10.694,976] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:11.195,220] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:11.695,465] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:12.195,678] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:12.695,922] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:13.196,166] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:13.696,380] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:14.196,624] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:14.696,868] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:15.197,082] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:15.697,326] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:16.197,570] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:16.697,784] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:17.198,028] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:17.698,272] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> 0x27 FOUND
    00> [00:00:18.469,543] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:18.556,030] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:18.557,556] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> 0x2b FOUND
    00> 0x2c FOUND
    00> 0x2d FOUND
    00> 0x2e FOUND
    00> 0x2f FOUND
    00> 0x30 FOUND
    00> 0x31 FOUND
    00> 0x32 FOUND
    00> 0x33 FOUND
    00> 0x34 FOUND
    00> 0x35 FOUND
    00> 0x36 FOUND
    00> 0x37 FOUND
    00> [00:00:19.195,617] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:19.695,739] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:20.056,488] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.056,549] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.056,640] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.056,701] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.556,793] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:20.560,882] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.560,974] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:20.561,126] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> 0x42 FOUND
    00> 0x43 FOUND
    00> 0x44 FOUND
    00> 0x45 FOUND
    00> 0x46 FOUND
    00> [00:00:21.064,636] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> 0x48 FOUND
    00> [00:00:21.075,653] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.075,744] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.075,805] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.075,866] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.075,958] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.076,019] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.076,080] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.076,141] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.076,263] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:21.576,385] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:22.076,538] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:22.576,751] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:23.076,995] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:23.577,239] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:24.077,453] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:24.375,457] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:24.381,500] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> [00:00:24.381,744] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> 0x5b FOUND
    00> 0x5c FOUND
    00> 0x5d FOUND
    00> 0x5e FOUND
    00> 0x5f FOUND
    00> 0x60 FOUND
    00> 0x61 FOUND
    00> 0x62 FOUND
    00> [00:00:25.990,753] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> 0x64 FOUND
    00> [00:00:26.706,207] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> 0x66 FOUND
    00> 0x67 FOUND
    00> 0x68 FOUND
    00> [00:00:27.376,403] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:27.876,617] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:28.376,861] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:28.877,075] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:29.377,319] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:29.877,563] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> 0x6f FOUND
    00> [00:00:30.743,438] <err> i2c_nrfx_twim: Error on I2C line occurred for message 0
    00> [00:00:30.743,652] <err> i2c_nrfx_twim: Error 0x0BAD0001 occurred for message 0
    00> 0x72 FOUND
    00> 0x73 FOUND
    00> 0x74 FOUND
    00> 0x75 FOUND
    00> 0x76 FOUND
    00> 0x77 FOUND
    00> 0x78 FOUND
    00> 0x79 FOUND
    00> 0x7a FOUND
    00> 0x7b FOUND
    00> 0x7c FOUND
    00> 0x7d FOUND
    00> 0x7e FOUND
    00> 0x7f FOUND

  • Thanks. 

    I haven't tested that sample. 

    There are several other tickets regarding i2c already on devzone, that you can take a look at. 

     I2C samples for nRF9160 

    Br, 
    Joakim 

Reply Children
  • Thanks for your reply! I can read/write registers now.

    static int _lp5861ReadReg(uint16_t regAddr, uint8_t *regVal) {
        printk("tca6424aReadReg(regAddr=0x%x)\n", regAddr);
        const uint16_t devAddr   = LP5861_CHIP_ADDRESS | _lp5861GetRegAddrHigh(regAddr);
        const uint8_t  startAddr = _lp5861GetRegAddrLow(regAddr);
        printk("devAddr=0x%x, startAddr=0x%x\n", devAddr, startAddr);
        uint8_t rbuf[2];
        const int ret = i2c_burst_read(_gI2cDev, devAddr, startAddr, rbuf, sizeof(rbuf));
        if (ret < 0) {
            printk("i2c_burst_read(0x%x) failed, ret=%d\n", regAddr, ret);
            return ERROR_I2C_READ_FAIL;
        }
    
        printk("rbuf[0]=0x%x, rbuf[1]=0x%x\n", rbuf[0], rbuf[1]);
        *regVal = rbuf[0];
        return 0;
    }
    
    static int _lp5861WriteReg(uint16_t regAddr, uint8_t regVal) {
        printk("tca6424aWriteReg(regAddr=0x%x, regVal0x%x)\n", regAddr, regVal);
        const uint16_t devAddr   = LP5861_CHIP_ADDRESS | _lp5861GetRegAddrHigh(regAddr);
        const uint8_t  startAddr = _lp5861GetRegAddrLow(regAddr);
        printk("_lp5861GetRegAddrHigh(regAddr)=0x%x\n", _lp5861GetRegAddrHigh(regAddr));
        printk("devAddr=0x%x, startAddr=0x%x\n", devAddr, startAddr);
        const uint8_t wbuf[2] = { regVal,  0x00};
        const int ret =  i2c_burst_write(_gI2cDev, devAddr, startAddr, wbuf, sizeof(wbuf));
        if (ret < 0) {
            printk("i2c_burst_write(0x%x) failed, ret=%d\n", regAddr, ret);
            return ERROR_I2C_WRITE_FAIL;
        }
    
        return 0;
    }

Related