Answers:
使用这两种方法都可以达到相同的结果并没有什么区别,但是出于某些原因,您选择其中一种选择。
使用SPI外设可以使处理器从繁琐的I / O引脚生成时间中解放出来,从而使其能够执行其他计算任务并简化CPU的编程。由于外设是在硬件中实现的,因此与位冲击I / O相比,它可以运行得更快,功耗更低。如果您的应用程序要求您选择不带SPI外围设备的处理器,那么在某些情况下,您可能希望使用I / O来与SPI接口。出于理智的考虑,除非绝对必要,否则我建议避免这样做。
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。如果您的兴趣是从中获得最高的数据速率,则硬件总是比bitbanging快(例如,teensy中的手臂皮质芯片3我可以使用硬件SPI支持以22Mbps的速率推出数据,而bitbanging的速率约为4.5Mbps(它还可处理3-16中每次传输的任意位数-对于某些led控制器以12位块的形式发送数据时很有用!))。在16Mhz avrs上,两者之间的差异不太明显,硬件的最高数据速率似乎高4 /低5Mbps,而bitbanging约为2.3Mbps)。
此外,如果您使用硬件支持,则再次取决于所讨论的微控制器,您可以使用DMA控制器将数据移出,从而使代码返回到其他可能比保育数据更有趣的事情。写。
以上所有内容都取决于是否可以选择硬件SPI。