您尚未登录。

楼主 # 2022-04-15 11:13:51

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

荔枝派 zero(V3S), SPI复用不能正常通信。

修改设备树之后,出现设备,CS脚也能被拉低。
但是通信不成功,不能正常读取从机的芯片ID,请大家帮我看一下,哪里有错误?

1.直接使用默认的SPI(默认CS 为PC2), 检测到有/dev/spidev0.0,能够正常使用。

  &spi0 {
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins>;
        status = "okay";
        #address-cells=<1>;
        #size-cells=<0>;
        spidev@0 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <0>;
        };
};

2.使用GPIO 来作为SPI的CS脚,检测到有/dev/spidev0.0,示波器测得CS脚在运行时会被拉低,但是通信不成功。

 &pio {
        spi0_cs_pins: spi0_cs_pins {
                pins = "PC2";
                function = "gpio_out";
        };
};

&spi0 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
        cs-gpios = <&pio 2 2 GPIO_ACTIVE_HIGH>;

        #address-cells=<1>;
        #size-cells=<0>;
        spidev@0 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <0>;
        };
};

3.SPI复用,有多个CS脚。检测到有/dev/spidev0.0 、/dev/spidev0.1 。使用/dev/spidev0.0进行通信,示波器测得CS脚(PC2)在运行时会被拉低,但是通信不成功。

&pio {
        spi0_cs_pins: spi0_cs_pins {
                pins = "PC2","PE20";
                function = "gpio_out";
        };
};

&spi0 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
        cs-gpios = <&pio 2 2 GPIO_ACTIVE_HIGH>,<&pio 4 20 GPIO_ACTIVE_HIGH>;

        #address-cells=<1>;
        #size-cells=<0>;
        spidev0@0 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <0>;
        };
        spidev1@1 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <1>;
        };
}; 

离线

楼主 #1 2022-04-15 14:44:20

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

&pio {
        spi0_cs_pins: spi0_cs_pins {
                pins = "PC2","PE20";
                function = "gpio_out";
        };
};

&spi0 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
        cs-gpios = <&pio 2 2 GPIO_ACTIVE_HIGH>,<&pio 4 20 GPIO_ACTIVE_HIGH>;

        #address-cells=<1>;
        #size-cells=<0>;
        spidev0@0 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <0>;
        };
        spidev1@1 {
                compatible = "spidev";
                spi-max-frequency = <100000000>;
                reg = <1>;
        };
}; 

在这种情况下,测试CS、MOSI、MISO脚都是有波形的。MISO没有波形。

离线

楼主 #3 2022-04-15 16:31:56

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

哇酷小二 说:

接flash试一试:

百问网韦老师 D1 开发板 ---- 东山哪吒STU
https://bbs.aw-ol.com/topic/1217/share/9


SPI  GPIO 片选搞定!

这个估计和从机也有关,我换了一个其它的SPI传感器(和之前不是同一种传感器),它能够正常使用。

但是之前那个还是不能正常通信,
这就很离谱了。

离线

楼主 #5 2022-04-15 16:55:08

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

哇酷小二 说:

刚群里面问了一下,大佬说,“可能SPI的mode不一致”。

但是我没有修改设备树之前,是可以正常通信的。
修改设备树之后,我的代码是没有改的,还是原来的SPI模式,就不能正常通信了。
而且我一直都是使用的 /dev/spidev0.0 。

离线

楼主 #6 2022-04-15 17:23:28

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

这个是上面一楼提到的SPI复用不能正常通信的波形。
1.图1是SCK 和CS脚的波形。(黄为CS)
1.jpg
2.下两图是SCK 和MOSI 波形。(黄为SCK,图2是图3的第一条数据)
3.jpg
2.jpg

离线

楼主 #7 2022-04-15 17:50:28

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

哇酷小二 说:

刚群里面问了一下,大佬说,“可能SPI的mode不一致”。

我在代码修改,尝试了SPI_MODE_0 、SPI_MODE_1、 SPI_MODE_2 、SPI_MODE_3 ,仍然没有反应。

离线

楼主 #9 2022-05-18 16:12:11

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

@哇酷小二
使用官方的spidev_test.c 测试过了。/dev/spidev0.0 和 /dev/spidev0.1 都可以可以使用的。
可能是这个模块对SPi有些要求,复用的时候,就达不到。
后面直接就采用GPIO模拟SPI了。

离线

楼主 #10 2022-05-18 16:34:14

inia
会员
注册时间: 2021-07-27
已发帖子: 37
积分: 42

Re: 荔枝派 zero(V3S), SPI复用不能正常通信。

参考这篇文章:GPIO模拟SPI

1.首先在内核里面打开SPI模拟

Device Drivers  --->
    [*] SPI support  ---> 
        <*>   GPIO-based bitbanging SPI Master 

2.在设备树里面根节点下面添加复用的GPIO设置:

		spi2: spi2{
			compatible = "spi-gpio";
			#address-cells = <0x1>;
			#size-cells = <0>;
			//ranges;
			gpio-miso = <&pio 4 3 0>;
			gpio-mosi = <&pio 4 4 0>;
			gpio-sck  = <&pio 4 5 0>;
			cs-gpios  = <&pio 4 6 0>;
			num-chipselects = <1>;
        
			pinctrl-names = "default";
			pinctrl-0 = <&spi2_pins_a>;
			spidev2@0 {        
			status="okay";
				#address-cells = <1>;
				#size-cells = <0>;
				compatible = "spidev";
				spi-max-frequency = <20000000>;
				reg = <0>;
			};
		};

3.在pio: pinctrl@1c20800 里面添加引脚:

			spi2_pins_a: spi2-pins-pc {
				pins = "PE3", "PE4", "PE5", "PE6";
				function = "spi2";
		                 bias-pull-up;
			}; 

4.注释掉LCD相关设备树内容。
5.将MOSI和MISO短接就可以测试回环数据是否正常,使用 ./spidev_test -D /dev/spidev0.0 -v 来进行测试。
注:这里是使用的LCD引脚,我这边板子已经去掉LCD了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn