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.

[参考译文] TDA4VEN-Q1:I2C 问题

Guru**** 2484615 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1435207/tda4ven-q1-i2c-issue

器件型号:TDA4VEN-Q1

工具与软件:

尊敬的专家

我已经在 MCU20和内核 DTS 上启用了 i2C0器件。

const i2c0       = i2c.addInstance();
i2c0.$name                      = "CONFIG_I2C0";
i2c0.useWakeupDomainPeripherals = false;
i2c0.bitRate                    = "400KHZ";
i2c0.I2C.$assign                = "I2C0";
i2c0.I2C.SCL.$suggestSolution               = "I2C0_SCL";
i2c0.I2C.SDA.$suggestSolution               = "I2C0_SDA";

&main_i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&main_i2c0_pins_default>;
	clock-frequency = <400000>;
	status = "okay";
	bootph-all;
...
}

即使我不使用 i2c0在 MCU20上进行任何读取或写入(只需在 syscfg 文件中对其进行设计)、在内核中使用 I2c0时 i2c 系统也会卡住。

root@j722s-evm:~# i2cdetect -y -r 1
-- [ 4087.100091] omap_i2c 20010000.i2c: controller timed out

这是一个数量的波形


如果未在 MCU20上启用 I2C0、则内核下可以正常使用 I2C0。
它似乎相互矛盾,这不是一种正常现象。 是否有解决方案?

