无法在 BeagleBone Green Wireless 上配置 SPI0
Cannot configure SPI0 on BeagleBone Green Wireless
注:所选答案为解决问题的原始答案,更多详情请参阅下面的附加答案。
我无法在我的 BeagleBone Green Wireless (BBGW) 上配置 SPI0。我试图在不使用覆盖的情况下实现这一点,只使用纯 DeviceTree。
/dev/spidev1.0
和 /dev/spidev1.1
在那里,但是任何 I/O returns 垃圾。
连接到 SCLK 的示波器显示大部分噪声,here are pictures(每个时间尺度不同)。
我的 .dts/.dtsi 的重要部分:
&am33xx_pinmux {
bb_spi0_pins: pinmux_bb_spi0_pins {
pinctrl-single,pins = <
BONE_P9_22 ( PIN_INPUT_PULLUP | MUX_MODE0 ) // SCLK
BONE_P9_21 ( PIN_INPUT_PULLUP | MUX_MODE0 ) // MISO
BONE_P9_18 ( PIN_OUTPUT_PULLUP | MUX_MODE0 ) // MOSI
BONE_P9_17 ( PIN_OUTPUT_PULLUP | MUX_MODE0 ) // CS0
>;
};
};
&spi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_spi0_pins>;
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "linux,spidev";
spi-max-frequency = <16000000>;
reg = <0>;
};
channel@1 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "linux,spidev";
spi-max-frequency = <16000000>;
reg = <1>;
};
};
更多信息:
- 我没有使用可用的
am335x-bone-pinmux-spi0.dtsi
,因为它启用了时钟相移 (spi-cpha
)
- 我打算使用 SPI 与 DWM1000 通信
- 我正在使用带有上述 DWM1000 的定制 cape、一个电源转换器和 2 个连接到 P8 连接器上的 PRU 引脚的电机驱动器
- 完整覆盖文件:https://github.com/GroupOfRobots/RobotConfig/tree/v3/DevTree
uEnv.txt
: https://github.com/GroupOfRobots/RobotConfig/blob/v3/uEnv.txt
- 系统:
Debian 9.0 (testing)
- 内核:
4.4.80-ti-rt-r116
(我也尝试过不同的内核,但我需要 ti-rt
b运行ch 之一)
PS。我知道它是 BBGW 而不是 BBB,但是 BBG/BBGW 还没有标签。
更新:
该行为在其他内核上被验证为相同,即:
- 4.4.85-armv7-x14
- 4.4.84-ti-r120
- 4.4.85-bone19
此外,我用跳线和 运行 spidev_test
将 MISO 和 MOSI(P9 上的引脚 18 和 21)连接在一起,结果如下:
$ sudo ./spidev_test -v -p "abcdefghijklmnopqrstuvwxyz1234\xde\xad"
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 31 32 33 34 DE AD | abcdefghijklmnopqrstuvwxyz1234ޭ
RX | 03 0C 0F 30 33 3C 3F C0 C3 CC CF F0 F3 FC FF 00 03 0C 0F 30 33 3C 3F C0 C3 CC 03 0C 0F 30 FC F3 | ...03<?�������.....03<?���...0��
我无法从中得出任何结论,但这让我几乎可以肯定这不是由于时钟线上的电容器造成的,它在本次测试中未使用。
我遇到了同样的问题,我使用的是 adafruit-spi0 叠加层,但无法正常工作。我能够在从属 spi 设备上发送数据并且接收到的数据正常,但是当第二个设备将数据发送回我的 BBGW 时,我没有得到我发送的值。
这就是我解决这个问题的方法,spi0 clk 上有两个 100pf 的电容器,它们引起反射导致双时钟数据,您需要将它们移除。
我的板是从 seeded studio 订购的。
简答
移除电容器,@suadss 的回答是正确答案。
稍微长一点的解释
与所选答案中所写的相反,只有一个电容器在时钟线上 - 另一个在 SPI0_D0
上,或者在这种情况下,MISO
(主输入Slave Output) 线因此即使在短路 D0
和 D1
并完全忽略时钟时也会破坏数据。
下面这些电容器背后的原因。
电容器的位置
如果图像不再可用时的说明
两个 100pF 电容器位于电路板边缘,Grove 连接器之一下方,microSD 卡插槽和划掉的 Pb 标志之间的中间。一行中只有 2 个,而不是 SD 卡插槽旁边的 3 个电阻器和 Pb 标志旁边的 3 个其他元件。
这是一张照片(删除前):
他们为什么会在这里
因为完全相同的 GPIO 可用于 UART
,就像在 BeagleBone Black 上一样:
那有什么不同呢?这个 UART
也可以在 Grove 连接器上使用!因此,为了在使用该连接器和长电缆时滤除一些噪音,他们添加了 2 个小电容器。会出什么问题?
我仍然想知道的一件事是,为什么他们不为该连接器使用 免费和未使用的 CPU 线路之一(甚至另一个UART,例如 UART4
或 UART5
) - 无论如何都可以通过 DTB
s 配置,是的,有空闲线路:
原理图截图来源:官方BBGW schematic
注:所选答案为解决问题的原始答案,更多详情请参阅下面的附加答案。
我无法在我的 BeagleBone Green Wireless (BBGW) 上配置 SPI0。我试图在不使用覆盖的情况下实现这一点,只使用纯 DeviceTree。
/dev/spidev1.0
和 /dev/spidev1.1
在那里,但是任何 I/O returns 垃圾。
连接到 SCLK 的示波器显示大部分噪声,here are pictures(每个时间尺度不同)。
我的 .dts/.dtsi 的重要部分:
&am33xx_pinmux {
bb_spi0_pins: pinmux_bb_spi0_pins {
pinctrl-single,pins = <
BONE_P9_22 ( PIN_INPUT_PULLUP | MUX_MODE0 ) // SCLK
BONE_P9_21 ( PIN_INPUT_PULLUP | MUX_MODE0 ) // MISO
BONE_P9_18 ( PIN_OUTPUT_PULLUP | MUX_MODE0 ) // MOSI
BONE_P9_17 ( PIN_OUTPUT_PULLUP | MUX_MODE0 ) // CS0
>;
};
};
&spi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_spi0_pins>;
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "linux,spidev";
spi-max-frequency = <16000000>;
reg = <0>;
};
channel@1 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "linux,spidev";
spi-max-frequency = <16000000>;
reg = <1>;
};
};
更多信息:
- 我没有使用可用的
am335x-bone-pinmux-spi0.dtsi
,因为它启用了时钟相移 (spi-cpha
) - 我打算使用 SPI 与 DWM1000 通信
- 我正在使用带有上述 DWM1000 的定制 cape、一个电源转换器和 2 个连接到 P8 连接器上的 PRU 引脚的电机驱动器
- 完整覆盖文件:https://github.com/GroupOfRobots/RobotConfig/tree/v3/DevTree
uEnv.txt
: https://github.com/GroupOfRobots/RobotConfig/blob/v3/uEnv.txt- 系统:
Debian 9.0 (testing)
- 内核:
4.4.80-ti-rt-r116
(我也尝试过不同的内核,但我需要ti-rt
b运行ch 之一)
PS。我知道它是 BBGW 而不是 BBB,但是 BBG/BBGW 还没有标签。
更新:
该行为在其他内核上被验证为相同,即:
- 4.4.85-armv7-x14
- 4.4.84-ti-r120
- 4.4.85-bone19
此外,我用跳线和 运行 spidev_test
将 MISO 和 MOSI(P9 上的引脚 18 和 21)连接在一起,结果如下:
$ sudo ./spidev_test -v -p "abcdefghijklmnopqrstuvwxyz1234\xde\xad"
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 31 32 33 34 DE AD | abcdefghijklmnopqrstuvwxyz1234ޭ
RX | 03 0C 0F 30 33 3C 3F C0 C3 CC CF F0 F3 FC FF 00 03 0C 0F 30 33 3C 3F C0 C3 CC 03 0C 0F 30 FC F3 | ...03<?�������.....03<?���...0��
我无法从中得出任何结论,但这让我几乎可以肯定这不是由于时钟线上的电容器造成的,它在本次测试中未使用。
我遇到了同样的问题,我使用的是 adafruit-spi0 叠加层,但无法正常工作。我能够在从属 spi 设备上发送数据并且接收到的数据正常,但是当第二个设备将数据发送回我的 BBGW 时,我没有得到我发送的值。
这就是我解决这个问题的方法,spi0 clk 上有两个 100pf 的电容器,它们引起反射导致双时钟数据,您需要将它们移除。
我的板是从 seeded studio 订购的。
简答
移除电容器,@suadss 的回答是正确答案。
稍微长一点的解释
与所选答案中所写的相反,只有一个电容器在时钟线上 - 另一个在 SPI0_D0
上,或者在这种情况下,MISO
(主输入Slave Output) 线因此即使在短路 D0
和 D1
并完全忽略时钟时也会破坏数据。
下面这些电容器背后的原因。
电容器的位置
如果图像不再可用时的说明
两个 100pF 电容器位于电路板边缘,Grove 连接器之一下方,microSD 卡插槽和划掉的 Pb 标志之间的中间。一行中只有 2 个,而不是 SD 卡插槽旁边的 3 个电阻器和 Pb 标志旁边的 3 个其他元件。
这是一张照片(删除前):
他们为什么会在这里
因为完全相同的 GPIO 可用于 UART
,就像在 BeagleBone Black 上一样:
那有什么不同呢?这个 UART
也可以在 Grove 连接器上使用!因此,为了在使用该连接器和长电缆时滤除一些噪音,他们添加了 2 个小电容器。会出什么问题?
我仍然想知道的一件事是,为什么他们不为该连接器使用 免费和未使用的 CPU 线路之一(甚至另一个UART,例如 UART4
或 UART5
) - 无论如何都可以通过 DTB
s 配置,是的,有空闲线路:
原理图截图来源:官方BBGW schematic