SPI 是否比 bit-banging 快得多?

电器工程 图片 spi
2022-01-26 15:56:25

我有一个基于图片 18f4550 的项目。要写入 '595 移位寄存器,使用 spi 与常规 io 引脚相比有明显优势吗?我听说 spi 更快,但我不知道如何。它是否使用与芯片其他部分不同的、更快的时钟,或者它只是更有效?我可以通过很少的指令通过常规的 io 管脚敲出一个字节。spi 使用较少的处理能力吗?在相当激烈的计算中,我会经常移出,所以我希望尽可能多的周期专门用于我的过程,而不是移出。

我不想使用 spi 的主要原因是我当前的布局会使访问所需的引脚变得更加困难,因为我已经将其中一些引脚用于其他事情,并且不得不重新调整。我想在开始拆解和移动它们之前找出有什么好处。

4个回答

假设您正在将微控制器中的 spi 外围设备或同步串行“引擎”与通过“bit-banging”生成相同的序列进行比较,那么是的,它往往会更快一些,但更重要的是处理器可以将整个字节传递给外围设备发送,然后在传输时执行其他操作。在 bit-banging 的情况下,处理器在传输过程中往往会被占用(尽管由于 micro 往往是主设备并且大多数外围设备是完全静态的,您可能可以容忍暂停中间字节以服务中断甚至轮询事情 - 接口时钟串行 ADC 和采样间隔任务是值得注意的例外示例)。

在功能更强大的 MCU 上,甚至可以对 DMA 控制器进行编程,以通过 SPI 引擎从内存执行多字节传输,而无需处理器进一步关注,尤其是在只有一个方向的数据很重要的情况下。

但是许多微控制器项目最终都针对他们的任务进行了高度优化。如果您可以节省周期并容忍速度降低,那么使您的软件复杂化以便能够使用任何使物理布局更清洁的 GPIO 绝不是一个不常见的选择。

bit-banging 的优点:

  • 对协议的绝对控制。
  • 如果在微控制器上执行指令的时间比 SPI 的波特率快,它可能会更快,但这不太可能。使用相对高速的微控制器需要非常低速的 SPI 波特率。
  • 可以具有比 SPI 中断更小的延迟。
  • 引脚的选择。

位碰撞的缺点:

  • 需要更多代码来处理 - 波特率定时 - 接收位的可靠采样 - 处理帧边界 *上面的每个代码段都消耗运行其他代码的时间。

SPI的优点:

  • 寄存器配置处理波特率定时、接收位采样和处理帧计数
  • 大多数带有 SPI 的微控制器为每个 SPI 外设都有一个专用的中断向量(仔细检查你的微控制器!)
  • 配置后,只需检查 SPI TX/RX 缓冲区是否为空/满并写入/读取一个字节。
  • 如果 DMA 可用,则 SPI 可以传输大缓冲区的连续数据,而不会受到任何软件干扰。

SPI的缺点:

  • 一个额外的外围设备来学习和配置(这真的是一个缺点吗?)
  • 需要额外的引脚或引脚复用
  • 额外成本(目前的微控制器往往可以忽略不计)
  • 我遇到过 SPI 的噪音问题,但这些问题是在原型板上以相对较高的速度 (10MHz)
  • 高度受限的引脚选择

对我来说,与 SPI 的优势相比,bit-banging 的优势微不足道。bit-banging 的缺点远大于 SPI。我可以看到选择 bit-banging 的三个主要原因是

  1. 自定义低速协议
  2. 如果通信速度较慢且应用程序的其余部分的计算要求较低
  3. 或者,如果通信速度低并且引脚选择是一个主要问题

在 PIC 上,传统的 bit-bang SPI 风格的实现每比特大约需要 5 个周期;只需在 18Fxx 部件上做一些工作,就可以将其减少到大约四个(以每个字节的额外开销大约三个周期为代价)。该时间不包括获取数据所需的任何时间(通常每个字节三个周期)。因此,每个字节大约需要 40-43 个周期。使用硬件 SPI,速度提高到每个位两个周期加上每个字节的几个额外周期(其他一些可以处理背靠背传输,但我见过的 PIC 不能),而 SPI 正在发送一个字节处理器可以获取下一个,允许大约 18 个周期/字节的总时间 - 大约 2.5 倍的速度增益。

对于 bit banging(BB),您忘了提及:

  1. 在通信期间捆绑处理器。(SPI加载寄存器然后交还给你做其他事情)
  2. 背景中断会严重干扰 BB 代码,使其仅在单线程设计中有用,请记住,您的 BB 代码必须 100% 关注处理协议。