我有一个2.8英寸的电容式TFT屏幕和来自Adafruit的PN532 RFID阅读器。问题是,他们都使用SPI。当我使用RFID阅读器时,屏幕变成白色,我必须重新启动Pi才能获得我必须使用阅读器上的SPI接口,以便我可以使用Adafruit库与Python一起使用。只要只在使用RFID阅读器时,屏幕变白不是问题。无论如何在使用RFID阅读器后“重新启动”屏幕?感谢任何帮助。
答案 0 :(得分:3)
SPI总线由每个可单独寻址的从器件上的3条线+ 1个片选信号组成。有些器件,例如NeoPixels,许多DAC,每个移位寄存器等,都允许菊花链,其中一系列器件可以共用一条公共芯片选择线。
但是在您的情况下,您肯定想要解决不支持菊花链的设备。因此每个器件都需要一个独立的芯片选择线。
让我们首先概括一下,SPI总线是如何工作的。
SPI传输通常如下所示
/CS ‾‾‾\___________________ . . . ___________/‾‾‾
CLK _____/‾‾‾\___/‾‾‾\___/‾ . . . ‾‾\____________
MOSI =====X=======X=======X= . . . ===============
MISO =========X=======X===== . . . ==X============
即。首先,芯片选择(/CS
)变为低电平,然后将MOSI(主输出→从输入)数据线设置为要传输的下一位和上升时钟边沿,并且在时钟下降沿,从器件读取该位。类似地,在下降时钟边沿,从器件拉出数据线,主器件在上升端读取。
然而,某些器件需要反相时钟极性或期望MOSI / MISO上的时序不同。然而,上面列出的时间对于大多数人来说都是有用的,而且当我敲打时我通常会这样做。
/CS
行的目的是划分总线事务。下降/CS
开始一个交易,一个上升的交易结束它。这本质上意味着:如果设备没有看到下降/CS
,它将会忽略其他行上发生的所有事情。
所以首先要问的是像你这样的问题:"我使用不同的/CS
信号对我的SPI从设备进行寻址,如果是,那么时序是否正确?&#34 ; 必须有调试工具,以解决像示波器这样的问题;最好是有4个频道的。
你的Raspberry-Pi有几个GPIO引脚。它们中的每一个在技术上都可用于/CS
信号。然而,SPI传输通常由想要为/CS
使用非常特定的引脚的设备和/或驱动程序控制。如果它有这样的期望,我对Adafruit图书馆不熟悉。但是,如果您可以配置"芯片选择" (CS),"奴隶选择" (SS)或"芯片启用"库中的(CE)信号,然后在您指定的位置,您使用哪个GPIO作为/CS
用于相关设备。
如果您不能这样配置,那么始终可以选择在/CS
信号上使用硬连线AND门。这种万无一失且强大的解决方案是使用74HCx系列门,但是它带有许多冗余线。稍微优雅的解决方案是使用像74HC154这样的逻辑解复用器,将/CS
连接到/EN
引脚,使用4条GPIO线可以解决/CS
信号的16个输出中的哪一个得到路由。
然而,还有一个名为有线OR 的廉价变体。记住,/CS
的惯常惯例是拉低。所以你能做的就是我们的几个电阻器 - 如果你不能将你的GPIO引脚与三个二极管相提并论 - 强制/CS
信号用于你不想要解决的设备。有关详细信息,请参阅https://en.wikipedia.org/wiki/Wired_logic_connection。
所以,我已经快速查看了此处托管的图书馆https://github.com/adafruit/Adafruit_Python_PN532,正好在示例中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阅读器通信。