使用内置 SPI 模块和 bit-banging 有区别吗?

电器工程 微控制器 spi
2022-01-29 19:09:33

两者之间有区别,还是只是抽象问题?我的直觉说没有区别,但我很想弄错。

4个回答

MCU 中实际的 SPI 控制器外设通常可以比对接口进行位敲击快得多。当然,这取决于 MCU,但看到 SPI 控制器以 30+ MHz 运行并不让我感到惊讶,而 bit banging 可能会限制在 1 MHz 左右(如果你幸运的话)。

但不止于此。位撞击时,MCU 正忙于位撞击。它正在将数据移出并旋转 GPIO 线。意思是,它不能做任何其他事情。使用 SPI 控制器时,控制器忙于做所有这些事情,而 MCU 则可以自由地做其他事情。

因此,使用实际的 SPI 控制器,实际的 SPI 传输要快得多,并且 MCU 会获得一些可用于做其他事情的周期。

您可以使用这两种方法获得相同的结果,这在术语上没有区别,但是您选择其中一种方法有几个原因。

使用 SPI 外设将使处理器不必关心为 I/O 引脚产生位冲击的时序,使其能够执行其他计算任务并简化 CPU 编程。因为外围设备是在硬件中实现的,所以它运行得更快,并且比 bit banging I/O 使用更少的功率。如果您的应用程序要求您选择不带 SPI 外设的处理器,您可能会希望通过 bit bang I/O 与 SPI 接口。出于理智的原因,除非绝对必要,否则我建议避免这样做。

SPI是一个同步接口,主控时钟。这意味着如果您是大师,您可以选择时钟速度和时间。从设备对它们可以处理的时钟频率有一些上限,但通常不在乎时钟低于该上限有多慢。更具体地说,通常每个从机在再次切换之前需要看到时钟处于高电平和低电平状态的最短时间,并且在时钟沿周围的数据线上会有一些最小数据设置和保持限制,从机读取数据线。

正因为如此,在固件中实现 SPI 主控器非常容易。我经常这样做是为了方便使用某些引脚,当没有内置 SPI 硬件时,或者出于某种原因它不能用于该目的。在固件中做一个 SPI 主控非常简单。

许多 SPI 从设备都非常快,因此通常只需确保每个设备至少有一个指令周期宽就可以满足最小时钟和设置时间。在这种情况下,代码非常短且快速。在某些情况下,从设备每个时钟相位可能需要两个或三个指令周期,但这也不难保证。低电平 SPI 位循环需要对下一个输出位进行一些移位,抓取输入位,并检查循环计数器。通常只需安排驱动和采样线路的时间,并在正确的位置插入一些其他开销即可满足两个或三个周期的最小时序要求。如果速度很重要,您可以使用汇编器预处理器编写展开循环。有了这样的技巧,

在固件中做 SPI 主机有一些优点。SPI 硬件有时在如何配置方面有点生硬。当从属选择被断言时,总是存在应该立即发生什么的问题。那么第一位写入数据线了吗?如果时钟开始为低电平并且数据线应该在下降沿被锁存怎么办?有时这很重要,有时则不重要。使用固件 SPI 主机,您可以更加宽容,并可能使用相同的例程与不同的从机进行通信。例如,您可以确保 MOSI(Master Out Slave In)数据线在时钟的两个边沿上都是稳定的。SPI 硬件通常不会这样做,因此需要根据当时与哪个从机通信来重新配置此类硬件。

固件 SPI 主机的另一个优点是您可以为每个 SPI 序列选择任意数量的位。硬件通常限制为 8 位的倍数。大多数设备设计为允许整个字节传输,但通常不需要它们。例如,一个 10 位 A/D 可能会先发送 10 个数据位,然后再发送 0 或垃圾,如果您继续计时的话。如果使用硬件 SPI,您将被迫传输 16 位并屏蔽垃圾。一切都会正常工作,但在这种情况下,固件 SPI 主机实际上可能比硬件更快,因为它只传输所需的最低 10 位。

硬件 SPI 主机的主要优点是固件可以启动字节传输,然后开始执行其他操作。时钟通常也可以比展开的固件循环更快。请注意,虽然这两个优势在某些情况下都很重要,但它们通常是无关紧要的。大多数使用硬件传输字节的 SPI 代码会立即进入等待循环,等待硬件完成传输。还要仔细检查从属时序要求。SPI 设备总体上通常很快,但在某些情况下,无论如何您都需要减慢硬件速度以匹配从设备可以处理的最大速度。

那都是从大师的角度来看的。简而言之,使用SPI硬件作为主控通常没有什么优势,有时不使用它甚至有一些优势。然而,对于奴隶来说,情况就完全不同了。由于主机控制时钟,因此无论主机何时执行,从机都必须为主机所做的任何事情做好准备。相对于指令时间而言,时序要求通常非常短,因此您通常需要硬件实现 SPI 从机。

您可以在固件中使用 SPI 从设备,但这很棘手,您必须仔细计算周期和延迟,并且您通常最终会实现您知道您的特定主设备使用的协议的某个子集。例如,有一次我必须设计一个与旧模拟控制器板相当的数字(他们想要在模拟中无法合理完成的额外功能,他们想要更小、生产更便宜、更稳定的东西)。该板通过 SPI 总线与系统的其余部分连接。旧的模拟板有一个两通道 D/A 来设置控制值和一个两通道 A/D 来回读测量值。在单个处理器中实现这两者是很棘手的,它包括弄清楚现有主机实际使用的硬件 D​​/A 和 A/D SPI 协议的哪个子集。它还包含一个运行速度明显快于 SPI 时钟速率的处理器。最后,我使用了三个中断,一个用于每个从机选择,一个用于时钟线的上升沿。最后一个需要是系统中最高优先级的中断,否则无法满足延迟要求。

无论如何,总体而言,固件 SPI 主控器简单、小巧、快速且灵活,没有理由回避这样做。另一方面,对于从属设备,您确实需要硬件,或者您必须醒来并非常仔细地考虑时序、延迟等问题。

这取决于你在做什么 SPI。如果您的兴趣是从中获得最高的数据速率,那么硬件总是比 bitbanging 快(例如,teensy 3 中的 arm cortex 芯片我可以使用硬件 SPI 支持以 22Mbps 的速度输出数据,而使用 bitbanging 时约为 4.5Mbps(它还可以处理从 3 到 16 的每次传输的任意位数 - 在某些 LED 控制器以 12 位块发送数据时很有用!))。在 16Mhz avrs 上,差异不那么极端,硬件的最高数据速率似乎是高 4/低 5Mbps,而 bitbanging 大约是 2.3Mbps)。

此外,如果您再次使用硬件支持,则取决于所讨论的微控制器,您可以选择使用 DMA 控制器将数据移出,让您的代码返回到其他可能比照看数据更有趣的事情写。

以上所有都取决于硬件 SPI 是否是一个选项。