This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TLV320AIC3101: Doesn't handle I2C repeated start?

Part Number: TLV320AIC3101

My design has a TLV320AIC3101 which I'm configuring over the I2C bus from a microcontroller.  If a write happens as a single complete I2C transaction, the AIC3101 registers get written correctly.  If I write the register address and then issue a repeated start and write the data, the AIC3101 registers remain unchanged.

Section 11.5.1 in the datasheet mentions repeated starts, so I would expect it to work.  I suppose it's possible they only consider it for reads, but that seems strange.

Has anyone else run into this?  Am I missing something?

  • Hi, Eugene,

    Welcome to E2E and thank you for your interest in our products!

    The repeated start should work for writing too. As mentioned in the datasheet, a master may apply another start condition while the bus is active. Does this repeated start work for reads in your application? If not, could you provide more details about your I2C lines (the I2C frequency, an oscilloscope capture)?

    Thank you.

    Best regards,
    Luis Fernando Rodríguez S.
  • Hi Luis,

    The repeated start does work for reading, but not for writing.  The clock frequency is about 300kHz.

    Here's a trace of a write transaction (writing 0x01 to Register 0) that works because it has no repeated start in the middle:

    And here's the same one with a repeated start that doesn't work (the register remains unchanged):

    Thanks for any insight you can provide.

  • Hi, Eugene,

    Probably this is related with the page selection. Register 0 modifies the register page. So, this could be affecting the repeated start. Could you select a page without repeated start and try writing the next registers?

    Thank you.

    Best regards,
    Luis Fernando Rodríguez S.
  • Hi Luis,

    Although the example I provided above showed writes to Register 0, I see exactly the same behaviour regardless of which register address I use. And shouldn't the page select register still work with a repeated start if other registers did?
  • Hi, Eugene,

    If the software reset register (page 0 / register 1) is involved in this configuration, the consecutive writing won't work. This register would require a delay to ensure that all the registers are in default state.

    I recommend to apply a hardware reset and a software reset to ensure that all the registers are in default state. Then, could you try writing the page 0 / registers 3-6. Do you have the same results?

    Additionally, I recommend to verify the IOVDD and DVDD power supplies. These power supplies are related to the I2C writing. Please ensure that the power supplies have the correct voltage and that it is stable.

    Best regards,
    Luis Fernando Rodríguez S.
  • Hi Luis,

    The software reset register isn't involved, and all of the power supplies are correct.

    Just to be clear, I've had this device working perfectly in two different products for a few years now, using complete I2C writes with no repeated starts.  The only change that makes it stop working, which I needed to make to reduce memory usage on the attached microcontroller, is to break the I2C writes up into two parts with a repeated start inbetween.

  • Hopefully this will illustrate that the problem is unrelated to anything other than the device's handling of I2C.  The following is taken from a single capture showing transactions both with and without a repeated start.  Although it's broken up for clarity, this is one continuous run with no activity on the I2C bus between successive images.

    First, we read Register 3, and it contains its documented default value of 0x10:

    We then write a value of 0xFF to Register 3 as a single transaction, with no repeated start:

    After that, we read Register 3 and see that the value of 0xFF was written correctly:

    Then we write a value of 0x00 to Register 3, still using a single transaction with no repeated start:

    We read Register 3 and confirm that it now contains 0x00:

    Now, immediately after that, we write 0xFF to Register 3 again, this time with a repeated start in the middle:

    We read Register 3, and see that the value was not written and the register still contains 0x00:

  • Eugene,

    I apologize for the late response.

    Could you tell me if this issue appear with both I2C standard and fast modes?

    Additionally, could you read the next register value when you apply a repeated start? Does the next register have the correct register value?

    Best regards,
    Luis Fernando Rodríguez S.
  • Hi Luis,

    The behaviour is the same at 100kHz, and the next register also remains unchanged.

  • Hi, Eugene,

    After several tests on the codec, it seems that the repeated start procedure doesn't apply for writing. I got similar results with all your conditions. The repeated start procedure seems to be available for reading only.

    I would recommend to use a consecutive writing sending successive register values. This could be helpful to reduce I2C commands.

    Best regards,
    Luis Fernando Rodríguez S.
  • Thanks for the confirmation.

    Is there any chance of this being brought to the attention of the engineers who work on the audio codecs, or at least the documentation team so that this problem can make it into the datasheet?

  • Hi, Eugene,

    I will contact the correct engineers and notify this. This will avoid future problems with this device.

    Best regards,
    Luis Fernando Rodríguez S.