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.

[参考译文] SK-AM62A-LP:[SDK 10.00.00]分配给 MOSI 和 MISO 的 SPI D0和 D1引脚

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1437392/sk-am62a-lp-sdk-10-00-00-spi-d0-and-d1-pins-assigned-to-mosi-and-miso

器件型号:SK-AM62A-LP
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我尝试在 Linux 中将 SPI0用作主设备。 我 相应地更新了 DTS 以分配所需的引脚。

您可以在下面找到 DTS 文件的更改:

MAIN_spi0_PINS_DEFAULT:main-spi0-default-pins{
PINCTL-SINGLE、PINS =<
AM62AX_IOPAD (0x1c0、PIN_OUTPUT、0)/*(B15) SPI0_D0 */
AM62AX_IOPAD (0x1c4、PIN_INPUT、0)/*(E15) SPI0_D1 */
AM62AX_IOPAD (0x1b4、PIN_OUTPUT、0)/*(D16) SPI0_CS0 */
AM62AX_IOPAD (0x1bc、PIN_OUTPUT、0)/*(A17) SPI0_CLK */
>;
};

MAIN_spi0{
pinctrl-names ="默认值";
pinctrl-0 =<&MAIN_spi0_PINS_DEFAULT>;
状态="正常";
spidev@0{
spi-max-Frequency =<24000000>;
REG =<0>;
Compatible ="Rohm、dh2228fv";
};
};

我尝试使用  ./tools/spi 中的测试应用程序对其进行测试

此处的问题是如何识别 D0是分配给 MOSI 还是 MISO?

我期望将 D0分配给 MOSI、将 D1分配给 MISO。

但实际的行为是通过引脚 SPI0_D1发送的数据、这意味着它用作 MOSI

如何识别引脚/将引脚分配给 MOSI 和 MISO?

另一个问题、如果我想使用 spidev 作为从设备测试 SPI0、该怎么办?

