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.

DS90UB954-Q1: Cannot access ISP through 954 (and through 913)

Part Number: DS90UB954-Q1
Other Parts Discussed in Thread: ALP

We have older design with 914 and we have no problem I2C accessing all of 914, 913 and ISP (such as AP0202 or MARS camera).

However if we use 954, we can I2C access only 954 and and 913 but not ISP. Could any one share simple I2C access sequence to 954 to access any ISP registers ?  (954 and 913 are 8bits but I believe ISP is 16 bits ?)

  • Hi Kwan,

    Did you set the slave alias (reg 0x65) for your ISP? You should set an alias and only communicate using slave alias ID.

    Here's an example to talk to a 16-bit register on ALP (Device ID: 0x60, Register: 00 01 , Value: 35):

    board.WriteI2C(0x60, 0x00, [0x01, 0x35])

    Best,
    Jiashow
  • Thanks, Jiashow

    Now we believe we can talk to ISP (no I2C R/W errors) but data coming out from ISP isn't what we expect.

    E.g. address 0000 / 0001 is revision and we read all 0.

    What should we do ?  

    Below is sequence. ("echo 3a addr data > i2c_reg_write" is to write to 954 which is connected to 913. 913 is connected to ISP)

    echo 3a 01 02 > i2c_reg_value ;

    echo 3a 10 81 > i2c_reg_value ;

    echo 3a 11 85 > i2c_reg_value ;

    echo 3a 12 89 > i2c_reg_value ;

    echo 3a 13 8d > i2c_reg_value ;

    echo 3a 32 01 > i2c_reg_value ;

    echo 3a 1f 02 > i2c_reg_value ;

    echo 3a 33 03 > i2c_reg_value ;

    echo 3a 20 e0 > i2c_reg_value ;

    echo 3a 4c 01 > i2c_reg_value ;

    echo 3a 58 de > i2c_reg_value ;

    echo 3a 5c 18 > i2c_reg_value ;

    echo 3a 5d 60 > i2c_reg_value ;

    echo 3a 65 60 > i2c_reg_value ;

    echo 3a 7c 00 > i2c_reg_value ;

    echo 3a 70 2b > i2c_reg_value ;

    echo 3a 6d 7f > i2c_reg_value ;

    echo 0c 03 cd > i2c_reg_value ;

  • Hi Kwan,

    In register 0x58, try changing the back channel frequency to 2.5Mbps. Also in the same register, set I2C_PASS_THROUGH to 1 to allow DES to propagate messages to device IDs that it recognizes (SER_ALIAS and SLAVE_ALIAS) to the assigned port, and disable I2C_PASS_THROUGH_ALL and AUTO_ACK_ALL.

    Try to talk to your ISP using register 0x60.

    Best,
    Jiashow
  • Hi, Jiashow

    1. No, if I set register 58 with 58 (with I2C_PASS_THROUGH_ALL on OFF), I2C access to ISP fails but, d8 (with I2C_PASS_THROUGH_ALL on), at least I can access I2C. Yes, I am using address as 60. 

    2. I still cannot have reasonable data from ISP. E.g. if I read address 0000 (which is revision), I get all 00. Any meaningful and expected address / values ?

    Thanks !

  • Hi Kwan,

    Either I2C_PASS_THROUGH is set to 1  or  I2C_PASS_THROUGH_ALL and AUTO_ACK set to 1. If having only I2C_PASS_THROUGH on doesn't work, that means the deserializer doesn't recognize the slave address 0x60. It just passes all addresses regardless if they are valid or not.

    A couple questions:

    - Did you set the BC frequency to 2.5Mbps (in reg 0x58)?

    - Do you have clock stretching on your I2C master? Our SerDes requires clock stretching for proper operation.

    - What is your I2C voltage and pull-up values?

    Best,

    Jiashow

  • Hi, Jiashow

    1. Yes, we tried 2.5Mbps (reg value, 58 or d8 for reg 0x58)

    2. Yes, we are using Xilinx IIC core and it does support clock stretching.

    3. We tried multiple cameras and one of them is ON Semi MARS ref camera and it is 1.8V with 1.5K ohm pull up.

    At 954 side, it is FPD Back Channel so, there are no IIC pull up (it is part of FPD).

    Let me know if you have any more info. We will probably probe at ISP IIC pins.

  • I was mistaken about I2C connection, yes, there is I2C from FPGA to 954. 1.8V and 2K pullup.
  • Now we probed, using MARS camera, I2C from serializer to ISP. Not sure how familiar you are but in sequence, when we tried to read from 0x60, register 0x0000, start condition, then 0x60 is written, 0x00 is written, 0x00 is written and then repeated start and then 0x60 is written and then 0x00 is read. Looks normal to me although a few questions are, why do we need I2C PASS THROUGH ALL and why do we read all 0 from ISP which is the revision register.
  • Hi Kwan,

    Could you try reading register 0x30 instead? The address you set for slave alias in the deserializer is 8-bit, so 0x60 would be 0x30 for 7-bit.

    Best,
    Jiashow
  • Hi, Jiashow

    I did read both 0x60 and 0x30 like below (with our own command here) but read all 0. What is funny is it is ACK'ing to all address.

    I tried 0x50.

    root@baidu-Nuvo-6108GC:/sys/basa0-MoonRover-0000-02-00-0# echo 30 0000 > i2c_reg16_value ; cat i2c_reg16_value
    I2C read OK: id = 0x30, addr = 0x0, data = 0x0
    root@baidu-Nuvo-6108GC:/sys/basa0-MoonRover-0000-02-00-0# echo 30 0001 > i2c_reg16_value ; cat i2c_reg16_value
    I2C read OK: id = 0x30, addr = 0x1, data = 0x0
    root@baidu-Nuvo-6108GC:/sys/basa0-MoonRover-0000-02-00-0# echo 60 0000 > i2c_reg16_value ; cat i2c_reg16_value
    I2C read OK: id = 0x60, addr = 0x0, data = 0x0
    root@baidu-Nuvo-6108GC:/sys/basa0-MoonRover-0000-02-00-0# echo 60 0001 > i2c_reg16_value ; cat i2c_reg16_value
    I2C read OK: id = 0x60, addr = 0x1, data = 0x0

    root@baidu-Nuvo-6108GC:/sys/basa0-MoonRover-0000-02-00-0# echo 50 0000 > i2c_reg16_value ; cat i2c_reg16_value
    I2C read OK: id = 0x50, addr = 0x0, data = 0x0

    I am posting 3 pictures accessing 0x30, accessing 0x50 and accessing 0x50 zooming up for ack'ing device address. 

    It looks all legal. 

    Any idea what is happening ???

  • BTW, I have another post running.

    e2e.ti.com/.../2811673
  • Hi Kwan,

    I know you've opened another thread on the same issue. Are you able to get your issue resolved?

    Best,
    Jiashow