使共享总线充当 OR

电器工程 微控制器
2022-01-28 06:20:07

对于不耐烦的人,您可以跳过背景。

背景

我正在编写一组与 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)?


编辑

  1. 结果它变成了一个带有负真逻辑的 OR(基本上是一个 AND)。

  2. 通过将 1 写入主设备上的上拉引脚,解决了单从设备的问题。以前它的初始状态为 0。

编辑 2

结果 ST 从机将 MISO 的 GPIO 配置覆盖为漏极开路,并在写入时将其强制为高。在这种特殊情况下,我决定手动关闭 SPI 并输出 MISO。

4个回答

您的 SPI-without-select 是 Microchip 在其 MCP23017 芯片(和其他芯片)上使用的。这种方法没有错。

是的,你想要的都是可能的,但你必须让奴隶成为开漏的。如果你不能让它们表现为开漏,你可以通过在每个输出上串联一个(肖特基)二极管来作弊。

您的枚举方法与 Dallas 单线总线用于枚举和 CAN 总线用于仲裁的方法相同。

但是您的方法的一个严重缺点是速度现在受到上升时间的限制,由上拉电阻驱动。这将比由推挽输出驱动时慢,并且可能会限制您操作总线的速度。

如果您在每个从站上有两个备用引脚,您可以将它们以菊花链形式连接起来,并根据它们在菊花链中的位置制定枚举方案。

  • 将 MISO 上的 master 设置为 Pull-up 和
  • 将每个从站上的 MISO 设置为开漏。

我已经尝试过了,但即使只有一个从机,这种配置也不起作用(示波器在线上显示一个恒定的零)。

您需要检查上拉模式下主 I/O 引脚的等效电阻是多少。

通常,上拉模式具有非常高的电阻,可能为 50 kOhms 或更高。其目的是防止引脚因 emi 或其他噪声而出现毛刺,或者为非常慢的控制信号设置默认值,同时不要浪费太多功率。

正如 Wouter 所指出的,在开漏总线中,速度受上拉电阻的限制。较高的电阻值会使总线变慢。I2C(获得 100 或 400 kHz)的典型值为 1 到 5 kOhms。您将需要类似的上拉电阻以达到类似的速度。

我认为你需要使用一个外部上拉电阻(1 到 5 kOhms 左右)而不是主控的 i/o 引脚上拉来使这个方案工作。

为了使有线和总线工作,总线上的节点需要开漏,即它们必须传输

  • 通过强烈下拉逻辑低,并且
  • 通过从总线断开逻辑高。

此外,总线必须被弱拉起来。

您看到的单个非传输主机和单个传输从机的特殊行为可以通过主机强力拉高或从机弱拉低来解释。

您需要确定上述哪些情况正在发生。

使从机进入高阻抗模式,并通过一个 10k 电阻将总线接地。如果线电压没有显着变化,那么主电源拉得很厉害,你需要解决这个问题。否则,对从机执行相同的程序(这次将电阻连接到 Vcc);如果线路电压显着上升,则从机拉低(修复)。否则,请在您周围的区域寻找时空扭曲。

我建议在总线上进行被动上拉或下拉(我假设是上拉),并让从机在有话要说时主动驱动总线(驱动高电平和低电平),否则将其浮动. 有查询地址命令,它接受地址和掩码,并根据它是否喜欢地址和掩码指示每个从站输出 00 或什么都不做(保持浮动输出)。如果可能,在从属设备开始驱动总线之前,让主设备主动将总线驱动为高电平。根据上拉的强度以及主机是否将总线驱动为高电平,在允许从机将其拉低之前,可能需要在设置阶段限制总线速度。另一方面,一旦设置完成,