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.

DS90UB941AS-Q1: DS90UB941 连接两个 DS90UB948 ,i2cdetect 看不到 DS90UB948 的i2c地址

Part Number: DS90UB941AS-Q1

Hi:

硬件如图去设计:

DS90UB948 的 idx 是直接接地的:

DS90UB941 的I2C地址是 0x1a,DS90UB948 的地址是 0x2c。

Linux 上通过如下命令不能探测到 DS90UB948 的i2c地址:

1、开机探测
# i2cdetect -y 17
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --  ds90ub941 的地址
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
 

2、复位
i2cset -fy 17 0x1a 0x01 0x0f b                        Reset DSI/DIGITLE 复位
i2cset -fy 17 0x1a 0x03 0xBA b                       Enable FPD-Link I2C pass through 打开透传,然后可以看到 948 的I2C地址


3、再探测
# i2cdetect -y 17
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --    没有显示 ds90ub948 的地址
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
 

通过读取 ds90ub941 的寄存器值,DES_ID_DES_ID_1 Register (Address = 6h) [reset = 0h] 里的值是 0x58 = 0x2c 左移一位,也就是找到了 ds90ub948 

通过命令对 ds90ub948  读写无效。

我不知道该怎么去做啦,请帮忙指导一下。

非常感谢

  • 您好,  如果941和948之间的link建立没有问题的话,那么948的地址会自动加载到941中的,也就是说您通过读取941的寄存器DES_ID的值,如果是能正常读取到的,那说明是没问题的. 我看您这里描述就是通过读取DES_ID的值,能正确读取到948的地址. 

    您目前遇到的问题, 是通过i2cdetect命令探测948的地址是吗?

  • 因为是使用的Linux系统,它有自带工具 i2c-tools,可以探测到总线上的设备,并列出来,也可以去写挂在i2c总线上的设备。目前通过这个工具去读写948的寄存器是失败的。

  • 明白您的意思了,因为我对Linux系统不是很熟悉, 那么自带的这个I2C tools在其他芯片的I2C使用上, 是否能正确探测呢?

    因为根据您的描述,我这边可以判断, 941和948的link是没问题的, 通过DES_ID也能正确读取948的地址, 也说明主机和941, 948都能正确通讯的.

  • 在其它芯片是可以的,我这边使用了两个941,一路是正常的,现在不正常的是另一路,可以看截图。

  • 您好,我这里解决了,因为硬件问题,导致fpdlink的线连接不稳定导致。目前已经可以找到948的i2c地址啦。

    也可以正常读写948的寄存器啦。

  • 非常感谢您的反馈, 后续有什么问题,继续讨论.

  • 请问这样的连接,该怎么配置941和948的寄存器呢?

    有示例吗?

  • Hi 

    我目前已经能够通过Linux i2ctool 写UB941/8的寄存器,让屏幕正常显示。

    但是现在遇到了新问题。我把寄存器写的操作加入到驱动里,948的写报错了。要等一些时间,才能成功写948的寄存器。


    下面是我使用的命令
    #define UB941_ADDR 0x1a
    #define UB948_ADDR 0x2c

    ds90ub94x_write_reg(UB941_ADDR, 0x01, 0x0F); /* Reset ub941, Disable DSI */
    ds90ub94x_write_reg(UB941_ADDR, 0x5B, 0x0C); /* FPD3_TX_MODE=Single or Replicate, Align on DE */
    ds90ub94x_write_reg(UB941_ADDR, 0x4F, 0x8C); /* Set DSI_CONTINUOUS_CLOCK, 4 lanes, DSI Port 0 */

    ds90ub94x_write_reg(UB941_ADDR, 0x40, 0x04); /* Select DSI Port 0 digital registers */
    ds90ub94x_write_reg(UB941_ADDR, 0x41, 0x21); /* Select DSI_CONFIG_1 register */
    ds90ub94x_write_reg(UB941_ADDR, 0x42, 0x60); /* Set DSI_CONFIG_1: DSI_VS_POLARITY=DSI_HS_POLARITY=1 */

    ds90ub94x_write_reg(UB941_ADDR, 0x40, 0x04); /* Select DSI Port 0 digital registers */
    ds90ub94x_write_reg(UB941_ADDR, 0x41, 0x05); /* Select DPHY_SKIP_TIMING register */
    ds90ub94x_write_reg(UB941_ADDR, 0x42, 0x16); /* Write DPHY_SKIP_TIMING: TSKIP_CNT value */

    ds90ub94x_write_reg(UB941_ADDR, 0x01, 0x00); /* Enable DSI */
    ds90ub94x_write_reg(UB941_ADDR, 0x1E, 0x01); /* Select FPD-Link III Port 0 */
    ds90ub94x_write_reg(UB941_ADDR, 0x03, 0x9A); /* Enable I2C_PASSTHROUGH, FPD-Link III Port 0 */

    ds90ub94x_write_reg(UB948_ADDR, 0x01, 0x03); /* Reset ub948 */
    ds90ub94x_write_reg(UB948_ADDR, 0x1E, 0x90); /* lcd_led_pwm, Pull up*/
    ds90ub94x_write_reg(UB948_ADDR, 0x1F, 0x09); /* lcd_led_en, Pull up */

x 出现错误。请重试或与管理员联系。