如果您不耐烦,可以跳过背景。
背景
我正在编程一组与SPI通信的微控制器。有一个主n
从共享总线。没有芯片选择。(这不是一个不好的设计,但是n
很大,没有足够的空间容纳n
多余的行)。
因此,从站有责任保持其MISO处于高阻抗状态,并且最多只有其中一个发言。通过仅在轮询其ID时进行响应才能完成此操作。
现在,我们希望有一个初始发现阶段,在此阶段,主节点会发现附加了ID的从节点。为了使生活更轻松(在某些方面),我们希望具有唯一的ID(因此,例如32位)。这样,主机就不可能简单地逐个轮询id并查看谁做出响应(存在太多可能性)。
为了解决这个问题,我设计了一种二进制搜索的变体,其中从站集体响应,而主站能够快速找到最小id。告知具有该ID的从站不再参与,算法重复执行。(细节不重要)。
不过有一个问题。集体响应必须是所有响应的逻辑或(或逻辑与)。有人告诉我,可以以MISO总线可以用作逻辑OR的方式配置线路。有人告诉我:
- 将主机上的MISO设置为上拉和
- 将每个从机上的MISO设置为漏极开路。
我已经尝试过了,但是即使只有一个从机,此配置也无法工作(示波器在行上显示恒定的零)。如果我在主设备上将MISO配置为高阻抗输入,则在示波器上可以看到电压下降到一半,这是两个从设备的输出位不同的地方(我认为基本上是短路)。
注意:在主机上将MISO配置为高阻抗,在从机上将其配置为推挽,即使同一总线上有许多MISO,我也可以分别与它们交谈。我的意思是,我怀疑这是生产线本身的问题。
题
我的问题是,是否完全可能,如果可以,如何配置主机和从机的输入和输出引脚,以使共享的MISO线充当逻辑或(或逻辑与)?
编辑
原来,它变成了具有负真逻辑(基本上是AND)的OR。
通过将1写入主机上的上拉引脚,可以解决单个从机的问题。以前它的初始状态为0。
编辑2
事实证明,ST从机将我的MISO GPIO配置改写为漏极开路,并在写入时强制将其拉高。我决定在这种特殊情况下手动使SPI静默并输出MISO。