修改设备树之后,出现设备,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>;
};
};
离线
&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没有波形。
离线
这个估计和从机也有关,我换了一个其它的SPI传感器(和之前不是同一种传感器),它能够正常使用。
但是之前那个还是不能正常通信,
这就很离谱了。
离线
刚群里面问了一下,大佬说,“可能SPI的mode不一致”。
但是我没有修改设备树之前,是可以正常通信的。
修改设备树之后,我的代码是没有改的,还是原来的SPI模式,就不能正常通信了。
而且我一直都是使用的 /dev/spidev0.0 。
离线
这个是上面一楼提到的SPI复用不能正常通信的波形。
1.图1是SCK 和CS脚的波形。(黄为CS)
2.下两图是SCK 和MOSI 波形。(黄为SCK,图2是图3的第一条数据)
离线
刚群里面问了一下,大佬说,“可能SPI的mode不一致”。
我在代码修改,尝试了SPI_MODE_0 、SPI_MODE_1、 SPI_MODE_2 、SPI_MODE_3 ,仍然没有反应。
离线
离线
@哇酷小二
使用官方的spidev_test.c 测试过了。/dev/spidev0.0 和 /dev/spidev0.1 都可以可以使用的。
可能是这个模块对SPi有些要求,复用的时候,就达不到。
后面直接就采用GPIO模拟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了。
离线