multiple i2c bugs



  • I am trying to get the CoreS3's proximity and ambient light sensor to work in UiFlow2.0 and I am having these problems.
    1: i2c "Generate START condition" block shows this error "OSError: I2C operation not supported"
    2: i2c "Scan Device" block returns addresses, but the address for the LTR553 (0x23) does not show up.
    3: You need an object with buffer protocol to send data via i2c but something with buffer protocol (like bytearray) does not work.

    Any help or bug fix/update is much appreciated!



  • Hello @HWTaro9

    1: not sure when this is actually needed.

    2: I2C scan returns a list with decimal values (not hex) therefore you should be looking for the decimal value 35 (=0x23) in the list.

    3: I am able to write to and read from the light sensor like below:

    0_1684787251587_UIFlow2_CoreS3_Lightsensor_20230522.png

    Thanks
    Felix



  • Thank you very much for the info and code! But the reason I need to send a start command is because the microphone decoder only sends code after a start condition is sent, and I'm not sure that it is sent automatically.



  • Hello @HWTaro9

    it is my understanding that audio data from the microphones are being sent via I2S (not I2C), no?

    Do you have a document explaining the I2C commands of the ES7210?

    Thanks
    Felix



  • This post is deleted!




  • Hello @HWTaro9

    that is only the general description of how I2C works. Or am I missing something?

    I am looking for a list of register addresses which can be read and write to.

    Thanks
    Felix



  • @felmue this IDE code works for me on the CoreS3 - I had to cobble together code from various sources to get this to work (and still use the CoreS3 lib)

    #define LTR553_ADDR 0x23

    void writeRegister8(uint8_t _address, uint8_t subAddress, uint8_t data, uint32_t freq) {
    Wire1.beginTransmission(_address);
    Wire1.write(subAddress);
    Wire1.write(data);
    Wire1.endTransmission();
    }

    uint8_t readRegister8(uint8_t _address, uint8_t subAddress, uint32_t freq) {
    Wire1.beginTransmission(_address);
    Wire1.write(subAddress);
    Wire1.endTransmission();
    Wire1.requestFrom(_address, (size_t)1);
    return Wire1.read();
    }

    void readRegister(uint8_t _address, uint8_t subAddress, uint8_t buff[], int size, uint32_t freq) {
    Wire1.beginTransmission(_address);
    Wire1.write(subAddress);
    Wire1.endTransmission();
    Wire1.requestFrom(_address, (size_t)size);
    for (int i = 0; i < size; i++) {
    buff[i] = Wire1.read();
    }
    }

    bool LTR553Init() {
    // soft reset
    uint8_t value_r = readRegister8(LTR553_ADDR, 0x80, 100000L);
    value_r &= (~0x02);
    uint8_t value_w = value_r | 0x02;
    writeRegister8(LTR553_ADDR, 0x80, value_w, 100000L);

    // PS Led Pluse
    writeRegister8(LTR553_ADDR, 0x83, 0x0F, 100000L);
    // ALS Active Mode
    value_r = readRegister8(LTR553_ADDR, 0x80, 100000L);
    value_r &= (~0x01);
    value_w = value_r | 0x01;
    writeRegister8(LTR553_ADDR, 0x80, value_w, 100000L);
    // PS Active Mode
    value_r = readRegister8(LTR553_ADDR, 0x81, 100000L);
    value_r &= (~0x03);
    value_w = value_r | 0x03;
    writeRegister8(LTR553_ADDR, 0x81, value_w, 100000L);
    return true;
    

    }

    uint32_t GetLTR553AlsCh0Value() {
    uint8_t buffer[2];
    uint32_t result;
    readRegister(LTR553_ADDR, 0x8A, buffer, 2, 100000L);
    result = (buffer[1] << 8) | buffer[0];
    return result;
    }

    uint32_t GetLTR553AlsCh1Value() {
    uint8_t buffer[2];
    uint32_t result;
    readRegister(LTR553_ADDR, 0x88, buffer, 2, 100000L);
    result = (buffer[1] << 8) | buffer[0];
    return result;
    }

    uint16_t GetLTR553PsValue() {
    uint8_t buffer[2];
    uint16_t result;
    readRegister(LTR553_ADDR, 0x8D, buffer, 2, 100000L);
    buffer[0] &= 0xFF;
    buffer[1] &= 0x07;
    result = (buffer[1] << 8) | buffer[0];
    return result;
    }

    call the Init from setup and call the Get* ones as you need



  • Hello @aleekwen

    thank you for the extensive code example.

    However, the original topic was for UIFlow 2.0 (not IDE code) and the user having difficulties is @HWTaro9.

    That said, it is still good to know that it works when using IDE code.

    Thanks
    Felix



  • @HWTaro9 @felmue @aleekwen

    Hi, new firmware now suppport LTR553 sensor.