在 Raspberry Pi 上通过 GPIO SPI 连接使用两个东西

Use two things over GPIO SPI connection on Raspberry Pi

我有一个来自 Adafruit 的 2.8" 电容式 TFT 屏幕和一个来自 Adafruit 的 PN532 RFID reader。问题是,它们都使用 SPI。当我使用 RFID reader 时,屏幕完全消失白色,我必须重新启动 Pi 才能恢复图像。我必须在 reader 上使用 SPI 接口,以便我可以使用 Adafruit 库将其与 Python 一起使用。屏幕变白只要仅在使用 RFID reader 时就没有问题。使用 RFID reader 后屏幕是否会 "restart"?感谢任何帮助。

SPI 总线由 3 条线 + 1 个芯片组成 select SPI 总线上每个可单独寻址从机的信号。一些设备,例如 NeoPixels、许多 DAC、每个移位寄存器等,允许菊花链,其中一串设备可以共享一个公共芯片 select 线。

但是在您的情况下,您肯定希望解决不支持菊花链的设备。所以每个设备都需要一个单独的芯片select线。

让我们首先概括一下,SPI 总线是如何工作的。

SPI 传输通常如下所示

 /CS  ‾‾‾\___________________ . . . ___________/‾‾‾

 CLK  _____/‾‾‾\___/‾‾‾\___/‾ . . . ‾‾\____________

MOSI  =====X=======X=======X= . . . ===============

MISO  =========X=======X===== . . . ==X============

即首先芯片 select (/CS) 变低,然后 MOSI(主输出 → 从输入)数据线被设置为下一个要传输的位,并且在 上升 时钟边沿,在时钟下降沿,从设备读取该位。类似地,在 falling 时钟边沿,slave 拉动数据线供 master 在上升沿读取。

然而,某些设备需要反转时钟极性或期望 MOSI/MISO 上的不同时序。然而,上面概述的时间安排对大多数人来说都是有效的,而且我在进行 bitbanging 时通常会这样做。

/CS 行的目的是分隔总线事务。下降的 /CS 开始交易,上升的交易结束。这实质上意味着:如果设备没有看到下降 /CS 它会简单地忽略其他线路上发生的一切。

因此,对于像您这样的问题,首先要思考的是:“我是否使用不同的 /CS 信号对我的 SPI 从设备进行寻址,如果是这样,时序是否正确?”。 =62=] 必须有调试工具,这样的问题就是示波器;最好有4个通道。

您的 Raspberry-Pi 有几个 GPIO 引脚。从技术上讲,它们中的每一个都可以用于 /CS 信号。然而,SPI 传输通常由设备 and/or 驱动程序控制,这些驱动程序希望为 /CS 使用非常特定的引脚。我不熟悉 Adafruit 库,如果它有这样的期望。但是,如果您可以在库中配置“chip select”(CS)、“slave select”(SS)或“chip enable”(CE)信号,那么这就是您指定的位置您用作相关设备的 /CS 的 GPIO。

如果您不能那样配置,总是可以选择在 /CS 信号上使用硬连线与门。万无一失且稳健的解决方案是使用 74HCx 系列门,但是这会带来很多冗余线。一个稍微更优雅的解决方案是使用像 74HC154 这样的逻辑解复用器,您将 /CS 连接到 /EN 引脚并使用 4 条 GPIO 线可以寻址到 16 个输出中的哪个 /CS 信号被路由。

然而,还有一种非常便宜的变体,称为 wired OR。请记住,/CS 的通常惯例是拉低。所以你可以做的是我们几个电阻器——如果你不能三态你的 GPIO 引脚几个二极管——强制 /CS 信号为你不想寻址的设备。有关详细信息,请参阅 https://en.wikipedia.org/wiki/Wired_logic_connection

更新

所以我快速浏览了这里托管的图书馆 https://github.com/adafruit/Adafruit_Python_PN532 and right in the example there's this https://github.com/adafruit/Adafruit_Python_PN532/blob/feaf22f659731586adc9ded4af969bb256969ed3/examples/readmifare.py#L28

# Setup how the PN532 is connected to the Raspbery Pi/BeagleBone Black.
# It is recommended to use a software SPI connection with 4 digital GPIO pins.

# Configuration for a Raspberry Pi:
CS   = 18
MOSI = 23
MISO = 24
SCLK = 25

所以这个有问题的库不仅没有绑定到专用的 SPI 外围设备,而且您实际上可以自由配置要使用的 GPIO 引脚,以与 RFID 通信 reader。