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 Reply
  • 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;
    }

Children
  • /*
     * 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

Related