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.

dm8168 iic 问题



hi all:

     我现在在调试dm8168的uboot,尝试在uboot中添加,iic从设备初始化的代码。在调试中发现这样的现象。

     在我上电后,uboot中调用i2c_read函数读取iic从器件的内容时,会报“I2C read: I/O error”的错误,使用示波器在抓取iic引脚的波形发现没有数据输出。

     但是在uboot中输入boot启动内核,在linux启动完成后,在linux中输入reboot,重启设备。

     重启到uboot输入回车中止启动,这时执行同样的iic操作,全部是好用的,读写的数据全部正确。

     现在uboot中iic的接口函数,是调用omap24xx_i2c.c中的函数,在uboot启动中已经调用iic_init函数。

     开始怀疑io复用的问题,但是iic0,1的引脚都没有复用。

     所以这个问题现在比较迷惑,iic初始化时出了对iic寄存器的初始化还要依赖于其他单元吗?内核中应当是做了一些初始化,使iic工作了,而uboot中没有做。

  • 你好,

    请问在uboot下测试的是I2C0还是I2C1?应该是I2C0在uboot下是可以正常访问的。I2C1无论是在uboot/kernel下默认代码都是没有配置的。

    如果是I2C0,你可以看看相关时钟是否有使能。

    下面的信息可以在http://processors.wiki.ti.com/index.php/TI81XX_PSP_04.04.00.02_Feature_Performance_Guide找到。

    Module/Subsystem Usage Info

    Module/Subsystem

    Enabled on Reset?

    Enabled in UBoot?

    Enabled in Linux?

    Remarks

    I2C0

    NO

    YES

    CONFIG

    I2C1

    NO

    NO

    NO

    I2C2

    NO

    YES

    CONFIG

    NA - TI816X

    I2C3

    NO

    NO

    NO

    NA- TI816X

  • 使用的是iic0,我确定下时钟源的问题。

    uboot中默认iic操作的接口是操作的iic0,因为从代码上看寄存器的赋值是iic0的寄存器,其中包括三个函数,初始化化,write,read。

    用的是read调用

  • 从uboot代码上看使能了iic0的clk:

    s_init-->prcm_init-->peripheral_enable()

    peripheral_enable中有下边的代码

    /* I2C0 */
    __raw_writel(0x2, CM_ALWON_I2C_0_CLKCTRL);
    while(__raw_readl(CM_ALWON_I2C_0_CLKCTRL) != 0x2);
    /* I2C1 */
    __raw_writel(0x2, CM_ALWON_I2C_1_CLKCTRL);
    while(__raw_readl(CM_ALWON_I2C_1_CLKCTRL) != 0x2);

    从注释来看应当是使能了iic的时钟

  • 可以把u-boot和kernel初始化I2C后相关的寄存器打印出来,比较一下有差异的寄存器

  • 对比打印iic寄存器的值,好用和不好用时,没有发现不一样的地方。

    下边是iic寄存器的值

    48028000 = [9]
    48028004 = [5040]
    48028008 = [0]
    4802800c = [0]
    48028010 = [1]
    48028014 = [0]
    48028018 = [0]
    4802801c = [0]
    48028020 = [0]
    48028024 = [0]
    48028028 = [0]
    4802802c = [1f]
    48028030 = [1f]
    48028034 = [0]
    48028038 = [0]
    4802803c = [0]
    48028040 = [0]
    48028044 = [0]
    48028048 = [0]
    4802804c = [0]
    48028050 = [0]
    48028054 = [0]
    48028058 = [0]
    4802805c = [0]
    48028060 = [0]
    48028064 = [0]
    48028068 = [0]
    4802806c = [0]
    48028070 = [0]
    48028074 = [0]
    48028078 = [0]
    4802807c = [0]
    48028080 = [0]
    48028084 = [0]
    48028088 = [0]
    4802808c = [0]
    48028090 = [1]
    48028094 = [0]
    48028098 = [0]
    4802809c = [fd]
    480280a0 = [0]
    480280a4 = [8000]
    480280a8 = [1]
    480280ac = [3ff]
    480280b0 = [1]
    480280b4 = [5a]
    480280b8 = [5a]
    480280bc = [e0]
    480280c0 = [8000]
    480280c4 = [0]
    480280c8 = [0]
    480280cc = [0]
    480280d0 = [0]
    好和不好没有区别。
    48181564 = [2] CM_ALWON_I2C_0_CLKCTRL clk使能,iic0使能
    48181428 = [102] CM_ALWON_SYSCLK6_CLKCTRL 上一级时钟使能
    48140400 = [380188] MAINPLL_CTRL 工作
    48140404 = [0] MAINPLL_PWD 供电单元使能没有问题

    在测试时发现,有时第一次上电也好用,有时不好用。还是怀疑那个寄存器可能没有初始化。不过我能想到的就是,时钟控制,电源控制,和iic模块本身寄存器,是否还有其他寄存器会影响iic的工作