谢谢!

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

    尊敬的 Ramy:

    [报价用户 id="622335" url="~/support/processors-group/processors/f/processors-forum/1437392/sk-am62a-lp-sdk-10-00-00-spi-d0-and-d1-pins-assigned-to-mosi-and-miso "]

    此处的问题是如何识别 D0是分配给 MOSI 还是 MISO?

    我期望将 D0分配给 MOSI、将 D1分配给 MISO。

    [报价]

    默认情况下、D0为 MISO、D1为 MOSI。 有一个名为的设备树属性  ti、windir-d0-out-D1-in 这会反转默认顺序。 查找关联的设备树节点绑定文档总是有助于记住以下内容:

    a0797059@jiji:~/git/linux (master)
    $ git grep -A 5 ti,pindir-d0-out-d1-in\:
    Documentation/devicetree/bindings/spi/omap-spi.yaml:  ti,pindir-d0-out-d1-in:
    Documentation/devicetree/bindings/spi/omap-spi.yaml-    description:
    Documentation/devicetree/bindings/spi/omap-spi.yaml-      Select the D0 pin as output and D1 as input. The default is D0
    Documentation/devicetree/bindings/spi/omap-spi.yaml-      as input and D1 as output.
    Documentation/devicetree/bindings/spi/omap-spi.yaml-    type: boolean
    Documentation/devicetree/bindings/spi/omap-spi.yaml-

    另一个问题、如果我想使用 spidev 作为从设备测试 SPI0该怎么办?

    我们正式不支持通过 Linux SDK/驱动程序运行 SPI 从器件。 虽然有一些方法可以使它工作、但有一些限制、你最好使用不同的通信方案(例如高速 UART、但这实际上取决于你的系统)。

    此致、Andreas

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

    尊敬的 Andreas:

    感谢您的快速响应。

    添加 设备树属性 ti、windir-d0-out-D1-in 反转了引脚。

    关于 SPI 从器件、我知道官方不支持、但您是否了解需要进行哪些更改才能让 SPI 作为从器件运行?

    此致、

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

    尊敬的 Ramy:

    关于 SPI 从器件、我得到官方不支持、但您是否有关于 SPI 作为从器件运行需要进行哪些更改的指南/手册/步骤?

    本质上、您需要将与 DMA 相关的属性(dmasdma-names)添加到设备树节点、然后也添加 spi-slave到 SPI 外围设备树节点、如下所示:

    $ git show
    commit 30253dd73e444c451cf352b2b005d32e03b080be (HEAD -> ti-linux-6.6.y-spi-slave-dev)
    Author: Andreas Dannenberg <dannenberg@ti.com>
    Date:   Wed Nov 13 15:15:04 2024 -0600
    
        arm64: dts: ti: k3-am62a: Configure SPI0 as Slave-Mode spidev Device
    
        Note that the SPI Slave in Linux doesn’t implement flow-control by default
        and custom flow control mechanism need to be implemented according to the
        application for deterministic performance.
    
        Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
    
    diff --git a/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts b/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts
    index 3047586a6d9d..b582f08d1fe1 100644
    --- a/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts
    +++ b/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts
    @@ -451,6 +451,15 @@ AM62AX_IOPAD(0x028, PIN_INPUT, 0) /* (J22) OSPI0_D7 */
                            AM62AX_IOPAD(0x008, PIN_INPUT, 0) /* (J24) OSPI0_DQS */
                    >;
            };
    +
    +       main_spi0_pins_default: main-spi-pins-default {
    +               pinctrl-single,pins = <
    +                       AM62AX_IOPAD(0x01bc, PIN_INPUT, 0) /* (A17) SPI0_CLK */
    +                       AM62AX_IOPAD(0x01b4, PIN_INPUT, 0) /* (D16) SPI0_CS0 */
    +                       AM62AX_IOPAD(0x01c0, PIN_INPUT, 0) /* (B15) SPI0_D0 */
    +                       AM62AX_IOPAD(0x01c4, PIN_INPUT, 0) /* (E15) SPI0_D1 */
    +               >;
    +       };
     };
    
     &mcu_pmx0 {
    @@ -944,3 +953,25 @@ partition@7fc0000 {
                    };
            };
     };
    +
    +&main_spi0 {
    +               status = "okay";
    +               #address-cells = <0>;
    +               #size-cells = <0>;
    +               pinctrl-names = "default";
    +               pinctrl-0 = <&main_spi0_pins_default>;
    +               ti,pindir-d0-out-d1-in = <1>;
    +               spi-slave;
    +               dmas = <&main_pktdma 0xc300 0>, <&main_pktdma 0x4300 0>;
    +               dma-names = "tx0", "rx0";
    +
    +               slave {
    +                               /*
    +                                * Using spidev compatible is warned loudly,
    +                                * thus use another equivalent compatible id
    +                                * from spidev.
    +                                */
    +                               compatible = "rohm,dh2228fv";
    +                               spi-max-frequency = <24000000>;
    +               };
    +};

    然后、当您引导时、您可以在此处找到从设备:

    root@am62axx-evm:/opt/edgeai-gst-apps# ls -al /dev/spi*
    crw------- 1 root root 153, 0 Jan  1 00:00 /dev/spidev1.0
    
    root@am62axx-evm:/opt/edgeai-gst-apps# ls -al /sys/class/spi_slave/
    total 0
    drwxr-xr-x  2 root root 0 Jan  1 00:08 .
    drwxr-xr-x 81 root root 0 Jan  1 00:08 ..
    lrwxrwxrwx  1 root root 0 Jan  1 00:08 spi1 -> ../../devices/platform/bus@f0000/20100000.spi/spi_slave/spi1

    然后,你应该能够尝试它像这样使用spidev_test. 在本例中、它会挂起、因为我没有任何东西在数据中计时...

    root@am62axx-evm:/opt/edgeai-gst-apps# ./spidev_test -D /dev/spidev1.0 -v -p "12345678"
    spi mode: 0x0
    bits per word: 8
    max speed: 500000 Hz (500 kHz)

    以下是一些适用的 E2E 主题以及其他可能有用的信息:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1262607/am3351-linux-support-for-spi-as-a-slave-device/4780250

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1301459/tda4al-q1-regarding-mcu-spi-slave-mode-configuration-issues

    如果您能让它发挥作用、请告诉我;如果您能分享您的发现、这对每个人都很有帮助。

    谢谢、Andreas

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

    尊敬的 Andreas:

    感谢您的支持。

    现在我已经设法使用了 MAIN_SPI0 A 从机 成功完成以下步骤后。

    但我有2个问题:

    1. 它观察到了 数据被翻转 ( 使用 MSB )、所以我尝试使用 -L 使用的选项 LSB 、但正如您在上面的图像中所看到的、数据未正确解析、甚至在 LSB 中也未解析。 什么原因可能导致此类问题?
    2. 为何两者兼而有之 D0和 D1配置为输入 ? 我想我们应该设置 D0 最终目的 输出 分配的电压  MISO .

    此致。

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

    尊敬的 Ramy:

    据观察 数据被翻转 ( 使用 MSB )、所以我尝试使用 -L 使用的选项 LSB 、但正如您在上面的图像中所看到的、数据未正确解析、甚至在 LSB 中也未解析。 什么可能导致此类问题?

    我不完全了解您的系统设置以及您提供的屏幕截图中的预期内容、但一般而言、这也可能是由于所使用的时钟/相位设置不合适。 当我在之前查看这个时、我发现唯一能够根据(时钟)信号的初始状态等使用的特定组合 例如、我必须使用`-H`参数(时钟相位)才能使其正常工作。

    以下是一个通过外部已知良好的 SPI 主机适配器演示从模式的有效示例(调试时务必解决此问题): https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1397539/processor-sdk-am335x-how-to-configure-spi-master-slave-mode-with-sdk9/5366588#5366588 也请注意其中使用的时钟/相位设置。

    为什么两者皆如此 D0和 D1配置为输入 ? 我想我们应该设置 D0 最终目的 输出 分配的电压  MISO .

    pinctrl-single,pins器件树 设置会影响 padcontrol 寄存器、其中包含用于配置每个引脚行为的长列表的不同位。 将其设置为输入实际上只需使用 DTS 宏打开该引脚上的发送器和接收器功能;因此、无论您按照前面的讨论反转 D0与 D1、这些 SPI 引脚都可以安全地工作。 实际的输入/输出行为将由选择的外设模块控制、在本例中为 SPI 模块。

    请注意、有趣的是、为了使器件正常工作、一些输出引脚实际上需要从器件树/焊盘控制寄存器角度配置为"输入"、请参阅 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1263441/sk-am62-no-spi-signals-on-expansion-headers/4784405#4784405

    最好遵循已在 DTS 中使用或使用 SysConfig 工具生成的引脚方向定义。

    此致、Andreas

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

    尊敬的 Andreas:

    感谢您的持续支持。

    我确认时钟/相位设置正确并且已经使用了-H 参数。 我之前说过、数据以 最高有效   位格式而不是最低有效位格式表示。 我曾尝试使用-L 选项、但失败了。

    实际上、我还要进行另一说明、除了要使用的引脚、我是否需要更改任何其他内容 将 SPI2作为从器件工作。

    例如、与 DMA 相关的任何更改?

    下面随附了 DTS 更改。

    	main_spi0_pins_default: main-spi0-default-pins {
    		pinctrl-single,pins = <
    			AM62AX_IOPAD(0x1c0, PIN_INPUT, 0) /* (B15) SPI0_D0 */
    			AM62AX_IOPAD(0x1c4, PIN_OUTPUT, 0) /* (E15) SPI0_D1 */
    			AM62AX_IOPAD(0x1b4, PIN_OUTPUT, 0) /* (D16) SPI0_CS0 */
    			AM62AX_IOPAD(0x1bc, PIN_OUTPUT, 0) /* (A17) SPI0_CLK */
    		>;
    	};
    		main_spi2_pins_default: main-spi2-default-pins {
    		pinctrl-single,pins = <
    			AM62AX_IOPAD(0x194, PIN_OUTPUT, 1) /* (C19) SPI2_D0 */
    			AM62AX_IOPAD(0x198, PIN_INPUT, 1) /* (B19) SPI2_D1 */
    			AM62AX_IOPAD(0x1ac, PIN_INPUT, 1) /* (B21) SPI2_CS 0x1ac or A19 0x1A4*/
    			AM62AX_IOPAD(0x1b0, PIN_INPUT, 1) /* (A21) SPI2_CLK */
    		>;
    	};
    	
    	
    &main_spi0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_spi0_pins_default>;
        status = "okay";
    	spidev@0 {
                    spi-max-frequency = <24000000>;
                    reg = <0>;
                    compatible = "rohm,dh2228fv";
            };
    };
    
    &main_spi2 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_spi2_pins_default>;
        status = "okay";
    	ti,pindir-d0-out-d1-in;
    	spi-slave;
    	dmas = <&main_pktdma 0xc300 0>, <&main_pktdma 0x4300 0>;
    	dma-names = "tx0", "rx0";	
    
    	slave {
                    spi-max-frequency = <24000000>;
                    compatible = "rohm,dh2228fv";
            };
    
    	spidev@0 {
                    spi-max-frequency = <24000000>;
                    reg = <0>;
                    compatible = "rohm,dh2228fv";
            };
    };

    此致、

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

    另一点,我注意到从  文档/devicetree/bindings/spi/OMAP-SPI.YAML 以下各项:

    在中 DMA 名称 属性、我们提到需要订购 "rxN"、然后是"TXN" 虽然以前我用相反顺序进行了测试、但它在 SPI0下工作正常。

    这会导致任何问题吗?

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

    尊敬的 Andreas:

    我只想向您更新、在更新 PSI-L 线程 ID 之后、我已经能够将 SPI2用作从器件。

    在下面附加 DTS 更改。

    &main_spi2 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_spi2_pins_default>;
        status = "okay";
    	ti,pindir-d0-out-d1-in;
    	spi-slave;
    	dmas = <&main_pktdma 0xc308 0>, <&main_pktdma 0x4308 0>;
    	dma-names = "tx0", "rx0";	
    
    	slave {
                    spi-max-frequency = <24000000>;
                    compatible = "rohm,dh2228fv";
            };
    
    };