使用内置的SPI模块和位敲打之间有区别吗?


Answers:


33

MCU中实际的SPI控制器外设通常可以比对接口进行位冲击要快得多。当然,这取决于MCU,但是看到SPI控制器以30+ MHz的频率运行并不奇怪,而位跳动可能会限制在1 MHz左右(如果幸运的话)。

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

因此,使用实际的SPI控制器,实际的SPI传输要快得多,并且MCU重新获得一些可用于执行其他操作的周期。


11

使用这两种方法都可以达到相同的结果并没有什么区别,但是出于某些原因,您选择其中一种选择。

使用SPI外设可以使处理器从繁琐的I / O引脚生成时间中解放出来,从而使其能够执行其他计算任务并简化CPU的编程。由于外设是在硬件中实现的,因此与位冲击I / O相比,它可以运行得更快,功耗更低。如果您的应用程序要求您选择不带SPI外围设备的处理器,那么在某些情况下,您可能希望使用I / O来与SPI接口。出于理智的考虑,除非绝对必要,否则我建议避免这样做。


理智的原因是垃圾。与仅编写SPI主代码相比,将SPI硬件正确设置为所需的配置通常花费更多的时间来读取SPI外围设备数据表,从而仅需读取从设备数据表。
Olin Lathrop

我会坦率地说,我有点耸人听闻,但(公认的不成文的)意图是,随着应用程序复杂性的增加,确保整个系统在预定时间内继续运行的负担也越来越大。我已经实现了这两种方法,并且我知道我更喜欢使用外围设备,即使读取数据表需要花费额外的几分钟时间。
Amoch

6

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

因此,在固件中实现SPI主控确实非常容易。我经常这样做是为了在没有内置SPI硬件或者出于某种原因而无法用于某些目的时方便使用某些引脚。在固件中制作一个SPI主控大约很容易。

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

在固件中进行SPI主控有一些优势。SPI硬件有时在如何配置方面有点可笑。始终存在一个问题,即当从机选择被断言时,究竟应该立即发生什么。然后将第一位写入数据线吗?如果时钟开始变低并且数据线应该在下降沿被锁存怎么办?有时这很重要,有时却没有。使用固件SPI主设备,您可以更加宽容,并可能使用相同的例程与不同的从设备进行通信。例如,您可以确保MOSI(主机输出从机输入)数据线在时钟的两个边沿上都是稳定的。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设备一样工作的微控制器从实现(例如,允许主控制器随时提供CS优势并随时读取状态,并使用CS标记命令边界?我见过的大多数实现都没有)即使报告是否有当前字节与前一个之间的CS优势。
supercat

@supe:是的,这是一个问题。从动SPI硬件通常会忽略时钟和输入数据,并在未主张片选功能时将输出数据线保持在高阻抗状态,但通常不会告诉您片选边界在哪里。至少使用我记得使用的PIC SPI硬件,您必须为此设置片上选择中断。
Olin Lathrop

我想知道您是否知道任何体面的实现。我猜不会。在选择线上使用硬件中断的问题是,如果在发送字节后不久在选择线上发生转换,则从站可能很难解决它是在所讨论的字节之前还是之后发生的问题。令我感到困惑的是,几乎每个芯片都具有SPI从设备实施方案,但似乎没有一个芯片可以像典型的SPI硬件从设备那样使用。与8048相比,情况有点像PIC上的处理器从端口。–
supercat

8048处理器从端口具有一个地址引脚。当数据从外部写入8048时,8048会锁存该引脚的状态并使其可用于其代码(通常,命令的第一个字节将写入一个地址,而参数或数据将写入另一个地址)。读取一个地址将产生8048代码所放置的内容,但是从另一个地址读取的某些位将由8048硬件生成,以指示其是否准备好读取或写入数据。
超级猫

+1指出区别是对主节点(简单)和从节点(更困难)进行位碰撞。
tcrosley13年

1

这取决于您要做什么SPI。如果您的兴趣是从中获得最高的数据速率,则硬件总是比bitbanging快(例如,teensy中的手臂皮质芯片3我可以使用硬件SPI支持以22Mbps的速率推出数据,而bitbanging的速率约为4.5Mbps(它还可处理3-16中每次传输的任意位数-对于某些led控制器以12位块的形式发送数据时很有用!))。在16Mhz avrs上,两者之间的差异不太明显,硬件的最高数据速率似乎高4 /低5Mbps,而bitbanging约为2.3Mbps)。

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

以上所有内容都取决于是否可以选择硬件SPI。


0

如果对SPI进行位扩展,则无法使用SSP中断来处理通信。对于SPI的许多用途来说,这并不重要


1
没有提及特定的处理器,因此“ SSP中断”在此上下文中是没有意义的术语。
Olin Lathrop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.