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: 调试SPI遇到的问题:输出输入信号异常

Part Number: AM623

内核:Linux version 6.1.33-rt11。 (SDK09的版本,RTLINUX)

调试SPI2。

使用了SPI2_CLK, SPI2_CS1, SPI2_D0, SPI2_D1。

其中SPI2_CS0不使用,使用 了SPI2_CS1做为片选信号。

设备树:

AM62X_IOPAD(0x1EC, PIN_OUTPUT, 3) /* (A17) RA4_SCK SPI2_CLK */
AM62X_IOPAD(0x1E8, PIN_OUTPUT, 3) /* (B17) RA4_nCS SPI2_CS1 */
AM62X_IOPAD(0x194, PIN_OUTPUT_PULLUP, 1) /* (B19) RA4_MOSI SPI2_D0 */
AM62X_IOPAD(0x198, PIN_INPUT_PULLUP, 1) /* (A19) RA4_MISO SPI2_D1 */

&main_spi2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi2_pins_s1>;
ti,spi-num-cs = <2>;
spidev@1 {
spi-max-frequency = <1000000>;
reg = <0>;
compatible = "rohm,dh2228fv";
};
spidev@2 {
spi-max-frequency = <1000000>;
reg = <1>;
compatible = "rohm,dh2228fv";
};

};

系统起来了,可看到SPI设备:

crw------- 1 root root 153, 0 Nov 30 02:47 /dev/spidev2.0
crw------- 1 root root 153, 1 Nov 30 02:47 /dev/spidev2.1

应用层编译了个spidev_test 工具,做为spi的测试。

使用spidev_test工具做读写测试看几个引脚的信号。

在不接spi设备的前期,执行读写测试,看spi信号。

/spidev_test  -v -p "dfasdfsdfsadfsadf" -D /dev/spidev2.0

/spidev_test  -v -p "dfasdfsdfsadfsadf" -D /dev/spidev2.1

SPI2_CLK:  在执行读写的时候。 clk信号有输出,有看到clk。

SPI2_CS1:    在对/dev/spidev2.0测试时,CS1信号无反应。在对/dev/spidev2.1操作时,可以看到SPI2_CS1片选信号有输出,片选信号作用。

SPI2_D0:在执行测试时,看到该信号无任何反应。

SPI2_D1:在执行测试时,看到该信号有反应。

疑问:

根据芯片手册,如果AM62x的SPI做为主模式时,SPI2_D0作为输出,即为MOSI,SPI2_D1做为输入,即为MISO。

在执行测试时,理论应该SPI2_D0有数据发送,因为没有接SPI设备,SPI2_D1没有数据信号进入,应该没有信号变化才对。

但是测试结果刚好相反。

而且设备里也将SPI2_D0设置为输出,SPI2_D1设置为输入了。

还请帮忙解答疑惑和确认问题。

  • 研究了下内核代码,发现有如下相关代码片段。

    然后发现这个参数没有设置。

    于是在设备树里加上:

    这样DO就为能OUT,D1就可以为IN了。

    这是很容易忽略的细节。

    设备树上面的pinctrl除了要正确的设置INPUT和OUTPUT之外,还有这个变量要设置。

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

     ti,pindir-d0-out-d1-in = <1>;

    重要的事情要多重复几遍。