谢谢。

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

    您好!

    我已将您的主题分配给相应的工程师、感谢您的耐心等待。

    谢谢!

    Neehar

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

    您好!

    我们不能让2个内核控制硬件中的同一个模块。 很高兴在其中一个内核中禁用、然后再尝试。

    -基尔西

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

    您好!

     我在 MCU 20上使用了 i2C0、它也应该能够正确关闭。

    所以不应该有冲突。

    此外、tad4veco 上不存在此类问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="545144" url="~/support/processors-group/processors/f/processors-forum/1435207/tda4ven-q1-i2c-issue/5510003 #5510003"]

    所以不应该有冲突。

    [报价]

    您可以在 MCU 侧启用和未启用 I2C 实例的情况下读取 I2C 寄存器的转储。 检查是否有东西关闭。

    此外:

    root@j722s-evm:~# i2cdetect -y -r 1.
    --[ 4087.100091] omap_i2c 2001000.i2c :控制器超时

    超时来自 I2C1:

    MAIN_i2c1:I2C@ 20010000
    兼容="ti、am64-i2c"、"ti、omap4-i2c";
    REG =<0x00 0x20010000 0x00 0x100>;
    中断= ;
    #address-cells =<1>;
    #size-cells =<0>;
    电源域=<&K3_PDS 103 TI_SCI_PD_Exclusive>;
    时钟=<&K3_CLKS 103 2>;
    时钟名称="FCK";
    状态="已禁用";
    };

    [报价用户 id="545144" url="~/support/processors-group/processors/f/processors-forum/1435207/tda4ven-q1-i2c-issue "] i2C0设备 o

    这是 i2c@20000000。 很多人都不是在 Linux 中寻找正确的实例。

    'dmesg | grep i2c'将提供正确的实例编号。

    -基尔西

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

    您好!  

    我应该检查哪些寄存器? 我对这些寄存器不是很熟悉。

    我使用 i2dect 检测总线1、因为我还启用了 wkup 的 i2c、因此总线0是 wkup 域的 i2c、总线1是 主域 i2c0。
    如果我关闭 wkup i2c、i2cdect 将使用总线0、结果相同。  它会卡住。

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

    您是否可以运行以下命令:

    'dmesg | grep i2c'

    共享输出。 这将确认哪个实例映射到 MAIN_I2C0。

    -基尔西

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

    您好!
    root@j722s-evm:~# dmesg | grep i2c
    [ 0.835517] i2c_dev:I2C /dev/entries 驱动程序
    [ 1.032942] omap_i2c 2b2000.i2c:400kHz 时的总线0 rev0.12
    [ 1.039804] omap_i2c 200000.i2c: 400kHz 时总线1版本0.12

    我还尝试了在 MCU 20上启用 i2c1、然后在内核下使用 i2cdetect 总线1、出现了相同的现象。 因此这不应与 i2c 直接相关。

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

    好的。 谢谢、根据 dmesg 实例"1"表示 MAIN_i2c0。 您可以在任何已知的从 ID 上尝试 i2cdump 吗?

    i2cdump -f -y 0x1 'slave_id'

    从 ID 可以是在 MAIN_i2c0上连接的任何器件。

    此致、

    基尔西  

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

    你(们)好

    感谢您的答复。 它还显示超时。

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

    您好!

    您可以转储 I2C_CLK 和 I2C_DATA 线路的 I2C 引脚多路复用器寄存器的值吗?

    例如:

    /delete-property/ interrupts;
    MAIN_i2c0_PINS_DEFAULT:MAIN-i2c0-DEFAULT-PINS{
    PINCTL-SINGLE、PINS =<
    J722S_IOPAD (0x01e0、PIN_INPUT_PULLUP、0)/*(D23) I2C0_SCL */
    J722S_IOPAD (0x01e4、PIN_INPUT_PULLUP、0)/*(B22) I2C0_SDA */
    >;
    引导全部;
    };

    -基尔西

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

    你(们)好

    是、   

    引脚:B22 和 引脚:D23

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

    Pinmux 设置看起来正常。 我会自行在 EVM 上试用、然后直接与您联系。

    -基尔西

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

    从 Linux SDK 中默认、我能够访问 MAIN_i2c0从设备 ID 0x48寄存器。

    MAIN_i2c0控制器寄存器从0x20000000开始。 工作时和不工作时都值得对寄存器空间进行比较。

    此致、

    基尔西  

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

    您好、Keerthy

    SDK 默认不在 MCU 20上启用 MAIN_i2C0、
    如果 在内核启动后也在 MCU20下启用了该功能、则在内核启动后使用 i2cdetect 会出现问题。 您可以尝试一下。

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

    您好!

    请求检查0x20000000 - 0x200000D4之间的寄存器值。 启用和不启用 MCU20。

    -基尔西

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

    您好!

    我已打印了相关寄存器的所有值、它们之间存在差异
    我不确定哪一个会产生影响。   即使用 OK 值覆盖它、也无法恢复  正常。

    NG:

    e2e.ti.com/.../ng.log

    确定:

    e2e.ti.com/.../4274.ok.log

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

    谢谢转储。 我将对其进行分析、下周早些时候会回来。

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

    我非常感谢您的帮助。 谢谢、  此致。

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

    您好!

    [16-19-27.868]/dev/mem opened. [16-09-07.875]/dev/mem 打开。
    [16-19-27.871]存储器映射到地址0xffaae13000。 [16-09-07.877]Memory mapped at address 0xffbdab7000.
    [16-19-27.876]在地址0x20000088 (0xFFFAAE13088)处读取: 0x00000100

    总线空闲 IRQ 状态在不工作日志中设置。

    您是否可以在 Linux 中在没有 I2C Init 的情况下尝试相同操作? 基本上禁用 Linux i2c1节点并尝试。

    -基尔西

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

    您好!

    是的、我在 DTS 中关闭了 MAIN_i2C0并执行相同的操作

    &main_i2c0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_i2c0_pins_default>;
    	clock-frequency = <400000>;
    	status = "disabled";
    ......
    }

    无 i2c、在 mcu20中启用。

    e2e.ti.com/.../no_5F00_i2c1_5F00_ng.log

    没有 i2c、在 mcu20中不启用。

    e2e.ti.com/.../no_5F00_i2c1_5F00_ok.log

    它在 0x20000088中显示相同的 diff  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="545144" url="~/support/processors-group/processors/f/processors-forum/1435207/tda4ven-q1-i2c-issue/5510003 #5510003"]

     我在 MCU 20上使用了 i2C0、它也应该能够正确关闭。

    [报价]

    那么、您何时从 MCU2_0访问 I2C0以及何时从 MCU2_0关闭?

    如果在 Linux 探测之后发生关闭、则 Linux 可能会开启但 I2C 关闭。
    您是否可以在 MCU2_0中禁用关闭?

    -基尔西

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

    您好!

    我刚刚在系统文件中定义了它、没有 在 MCU20中调用任何读写函数、也无法在内核中访问它。

    您要使用哪个 API 来打开和关闭 i2C0器件?

    另外、我提到了 RTOS 的 SDK 函数、似乎没有关闭 i2c、而只将句柄分配为空。

    我的 SDK 版本是10.0、您需要的 SDK 版本是什么。  

    ti-processor-sdk-linux-adas-j722s-evm-10_00_00_08-Linux-x86-Install.bin  

    ti-processor-sdk-rtos-j722s-evm-10_00_00_05.tar.gz 

    非常感谢您的答复。

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

    您好!

    我咨询了我们的 I2C 专家。 建议从一个内核中严格使用该函数。 因为一切都取决于每个内核访问的方式。
    如果 MCU2_0在 Linux 之前必须使用、则它必须在使用后完全关闭、Linux 应重新初始化它。 否则、行为不能
    预测的输出。

    -基尔西