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.

[参考译文] AM623:I2C 占空比不符合 TRM

Guru**** 2364370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1506194/am623-i2c-duty-cycle-doesn-t-follow-trm

器件型号:AM623

工具/软件:

根据 TRM、在400kHz 快速模式下、SCLL=7、SCLH=5、但读回寄存器 SCLL=9、SCLH=3。 开发 SDK。

而 标准100KHz 配置与 TRM 相同。

在 SDK11.0中、还将 I2C2配置为具有错误值的快速模式。
Root@am62xx-EVM:~# devmem2 0x200000b4
/dev/mem 已打开。
映射到地址0xffffa9b3000的存储器。
读取地址0x200000B4 (0xffffa9bb30b4):0x00000009
Root@am62xx-EVM:~# devmem2 0x200100b4
/dev/mem 已打开。
映射到地址0xff89f3d000的存储器。
读取地址0x200100B4 (0xff89f3d0b4):0x0000000D
Root@am62xx-EVM:~# devmem2 0x200200b4
/dev/mem 已打开。
地址0xffffbef3a000映射的存储器。
在地址0x200200B4 (0xffffbef3a0b4)处读取:0x00000009
Root@am62xx-EVM:~#
Root@am62xx-EVM:~# devmem2 0x200000b8
/dev/mem 已打开。
存储器映射到地址0xffffb340d000。
读取地址0x200000B8 (0xffb340d0b8):0x00000003
Root@am62xx-EVM:~# devmem2 0x200100b8
/dev/mem 已打开。
存储器映射到地址0xffff840d5000。
读取地址0x200100B8 (0xffff840d50b8):0x0000000F
Root@am62xx-EVM:~# devmem2 0x200200b8
/dev/mem 已打开。
0xffffb30b8000映射的存储器。
读取地址0x200200B8 (0xffffb30b80b8):0x00000003
Root@am62xx-EVM:~#

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tony、

    是否存在导致客户开始查看 I2C 时钟设置的特定行为?

    我们能让您或客户用示波器捕获 I2C 波形并进行测量吗
    1)输出的实际频率(请检查多个脉冲,而不仅仅是一个)
    2)脉冲的高部分的宽度与脉冲的低部分的宽度是多少?

    请提供有关这是否是 TI EVM、EVM 的哪个修订版本、正在测量哪个 I2C 端口等的信息

    我们实际上正在调试实际测量的 I2C 频率与另一个客户的 SCLL/SCLH 设置之间的关系(有时、可能会有一个额外的时钟或几个时钟添加到脉冲的低电平或高电平部分、使时钟脉冲略长于400kHz 时钟)。 我们仍处于调查过程的早期阶段、因此最好从您这边得到另一个数据点。

    其他想法  

    I2C 时钟的脉冲宽度基于脉冲低电平部分(SCLL)的时钟周期数、以及脉冲高电平部分的时钟周期数(SCLH)。 7 + 5 = 12且9 + 3 = 12、因此从理论上讲、我们应该仍然看到使用观察到的设置的400kHz 时钟。 时钟的低部分将远远长于时钟的高部分。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    离线发送

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tony、

    感谢您离线发送问题和波形。

    摘要  

    您发送的波形确认代码的行为完全符合我们的预期。

    这个9/3的 SCLL/SCLH 值来自哪里?  

    这是 I2C 驱动程序中用于进行计算的部分。 我添加了注释以显示相关的数学计算:

    drivers/i2c/buss$ vi i2c-OMAP-Lc

    static int omap_i2c_init(struct omap_i2c_dev *omap)
    {
    …
        else if (omap->speed > 100)
                            internal_clk = 9600;
    …
        else if (omap->speed > 100) {
                            unsigned long scl;
    
                            /* Fast mode */
                            scl = internal_clk / omap->speed; // 9600 / 400 = 24
                            fsscll = scl - (scl / 3) - 7; // 24 – (24/3) – 7 = 24 -15 = 9
                            fssclh = (scl / 3) - 5; // (24/3)-5 = 8 -5 = 3
    

    下面是提交消息、其中所有数学运算都是在2009年添加的:
    https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/drivers/i2c/busses/i2c-omap.c?h=v6.12.25&id=baf46b4e378d7950dff7ba30cfd50ff585987cb4

    一个简短的侧面故事  

    现在等待一分钟、该提交适用于 OMAP2/3、而不是 AM335x。 这是由诺基亚的人写的... 这是怎么回事?

    i2c-OMAP 驱动程序最初是为名为 OMAP1的处理器编写的。 我们采用了相同的 I2C 电路设计、做了一些细微更改、并对 OMAP2、3、4、5和 AM335x 使用了相同的 I2C 电路设计、 AM437x 等、可以一直到 AM62x。 每次推出使用相同 I2C 设计的新处理器时、Linux 社区都会更新 i2c-OMAP 驱动程序、使其可用于新处理器。 该代码大部分实际上来自 TI 以外的 Linux 社区成员。 许多 Linux 驱动程序都是这样的-仅仅因为 TI 生产了处理器、并不意味着我们控制有关 Linux 驱动程序的所有内容。

    因此、尽管此代码最初是为较旧的处理器编写的、但它应该仍能在 AM62x 上运行。 我们可以使用您发送给我的波形仔细检查它。

    好的、我们仔细检查一下代码是否正常工作  

    如果提交中的数学运算是正确的、我们期望看到
    tLOW =(scll + 7)* internal_clk =(9 + 7)* 9,600,000 Hz = 16 / 9,600,000 = 1.667usec
    THIGH =(sclh + 5)* internal_clk =(3 + 5)* 9600000Hz = 8 / 9,600,000 = 833nsec

     您与我共享的波形的平均宽度匹配:
    平均低宽度为1.6795us、平均高宽度为658ns。 OMAP2/3的公式仍然适用于 AM62x。

    在我看来、上升时间是否在20ns 至300ns 的 I2C 规格范围内。 但是、如果您希望我们的某个团队成员发表评论、我可以将该线程重新分配给硬件团队的成员。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    非常感谢您对历史的清晰解释。

    尽管寄存器配置不遵循 TRM、但波形仍符合 I2C 标准要求、因此适用于 AM62x。

    但客户认为裕度不足、 是否建议更新为 TRM 值?  

    许多 Linux 驱动程序都是这样的-只是因为 TI 生产了处理器、并不意味着我们控制有关 Linux 驱动程序的所有内容。

    TI 应维护特定于器件的驱动程序、您认为 是否需要就此提交 Jira 文件?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tony、

    7/5比9/3好吗?

    如果我们切换到使用 TRM 建议、则我期望波形如所示
    tLOW =(scll + 7)* internal_clk =(7 + 7)* 9,600,000 Hz = 14 / 9,600,000 = 1.46usec
    THIGH =(sclh + 5)* internal_clk =(5 + 5)* 9,600,000 Hz = 10 / 9,600,000 = 1.04usec

    因此、这两种组合都符合 I2C 规格。 我与硬件所有者再次确认、他们认为客户不应该使用其中一个。 如果客户更喜欢使用7和5、他们可以修改其 I2C 驱动程序代码。

    我们是否需要针对 I2C 驱动程序提交错误?  

    编号 驱动程序的运行方式没有任何问题。 这是 Linux 社区的好处之一,如果世界上的其他人发现了一个错误,他们可以为我们解决它。 这也意味着社区的其他部分有助于测试和维护我们使用的代码。 如果您愿意、我们可以离线聊天。

    此致、

    Nick