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.

dm385 hdvpss I2C 运行没反应



我在调试HDVPSS 内的驱动的时候,运行 了HDVPSS 下的I2C 的读写测试程序,但是帽子我用示波器看没有什么反应!这是怎么回事 ?

  • Du Qigong,

    是否有使用hdvpss驱动里面配套的gel?会不是是pinmux没有设置好?

  • 用了!我先使用GEL 初始化HDVPSS ,完后连接ISS M3 。加载程序后。运行了,但示波器看I2C 波形没有变化,我初始化了pinmux 中我使用的I2C !但没有i2c的信号跳变!

  • Du Qigong,

    测量的引脚是否正确?可以配置该引脚为GPIO,看看是否输出正常么?

  • 在HDVPSS 的代码基础上怎么设置 GPIO 高低变化一下 ?是不是还需要配置ARM Supervisor模式 ?

  • Du Qigong,

    请参考一下一下A8 gel里面的GPIO_Enable,和TRM里面GPIO相关章节。Pinmux要配置为GPIO功能。

  • gpio 设置后没有问题。可以正常变化高低电平,我用的是 VOUT[1]_R_CR[3]/GPMC_A[14]/VIN[1]A_D[22]/HDMI_SDA/SPI[2]_SCLK/I2C[2]_SDA/GP3[21]  和 VOUT[1]_G_Y_YC[2]/GPMC_A[13]/VIN[1]A_D[21]/HDMI_SCL/SPI[2]_SCS[2]n/I2C[2]_SCL/GP3[20]  

    在vps_platformTI8107.C 中设置 

    /* I2c2 configuration Function 6*/
    #if defined(TI_8107_BUILD)
    REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0B8C) = 0x60040; /* i2c2_scl_mux0 */
    REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0B90) = 0x60040; /* i2c2_sda_mux0 */
    #endif 

    后单步调试就在I2C2内过不去。软件内部使用的是中断!这处有没有什么影响 ?我尝试读取外部的ADV7180 0x42 但每次有看到读取的数值不对!

  • Du Qigong,

    I2C内什么地方过不去?I2C是否有正确上拉?数据和时钟线上都没有信号输出么?

  • 上拉是有的 !两个上面都没有信号!我过不去是在执行到i2c读写的时候过不去!

  • Du Qigong,

    能在继续往下面跟一下代码,看看具体挂在了哪里?是I2C发送指令,还是等待ACK,或者其他。

  • 跟踪到psp_i2cdev.c内的PSP_i2cProbe 函数,到

    if (!(I2C_READ_REG_WORD(&instObj->i2cRegs->I2C_IRQSTATUS_RAW) & I2C_STAT_NACK)) {
    res = 0; /* success case */
    flush_fifo(instanceId);
    I2C_WRITE_REG_WORD(0xFFFF, &instObj->i2cRegs->I2C_IRQSTATUS);
    } else {
    I2C_WRITE_REG_WORD(0xFFFF, &instObj->i2cRegs->I2C_IRQSTATUS); /* failue, clear sources*/
    I2C_WRITE_REG_WORD(I2C_READ_REG_WORD(&instObj->i2cRegs->I2C_CON) | I2C_CON_STP,
    &instObj->i2cRegs->I2C_CON); /* finish up xfer */
    udelay(I2C_DELAY_MED );
    wait_for_bb (instanceId);
    }

    这就过不去了。应该是没有收到ACK ,还有一个问题就是我的i2c 的波形看起来好像不对。没有像正常I2C 读写一样发出SLAVE ADDR REG ADDR DATA 这样的

  • Du Qigong,

    之前你说I2C“我用示波器看没有什么反应”,是否就是和现你发的信号图的状态是一样的?

    请问信号上的毛刺是你测量的问题么?

    请问你能否确认外部i2c设备本身是否工作正常?

  • 第一个是之前我没有修改PINMUX 到我实际使用的I2C 管脚。修改后就看到了波形,毛刺的问题这个我也有点疑惑,应该不是测量的问题,我将I2C 速度降到100K ,

    外部的I2C 设备是正常的 ,我同一个代码在不同的板子上都试了,结果都一样,还有一个问题 。

    在VPS_platfrom8107.c中有一处


    /* I2C2 interrupt is routed through I2C1 interrupt through the
    * crossbar. For this, INT_MUX_[#int_number] register in the
    * Chip Control Module needs to be programmed.
    * INT_MUX_[#int_number] registers start from 0xF54
    * offset and one register is used to program 4 interrupt
    * muxes (6 bits for each mux, 2 bits reserved).
    * After reset INT_MUX_[#int_number] defaults to 000000, which
    * maps the interrupt from default mapping to interrupt_[#int_number].
    *
    * I2C_INT1 is mapped to interrupt line 19 and
    * INTMUX 16 to 19 --> 0x0f64. So read it first,
    * modify the respective bit field and write is back.
    */
    int_mux = REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64);
    /* I2CINT2 value = 4, INT_MUX_19_SHIFT = 24*/
    int_mux |= (4 << 24);
    REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64) = int_mux;

    return (FVID2_SOK);
    }

    这个,描述的中断复用的问题,我在手册上没有找到这部分的描述信息,这个怎么配置,?

  • qigong du1 说:
    描述的中断复用的问题,我在手册上没有找到这部分的描述信息,这个怎么配置,

    请在DM385的TRM里面搜索Media_Controller_INTMUX。

  • 这处我看到了,我想问的是我怎么知道那个复用的是I2C1 那个是I2C2 I2C3 现在我不是很明确那个链接的是那个!

  • 我修改了代码!现在可以用I2C 读写测试成功了!但是在代码里面执行Vps_deviceI2cProbeDevice 的时候依旧失败!这处是怎么回事 ?

  • 这个我解决了!上面有一处的延时太大,导致NACK 检测失败,现在在HDVPSS 下我同时是用来I2C1 I2C2 在

    static Int32 Vps_platformTI8107SetIntMux(void)
    {
    volatile unsigned int int_mux;

    /* I2C2 interrupt is routed through I2C1 interrupt through the
    * crossbar. For this, INT_MUX_[#int_number] register in the
    * Chip Control Module needs to be programmed.
    * INT_MUX_[#int_number] registers start from 0xF54
    * offset and one register is used to program 4 interrupt
    * muxes (6 bits for each mux, 2 bits reserved).
    * After reset INT_MUX_[#int_number] defaults to 000000, which
    * maps the interrupt from default mapping to interrupt_[#int_number].
    *
    * I2C_INT1 is mapped to interrupt line 19 and
    * INTMUX 16 to 19 --> 0x0f64. So read it first,
    * modify the respective bit field and write is back.
    */
    int_mux = REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64);
    /* I2CINT2 value = 4, INT_MUX_19_SHIFT = 24*/
    int_mux |= (4 << 24);
    REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64) = int_mux;

    return (FVID2_SOK);
    }

    我该怎么加入中断1的 ,这处我的理解不是很清楚!能否讲解一下?

  • Du Qigong,

    你同时使用了DM385上的两个I2C接口做master?如果是,为什么?I2C总线上可以挂多个slave设备。

    你的问题我不是很理解,你现在是要在M3上使能某个I2C的中断?

  • 我现在在硬件上用i2c1  i2c2分别控制了一个 视频解码器,这个在这一版的基础上我不能使用一个I2C 控制,现在我在代码内要加入I2C1 的代码,也就是在如上的问题中我添加I2C1 的中断复用代码,我对于在 

    Vps_platformTI8107SetIntMux(void)
    {
    volatile unsigned int int_mux;

    /* I2C2 interrupt is routed through I2C1 interrupt through the
    * crossbar. For this, INT_MUX_[#int_number] register in the
    * Chip Control Module needs to be programmed.
    * INT_MUX_[#int_number] registers start from 0xF54
    * offset and one register is used to program 4 interrupt
    * muxes (6 bits for each mux, 2 bits reserved).
    * After reset INT_MUX_[#int_number] defaults to 000000, which
    * maps the interrupt from default mapping to interrupt_[#int_number].
    *
    * I2C_INT1 is mapped to interrupt line 19 and
    * INTMUX 16 to 19 --> 0x0f64. So read it first,
    * modify the respective bit field and write is back.
    */
    int_mux = REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64);
    /* I2CINT2 value = 4, INT_MUX_19_SHIFT = 24*/
    int_mux |= (4 << 24);
    REG32(CSL_TI8107_CTRL_MODULE_BASE + 0x0f64) = int_mux;

    return (FVID2_SOK);

    这处,不是很清楚,现在设置中断复用是I2C2 的 ,我打开了I2C1 也使用这个的话就必须要使用I2C1 的中断 ,我看了TRM 中相关信息,不知道为什么在这处代码中要写I2CINT2 value = 4, INT_MUX_19_SHIFT = 24  ?就这处不是很明白 !

  • Du Qigong,

    你可以参考一下DM8148 TRM的1.7.4 Interrupt Requests to Media Controller INTC section (M3 interrupt) 章节,你可以了解到M3的中断数小于M3的中断源的数据。所以有些中断默认是M3的中断,例如I2C1的中断。但有些是不在默认中断里的,例如I2C2中断,如果要使用是需要map到默认的中断号上的。目前的配置是把I2C2的中断map到了默认I2C1的中断号上。在你的应用里面,你需要寻找另一个你不是用的默认中断然后配置为I2C2中断。

    代码里面,I2C2的Media_Controller_INTMUX_xValue=4. 但是I2C1的中断号应该是42,不知道为什么代码里面用了19. 如果是中断号19,配置它mux的寄存器是Media_Controller_INTMUX_16_19的bit24~29,所以要shift 24bit。

  • 这处还是不清楚到底是怎么回事?具体的不知道Media_Controller_INTMUX_16_19 Register 这个表示的是那个映射那个!为什么要写16_19 其他的不行么?TI 可以其他的一些资料么 ?

  • Du Qigong,

    请问你有看过DM8148 TRM的1.7.4 Interrupt Requests to Media Controller INTC 部分内容了么?

  • 看了!但我还是有点理解不清楚,我的理解是Media Control 有79的中断,但外部设备的中断大于79 ,我要使用不在这个上面的中断的话必须映射,

    但对于Media_Controller_INTMUX_24_27 这个的话有56的复用的,想问的是 INTMUX 24 表示的就是现有的第24个中断么 ? 外部没有的中断怎么映射的关系是怎样的 ?我想在将I2C2 映射到I2C0 上这个 该怎么操作 ?还有一个问题就是我看到了有诸如 UART0 Interconnect Registers  ,手册上没有这些的描述,这些是干什么的 ?谢谢!

  • 对于代码中描述的映射到19 这个我不是很明白?是只能映射到这处,还是别的也行,比如16 ?

  • qigong du1 说:

    对于代码中描述的映射到19 这个我不是很明白?是只能映射到这处,还是别的也行,比如16 ?

    理论上是没有使用的中断号都可以被映射(占用)。

  • qigong du1 说:
    想问的是 INTMUX 24 表示的就是现有的第24个中断么 ?

    是的。