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 Children
  • i2c1_default: i2c1_default {
    		group1 {
    			psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
    				<NRF_PSEL(TWIM_SCL, 1, 3)>;
    		};
    	};
    
    	i2c1_sleep: i2c1_sleep {
    		group1 {
    			psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
    				<NRF_PSEL(TWIM_SCL, 1, 3)>;
    			low-power-enable;
    		};
    	};
    	
    	&i2c1 {
    	compatible = "nordic,nrf-twim";
    	status = "okay";
    	clock-frequency = <I2C_BITRATE_STANDARD>;
    	pinctrl-0 = <&i2c1_default>;
    	pinctrl-1 = <&i2c1_sleep>;
    	pinctrl-names = "default", "sleep";
    };

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

Related