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.

[参考译文] PROCESSOR-SDK-AM64X:器件树中的三线 SPI 配置

Guru**** 2390755 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1493014/processor-sdk-am64x-3-wire-spi-configuration-in-devicetree

器件型号:PROCESSOR-SDK-AM64X

工具/软件:

您好 TI 专家、

我在电路板启动过程中遇到问题。 我正在使用 AM64x EVM 套件和 AD9707 EVM 套件。 我已在另一个器件上成功配置并测试了4线 SPI 通信。 然而、AD9707专门支持3线 SPI 模式。

为了启用3线 SPI、我添加了 SPI-3Wire 属性中删除。 然而、加载编译的 dtb 文件后、我遇到一个错误、指示模式不受支持。 还尝试修改另一个属性( TI、pindir-d0-out-D1-in ),我修改它像这样( TI、pindir-d0-out-d0-in )。 我想确认这家酒店是否有效,或者您能给我建议其他选择吗?

感谢您帮助我正确配置器件以在3线 SPI 模式下运行。

谢谢、
Vraj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    要启用3线制 SPI、我添加了 SPI-3Wire 属性中删除。 然而、加载编译的 dtb 文件后、我遇到一个错误、指示模式不受支持。 [/报价]

    驱动程序当前不支持该驱动程序、下面提供了更多背景信息(不同的器件、但 SPI 外设模块相同): https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1414155/processor-sdk-am335x-support-spi-3-wire/5449211#5449211

    如果不担心速度、您还可以按照以上文章中的建议使用内核中基于位移的 SPI 驱动程序;我认为、这种驱动程序应该支持3线模式。

    此外、像您使用的外部数据转换器通常支持 SPI 和 I2C 接口;因此、您可以考虑使用 I2C 而不是 SPI 来确保器件正常工作。 但是、您使用的器件似乎不支持 I2C、因此无法使用。 但您或许可以考虑其他具有更"友好型"SPI 接口的器件。

    此致、Andreas

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

    感谢您的及时回复。

    您能否提出启用和使用基于逐位运算的 SPI 驱动程序的步骤? 非常希望参考任何示例。

    此致、

    Vraj

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

    您将需要使用重新配置并重新编译内核  CONFIG_SPI_BITBANG 被启用。 SDK 文档提供了有关如何执行该操作的步骤。 然后、您将需要一个相应的设备树节点、其中描述了您的接口以及相关的引脚(您将在其 GPIO 功能中使用 SPI 引脚)。 只需搜索内核树以获取现有支持、就可以找到所有这些示例。 如果你不明白,我可以提供一些更多的指导下周,当我回到办公室.

    此致、Andreas

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

    我已成功启用 CONFIG_SPI_BITBANG 和 CONFIG_SPI_GPIO 驱动程序并将映像加载到目标板中。

    您能否提供有关如何在实际 C 文件中实现此驱动程序的任何参考示例建议? 我修改了器件树、如下所示:

    SPI1_GPIO:SPI1_GPIO@0{
    状态="正常";
    兼容="SPI-GPIO";
    pinctrl-names ="default";
    pinctrl-0 =<&MAIN_SPI1_pins_default>;
    SCK-GPIO =<&MAIN_GPIO1 49 0>;
    MOSI GPIO =<&MAIN_GPIO1 45 0>;
    MISO-GPIO =<&MAIN_GPIO1 46 0>;
    CS-GPIOs =<&MAIN_GPIO1 42 0>;
    TI、spi-num-chipselects =<1>;
    spidev@0{
    SPI-max-frequency =<10000>;
    reg =<0>;
    compatible ="Rohm、dh2228fv";
    SPI-cs-低电平;
    };

    };


    MAIN_SPI1_PINS_DEFAULT:main-SPI1-default-pins{
    pinctrl-single、pins =<
    AM64X_IOPAD (0x0224、PIN_OUTPUT_PULLUP、7)/*(C14) SPI1_CLK、GPIO1_49 *
    AM64X_IOPAD (0x0220、PIN_OUTPUT_PULLUP、7)/*(D14) SPI1_CS1、GPIO1_43 *
    AM64X_IOPAD (0x021C、PIN_OUTPUT_PULLUP、7)/*(B14) SPI1_CS0、GPIO1_42 *
    AM64X_IOPAD (0x0228、PIN_OUTPUT、7)/*(B15) SPI1_D0、GPIO1_45 *
    AM64X_IOPAD (0x022C、PIN_INPUT_PULLUP、7)/*(A15) SPI1_D1、GPIO1_46 */
    >;
    };


    您是否还可以验证我是否正确修改了器件树?

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

    您好、

    希望您做得好。
    您是否有关于此查询的任何更新?
    由于您在过去几天外出、我们尝试了几件事情、现在根据我们的调查结果还有一些其他问题。
    我们的 SPI 位移驱动器成功地用于4线配置、我们能够对其进行测试。 以下是我们当前的 DTS 配置:

    "
        SPI1_GPIO:SPI1_GPIO@0{
            状态="正常";
            兼容="SPI-GPIO";
            pinctrl-names ="default";
            pinctrl-0 =<&MAIN_SPI1_pins_default>;
            SCK-GPIO =<&MAIN_GPIO1 49 0>;
            MOSI GPIO =<&MAIN_GPIO1 50 0>;
            MISO-GPIO =<&MAIN_GPIO1 51 0>;
            CS-GPIOs =<&MAIN_GPIO1 47 0>;
            数字片选信号=<1>;
            spidev@0{
                SPI-max-frequency =< 1000>;
                reg =<0>;
                compatible ="Rohm、dh2228fv";
            };

        };
    "

    对于3线配置、我们注释了 MISO-GPIO 线路并测试了 C 应用、但未成功。
    从波形可以看出、MOSI 线路上接收到数据。 但是、由于我们注释掉了 MISO 行、因此 C 应用中的 rx_buf 保持为空。
    您能否介绍一下三线制 SPI 协议的正确 DTS 配置? 此外、是否需要对 C 应用进行任何修改才能正确测试3线通信?
    我们还尝试在 C 应用中将 SPI 模式更改为 SPI_3Wire、但在本例中、我们观察到 MOSI 线路上没有数据、并且时钟信号也不存在。
    期待您的见解。

    此致、
    Vraj

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

    尊敬的 Vraj:

    很高兴看到您正在取得一些进展。

    对于3线配置、我们注释了 MISO-GPIO 行并测试了我们的 C 应用程序、但失败了。

    对于此场景、您是否还添加了  SPI-3Wire 有什么价值?

      请在此处查看此示例:git.ti.com/.../ste-nomadik-nhk15.dts

    此致、Andreas

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

    您好、

    是的,我们也在 DTS 文件中尝试过这个属性。 当我们使用 SPI-3Wire 属性测试 C 应用时、我们没有在逻辑分析仪中获得任何波形。
    但当我们使用 echo 命令"echo -ne "\x80\x00">/dev/spidev1.0测试相同的结果时、我们在逻辑分析仪中看到了 MISO 线路上的波形。
    您能为我们提供有关 C 应用的帮助吗?C 文件中应该包含什么内容来测试3线 SPI?

    我将在下面附上 C 文件和 DTS 修改内容。

    e2e.ti.com/.../dac_5F00_spi_5F00_test.c

    DTS:

    SPI1_GPIO:SPI1_GPIO@0{
         状态="正常";
         兼容="SPI-GPIO";
         pinctrl-names ="default";
         pinctrl-0 =<&MAIN_SPI1_pins_default>;
         SCK-GPIO =<&MAIN_GPIO1 49 0>;
         MOSI GPIO =<&MAIN_GPIO1 50 0>;
         /* MISO-GPIO =<&MAIN_GPIO1 51 0>;*/
         CS-GPIOs =<&MAIN_GPIO1 47 0>;
         数字片选信号=<1>;
         spidev@0{
             SPI-max-frequency =< 1000>;
             reg =<0>;
             SPI-3Wire;
             compatible ="Rohm、dh2228fv";
         };
    };

    我使用相同的 DTS 文件测试了多个组合、我在其中注释了 MISO 行并添加了3线属性。
    1.在我上面分享的 C 应用中、我将 SPI 模式保留为"SPI_MODE0"并运行 C 应用。
    观察:数据出现在逻辑分析仪的 MOSI 行上、但 rx_buf 保持空。 从逻辑分析仪连接捕获图像。


    2.在我上面分享的 C 应用程序中、我将 SPI 模式保留为"SPI_3Wire"并运行 C 应用程序。
    观察:在任何行上都看不到数据。 从逻辑分析仪连接捕获图像。


    3. echo 命令"echo -ne "\x80\x00">/dev/spidev1.0
    观察结果:在逻辑分析仪的 MOSI 线路上看到数据。 但在这种情况下、如何验证 rx_data、我们从哪里可以获取 Rx 数据? 从逻辑分析仪连接捕获图像。

    如何使 SPI-3线正常工作?


    此致、

    Vraj

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

    Vraj、

    但当我们使用 echo 命令"echo -ne "\x80\x00">/dev/spidev1.0测试相同时、我们在逻辑分析仪的 MISO 线路上看到了波形。
    您能否帮助我们了解 C 应用、我们的 C 文件中应该包含什么内容来测试3线 SPI?

    应使用内核树的 SPI 测试示例应用程序部分作为起点、例如 spidev_test 、请参阅: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/tools/spi?h=ti-linux-6.6.y  我们不支持调试您在我们的 E2E 论坛支持上下文中创建的任何自定义用户空间应用程序。

    main_SPI1_pins_default:main-SPI1-default-pins{
    pinctrl-single、pins =<
    AM64X_IOPAD (0x0224、PIN_OUTPUT_PULLUP、7)/*(C14) SPI1_CLK、GPIO1_49 *
    AM64X_IOPAD (0x0220、PIN_OUTPUT_PULLUP、7)/*(D14) SPI1_CS1、GPIO1_43 *
    AM64X_IOPAD (0x021C、PIN_OUTPUT_PULLUP、7)/*(B14) SPI1_CS0、GPIO1_42 *
    AM64X_IOPAD (0x0228、PIN_OUTPUT、7)/*(B15) SPI1_D0、GPIO1_45 *
    AM64X_IOPAD (0x022C、PIN_INPUT_PULLUP、7)/*(A15) SPI1_D1、GPIO1_46 */
    >;
    };
    [/报价]

    还可以尝试将所有这些引脚配置为  PIN_INPUT 、这可以确保输入信号路径已启用、并且对于 SPI 模块正常运行非常重要(我们所有由 SysConfig 生成的 padconfig 数据都是这样的、并且器件 TRM 中也有一条关于这一点的注释)。 请注意、实际引脚方向将由使用引脚的模块(例如 SPI 硬件模块或 GPIO 模块)决定、因此即使使用 PIN_INPUT、该引脚也可以用作输出(我知道可能听起来令人困惑)。

    此致、Andreas

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


    您好、

    我们可以了解您对个人自定义设置的限制。 您能否为 spidev_test 应用程序提供支持?


    我们尝试使用 spidev_test 应用程序测试 SPI 3线模式。
    在当前器件树中、我们已启用 SPI-GPIO 和 SPI-3Wire 属性。
    要在 spidev_test 中激活3线模式、我们传递了"-3 "参数。 但是、根据错误日志、spidev_test 似乎无法设置3线模式。

    下面是我们使用的命令:

    root@am64xx-EVM:~/spi#./spidev -D /dev/spidev1.0 -3 -p "\x80\x00"

    输出:
    SPI 模式:0x10
    每个字的位数:8
    最大速度:500000 Hz (500 kHz)
    无法发送 SPI 消息:WENVALID 参数
    [1359.521005] audit: type=1701 audit(1743761242.204:68):auid=4294967295 uid=0 gid=0 ses=4294967295 subj=kernel pid=1519 comm="spidev" exe"/root/spi/spidev sig =6 res=1
    [1359.560629] audit: type=1334 audit(1743761242.244:69): prog-id=41 op=load
    [1359.567631] audit: type=1334 audit(1743761242.252:70): prog-id=42 op=load
    [1359.575367] audit: type=1334 audit(1743761242.260:71):prog-id=43 op=load
    已中止(核心已转储)


    如果我们通过删除 SPI-3Wire 和 SPI-GPIO 属性来修改器件树、并改用标准 SPI 驱动程序、我们会观察到以下行为:

    root@am64xx-EVM:~/spi#./spidev -D /dev/spidev1.0 -3 -p "\x80\x00"

    输出:

    [101.130252] spidev spi1.0:设置:不支持的模式位10.
    无法设置 SPI 模式:Wenvalid 参数
    [ 101.136426] kauditd_printk_skb:5个回调被抑制
    [101.136444]审计:type=1701审计(1743761437.082:19):auid=4294967295 uid=0 gid=0 ses=4294967295 subj=kernel pid=984 comm="spidev" exe"/root/spi/spidev sig =6 res=1
    [ 101.209657]审计:type=1334审计(1743761437.154:20):prog-id=20 op=load
    [101.217553] audit: type=1334 audit(1743761437.162:21):prog-id=21 op=load
    [101.225534]审计:type=1334审计(1743761437.162:22):prog-id=22 op=load
    已中止(核心已转储)

    您能否为使用 spidev_test 应用程序测试 SPI-三线 制协议提供指导?

    此致、

    Vraj

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

    Andreas、

    我们对此主题有任何更新吗?

    此致、

    Vraj

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

    尊敬的 Vraj:

    `sπ 型 GPIO.c`驱动器支持3线模式、该代码中的多个3线 SPI 模式基准(SPI_3Wire*)就可以明显看出这一点、因此我认为问题在于该驱动器的配置或使用方式。

    您能否按如下所示更新`spidev_test.c`应用、以便仅发送和不同时接收、看看这是否有区别。

    $ git diff
    diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
    index f2135d619a0b..ba59bf9f5510 100644
    --- a/tools/spi/spidev_test.c
    +++ b/tools/spi/spidev_test.c
    @@ -352,7 +352,7 @@ static void transfer_escaped_string(int fd, char *str)
                    pabort("can't allocate rx buffer");
    
            size = unescape((char *)tx, str, size);
    -       transfer(fd, tx, rx, size);
    +       transfer(fd, tx, NULL, size);
            free(rx);
            free(tx);
     }

    此致、Andreas