对于不耐烦的人,您可以跳过背景。
背景
我正在编写一组与 SPI 通信的微控制器。有一个主n
从共享总线。没有芯片选择。(这不是一个糟糕的设计,但n
它很大并且没有足够的空间容纳n
额外的线条)。
因此,奴隶有责任将他们的 MISO 保持在高阻抗状态,并且最多他们中的一个会说话。这是通过仅在轮询他们的 id 时才响应来完成的。
现在我们想要一个初始发现阶段,在这个阶段,主节点发现附加了哪些 ID 的从节点。为了让生活更轻松(在某些方面),我们希望 id 是唯一的(因此例如 32 位)。这使得master不可能简单地一个一个轮询id,看看谁响应(可能性太多了)。
为了解决这个问题,我设计了一种二分搜索的变体,其中从站集体响应,主站能够快速找到最小 id。具有该 id 的从站被告知不再参与,并且算法重复。(细节不重要)。
不过有一个问题。集体响应需要是所有响应的逻辑 OR(或逻辑 AND)。有人告诉我,这条线路可以配置为使 MISO 总线可以充当逻辑或。我被告知的是:
- 将 MISO 上的 master 设置为 Pull-up 和
- 将每个从站上的 MISO 设置为开漏。
我已经尝试过了,但即使只有一个从机,这种配置也不起作用(示波器在线上显示一个恒定的零)。如果我将主设备上的 MISO 配置为高阻抗输入,我可以用示波器看到电压下降到两个从设备的输出位不同的一半(我假设基本上是短路)。
注意:将主设备上的 MISO 配置为高阻抗,将每个从设备配置为推挽式,即使同一总线上有很多设备,我也可以单独与它们中的每一个通话。我的意思是,我怀疑这是线路本身的问题。
题
我的问题是,如果这是可能的,如果是这样,我如何配置主从机的输入和输出引脚,以便共享 MISO 线充当逻辑 OR(或逻辑 AND)?
编辑
结果它变成了一个带有负真逻辑的 OR(基本上是一个 AND)。
通过将 1 写入主设备上的上拉引脚,解决了单从设备的问题。以前它的初始状态为 0。
编辑 2
结果 ST 从机将 MISO 的 GPIO 配置覆盖为漏极开路,并在写入时将其强制为高。在这种特殊情况下,我决定手动关闭 SPI 并输出 MISO。