SPI的速度明显快于位冲击吗?


8

我有一个基于图片18f4550的项目。要写入'595移位寄存器,使用spi优于常规io引脚是否有明显的优势?我听说spi更快,但是我不确定如何。它使用的时钟不同于其他芯片吗?还是效率更高?我可以通过很少数量的指令通过常规io引脚对字节进行位敲打。SPI是否使用较少的处理能力?在相当密集的计算过程中,我将经常移出我的办公室,因此我希望有尽可能多的周期专用于我的过程而不移出。

我不想使用spi的主要原因是,我当前的布局会使访问所需的引脚变得更加困难,因为我已经将其中的一些引脚用于其他用途,并且必须将其改组。我想先了解一下有什么好处,然后再开始整理和移动它们。


5
您可以通过位撞击来执行SPI。
starblue 2011年

Answers:


17

假设您正在比较微型中的spi外围设备或同步串行“引擎”,以通过“位撞击”生成相同的序列,那么是的,它往往会更快一些,但更重要的是处理器可以将整个字节传递给外围设备发送,然后在传输时做其他事情。在位敲打的情况下,处理器在传输过程中往往会被束缚(尽管由于微控制器往往是主机,并且大多数外围设备都是完全静态的,所以您可能可以容忍暂停中字节来处理中断甚至轮询事物-接口时钟的串行ADC和采样间隔任务是例外的显着示例)。

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

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


是的,这^。正如克里斯提到的那样,使用硬件外设的最大优势在于,您可以将数据字节从流传递到外设,并且在完成将数据移出并准备好另一个字节时可以通过中断得到通知。在字节移出时,这可以释放CPU的其他资源,考虑到这些串行协议的波特率,这可以是机器周期的生命周期。
乔恩·L

3
SPI并非一生。如果您在谈论速度,那么您很可能会以10MHz运行SPI,而全速运行时只有10条PIC指令。那已经不是年龄了。几乎有足够的时间来准备下一个字节。几乎没有时间服务中断。
Rocketmagnet

2
可以公平地说,很大程度上取决于预期/要求的波特率,但尚未说明。但是,正如我指出的那样,如果微型计算机是主计算机,则它可以自由地延迟发送下一个字节,前提是应用程序可以容忍吞吐量的不规则性/降低。
克里斯·斯特拉顿

1
@Rocketmagnet,我已经纠正了。SPI比我想象的要快得多-我猜我将它与诸如UART(其中9600波特为〜10 kHz)的较慢的串行协议混为一谈。
乔恩·L

1
另请注意,SPI主控器相对容易发生爆炸。SPI从器件可能会更难一些,因为需要特别定时和处理片选和时钟晶体管(例如外部中断引脚)。我在项目中经常使用SPI主位爆炸样式,尤其是在我不需要高性能但想要一块干净的电路板(也适合家庭蚀刻)的情况下。还要注意,相反的做法是通常的做法:使用SPI和GPIO(锁存引脚)将数据移入移位寄存器(HC595等)。
汉斯,

10

位冲击的优点:

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

缺点:

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

SPI的优势:

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

SPI的缺点:

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

对我来说,与SPI的优势相比,位冲击的优势微不足道。位撞击的缺点远大于SPI的缺点。我看到选择位敲打的三个主要原因是

  1. 自定义低速协议
  2. 如果通信速度较慢,而应用程序的其余部分对计算的要求较低
  3. 或者,如果通信速度较慢而选针是主要问题

8

在PIC上,传统的bit-bang SPI风格的实现每位大约需要五个周期。只需对18Fxx零件进行一点工作,就可以将其减少到大约四个(每字节额外开销大约需要三个周期)。该时间不包括获取数据所需的任何时间(通常为每个字节三个周期)。因此,每个字节大约需要40-43个周期。使用硬件SPI时,速度提高到每位两个周期,再加上每个字节几个额外的周期(其他一些可以处理背对背传输,但是我见过的PIC无法处理),而SPI正在发送一个字节处理器可以获取下一个,从而使整个时间大约为18个周期/字节-速度提高大约2.5倍。


0

对于位撞击(BB),您忘了提及:

  1. 在通信期间将处理器连接起来。(SPI加载寄存器,然后移交给您执行其他操作)
  2. 背景中断会严重干扰BB代码,使其仅在单线程设计中有用,请记住,BB代码必须100%注意处理协议。
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.