我在调试HDVPSS 内的驱动的时候,运行 了HDVPSS 下的I2C 的读写测试程序,但是帽子我用示波器看没有什么反应!这是怎么回事 ?
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.
我在调试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个中断么 ?
是的。