差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
spi [2021/09/13 01:11]
gongyu
spi [2021/09/13 01:13] (当前版本)
gongyu
行 1: 行 1:
 ## SPI - 同步、全双工的串行外设接口 ## SPI - 同步、全双工的串行外设接口
- 
---- 
- 
 SPI(Serial Peripheral Interface - 同步外设接口)总线是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,虽然没有正式的国际标准,但这种接口协议由Motorola发明迄今经过很多厂商的支持,已经成了一种事实标准,被广泛用于各种[[MCU]]处理器中,同传感器,串行[[ADC]]、[[DAC]]、存储器、SD卡以及LCD等进行数据连接。由于没有统一的国际标准,SPI出现了很多不同的协议选项,例如不同的Word大小;每个设备都有自己的协议定义,包括是否支持命令;有些设备只发送,其它的则只是接收;有的片选是高有效,有的则是低有效;有的协议先发送最低位。 SPI(Serial Peripheral Interface - 同步外设接口)总线是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,虽然没有正式的国际标准,但这种接口协议由Motorola发明迄今经过很多厂商的支持,已经成了一种事实标准,被广泛用于各种[[MCU]]处理器中,同传感器,串行[[ADC]]、[[DAC]]、存储器、SD卡以及LCD等进行数据连接。由于没有统一的国际标准,SPI出现了很多不同的协议选项,例如不同的Word大小;每个设备都有自己的协议定义,包括是否支持命令;有些设备只发送,其它的则只是接收;有的片选是高有效,有的则是低有效;有的协议先发送最低位。
 {{ :​spi_lpc.jpg |}}<WRAP centeralign>​ **当前的处理器中几乎都有[[SPI]]和[[I2C]]和[[UART]]接口** </​WRAP>​ {{ :​spi_lpc.jpg |}}<WRAP centeralign>​ **当前的处理器中几乎都有[[SPI]]和[[I2C]]和[[UART]]接口** </​WRAP>​
行 17: 行 14:
 {{ :​spi_640.gif |}}<WRAP centeralign>​ 动画1显示数据从器件A移出到器件B,从器件B移出到器件A. </​WRAP>​ {{ :​spi_640.gif |}}<WRAP centeralign>​ 动画1显示数据从器件A移出到器件B,从器件B移出到器件A. </​WRAP>​
  
-###SPI的技术实现 +### 1. SPI的技术实现
- +
-##### 接口信号+
  
 +#### 1.1 接口信号
 SPI总线定义了4个逻辑信号:​ SPI总线定义了4个逻辑信号:​
   * SCLK: 串行时钟(由主设备输出).   * SCLK: 串行时钟(由主设备输出).
行 35: 行 31:
 {{ :​spi_6402.gif |}} <WRAP centeralign>​ 动画2显示了通过一个虚拟的4通道示波器捕捉的两个器件之间SPI的转换 </​WRAP>​ {{ :​spi_6402.gif |}} <WRAP centeralign>​ 动画2显示了通过一个虚拟的4通道示波器捕捉的两个器件之间SPI的转换 </​WRAP>​
  
-####工作模式+#### 1.2 工作模式
 SPI总线可以工作在一个主设备/一个或多个从设备的模式。 SPI总线可以工作在一个主设备/一个或多个从设备的模式。
 如果只有一个从设备,SS管脚可以直接接地(从设备允许的话),有些从设备需要片选信号的下降沿来启动传输,一个例子就是[[http://​www.maximintegrated.com|美信]]公司的串行ADC [[https://​www.maximintegrated.com/​en/​products/​analog/​data-converters/​analog-to-digital-converters/​MAX1242.html|MAX1242]],通过一个高电平到低电平的转换标记传输的起始。如果有多个从设备,每个从设备需要一个独立的SS信号连接到主设备。 如果只有一个从设备,SS管脚可以直接接地(从设备允许的话),有些从设备需要片选信号的下降沿来启动传输,一个例子就是[[http://​www.maximintegrated.com|美信]]公司的串行ADC [[https://​www.maximintegrated.com/​en/​products/​analog/​data-converters/​analog-to-digital-converters/​MAX1242.html|MAX1242]],通过一个高电平到低电平的转换标记传输的起始。如果有多个从设备,每个从设备需要一个独立的SS信号连接到主设备。
行 43: 行 39:
 {{ :​spi_clocking.jpg |}} <WRAP centeralign>​ SPI的时钟采样 </​WRAP>​ {{ :​spi_clocking.jpg |}} <WRAP centeralign>​ SPI的时钟采样 </​WRAP>​
  
-###### 通过多个从片选信号(SSN)配置+##### 通过多个从片选信号(SSN)配置
 在标准的SPI配置中,主设备可以通过使能相应的从设备,即通过将相应设备的从选择线(SSN或SS)设置为逻辑低电平,通过共享的公共数据线将数据写入各个从设备或由各个从设备中读取数据。 应注意不要同时使能多个从设备,因为返回到主设备的数据将在MISO线路之间的驱动器上产生竞争导致无法进行数据的判读。在某些应用中不需要将数据返回给主设备,在这种情况下,如果主设备想要将相同的数据发送到多个从设备,则可以同时寻址多个从设备。 在标准的SPI配置中,主设备可以通过使能相应的从设备,即通过将相应设备的从选择线(SSN或SS)设置为逻辑低电平,通过共享的公共数据线将数据写入各个从设备或由各个从设备中读取数据。 应注意不要同时使能多个从设备,因为返回到主设备的数据将在MISO线路之间的驱动器上产生竞争导致无法进行数据的判读。在某些应用中不需要将数据返回给主设备,在这种情况下,如果主设备想要将相同的数据发送到多个从设备,则可以同时寻址多个从设备。
  
行 50: 行 46:
 在多从设备选择配置中,每个从设备都需要来自主设备的唯一从设备选择线(SS、SSN或CSn)。如果主设备没有足够的I/​O引脚用于所需数量的从设备,则使用解码/​解复用器(例如74HC(T)238(3到8线)来实现I/​O扩展)。 在多从设备选择配置中,每个从设备都需要来自主设备的唯一从设备选择线(SS、SSN或CSn)。如果主设备没有足够的I/​O引脚用于所需数量的从设备,则使用解码/​解复用器(例如74HC(T)238(3到8线)来实现I/​O扩展)。
  
-###### 菊花链配置+##### 菊花链配置
 在这种配置中,数据从一个设备移动到下一个设备, 最终的从设备可以将数据返回给主设备(给FPGA编程的JTAG在给多个器件编程的时候也常用这种方式)。 在这种配置中,数据从一个设备移动到下一个设备, 最终的从设备可以将数据返回给主设备(给FPGA编程的JTAG在给多个器件编程的时候也常用这种方式)。
  
行 59: 行 55:
 这种配置非常适合于主设备的信号引脚有限的场景。 这种配置非常适合于主设备的信号引脚有限的场景。
  
-####4种传输模式+#### 1.3 4种传输模式
 每次数据传输都是先将SSN(有的器件命名为SS,从选择线)被驱动为逻辑低电平时开始。由时钟的极性(CPOL)和相位(CPHA)构成了4种不同的数据传输模式(0,​1,​2,​3),分别对应四种可能的时钟配置。 每次数据传输都是先将SSN(有的器件命名为SS,从选择线)被驱动为逻辑低电平时开始。由时钟的极性(CPOL)和相位(CPHA)构成了4种不同的数据传输模式(0,​1,​2,​3),分别对应四种可能的时钟配置。
   * CPOL: 时钟的极性,它控制着时钟信号的初始逻辑状态。   * CPOL: 时钟的极性,它控制着时钟信号的初始逻辑状态。
行 77: 行 73:
  
  
-####SPI数据传输的主设备端代码示例+#### 1.4 SPI数据传输的主设备端代码示例
 以下是一段主设备工作于CPOL=0、CPHA=0模式时的数据传输的代码,每次传输为8位,此示例采用C语言。由于工作于CPOL=0, 在片选被选中之前要把时钟拉低,片选信号必须使能,也就是说在数据传输之前要将外设的片选信号电平变低,并在传输结束以后不再“使能”。 多数的外设允许或需要在片选信号选中以后进行多次传输,次子程序也许需要被多次调用。 以下是一段主设备工作于CPOL=0、CPHA=0模式时的数据传输的代码,每次传输为8位,此示例采用C语言。由于工作于CPOL=0, 在片选被选中之前要把时钟拉低,片选信号必须使能,也就是说在数据传输之前要将外设的片选信号电平变低,并在传输结束以后不再“使能”。 多数的外设允许或需要在片选信号选中以后进行多次传输,次子程序也许需要被多次调用。
  
行 120: 行 116:
 </​code>​ </​code>​
  
-###SPI的优点和缺点 +### 2. SPI的优点和缺点 
-####优点+#### 2.1 优点
   * 支持全双工通信   * 支持全双工通信
   * 推挽驱动(跟漏极开路正相反)提供了比较好的信号完整性和较高的速度   * 推挽驱动(跟漏极开路正相反)提供了比较好的信号完整性和较高的速度
行 139: 行 135:
   * 对于时钟的速度没有上限,有进一步提高速度的潜力   * 对于时钟的速度没有上限,有进一步提高速度的潜力
  
-####缺点+#### 2.2 缺点
   * 相比于I²C总线需要更多的管脚,​ 即便是只用到3根线的情况下   * 相比于I²C总线需要更多的管脚,​ 即便是只用到3根线的情况下
   * 没有寻址机制,在共享的总线连接时需要通过片选信号支持多个设备的访问   * 没有寻址机制,在共享的总线连接时需要通过片选信号支持多个设备的访问
行 153: 行 149:
   * 有一些变种比如多路I/​O SPI和下面定义的三线串行总线都是半双工的   * 有一些变种比如多路I/​O SPI和下面定义的三线串行总线都是半双工的
  
-###SPI的主要应用+### 3. SPI的主要应用
  
 与并行I/​O总线相比,SPI能够大大节省电路板的空间,因此在嵌入式系统中发挥了重要作用,对于大多数片上系统处理器而言都是如此,这些处理器都具有较高端的32位处理器,例如使用ARM、MIPS或PowerPC的处理器以及其它微控制器,如AVR、PIC和MSP430等。 这些芯片通常包括能够以主模式或从模式运行的SPI控制器,也可以使用SPI接口对系统内可编程AVR控制器(包括空白控制器)进行编程。 与并行I/​O总线相比,SPI能够大大节省电路板的空间,因此在嵌入式系统中发挥了重要作用,对于大多数片上系统处理器而言都是如此,这些处理器都具有较高端的32位处理器,例如使用ARM、MIPS或PowerPC的处理器以及其它微控制器,如AVR、PIC和MSP430等。 这些芯片通常包括能够以主模式或从模式运行的SPI控制器,也可以使用SPI接口对系统内可编程AVR控制器(包括空白控制器)进行编程。
行 175: 行 171:
 虽然SPI总线和JTAG(IEEE 1149.1-2013)协议之间存在一些相似之处,但它们不可互换。 SPI总线用于器件外设的高速、板载初始化,而JTAG协议旨在通过板外控制器(有着比较低精度的信号延迟和偏斜参数)提供对I/​O引脚的可靠测试访问。 JTAG协议不是严格意义上的电平敏感接口,它通过降低时钟速率或改变时钟的占空比来支持JTAG器件在建立和保持违规的情况下能够恢复。 因此,JTAG接口不是用来支持极高的数据速率的。 虽然SPI总线和JTAG(IEEE 1149.1-2013)协议之间存在一些相似之处,但它们不可互换。 SPI总线用于器件外设的高速、板载初始化,而JTAG协议旨在通过板外控制器(有着比较低精度的信号延迟和偏斜参数)提供对I/​O引脚的可靠测试访问。 JTAG协议不是严格意义上的电平敏感接口,它通过降低时钟速率或改变时钟的占空比来支持JTAG器件在建立和保持违规的情况下能够恢复。 因此,JTAG接口不是用来支持极高的数据速率的。
  
-###协议分析及调试设备+### 4. 协议分析及调试设备
  
-####主适配卡+#### 4.1 主适配卡
 有许多使用USB的硬件解决方案可以利用运行Linux、Mac或Windows的计算机支持SPI主控和/​或从属功能。其中许多还提供脚本和/​或编程功能(Visual Basic,C / C ++,VHDL等)。 有许多使用USB的硬件解决方案可以利用运行Linux、Mac或Windows的计算机支持SPI主控和/​或从属功能。其中许多还提供脚本和/​或编程功能(Visual Basic,C / C ++,VHDL等)。
  
行 198: 行 194:
 ^Dangerous Prototypes |Bus Pirate |USB |1-Wire,​ I2C, SPI, JTAG*, Asynchronous serial, Scriptable binary bitbang, UART |varies | ^Dangerous Prototypes |Bus Pirate |USB |1-Wire,​ I2C, SPI, JTAG*, Asynchronous serial, Scriptable binary bitbang, UART |varies |
  
-####协议分析仪+#### 4.2 协议分析仪
  
 SPI协议分析仪可以对SPI总线进行采样并对电信号进行解码分析,以提供在特定总线上传输的数据的更高级别视图。SPI协议分析仪示例(制造商按字母顺序排列): SPI协议分析仪可以对SPI总线进行采样并对电信号进行解码分析,以提供在特定总线上传输的数据的更高级别视图。SPI协议分析仪示例(制造商按字母顺序排列):
行 208: 行 204:
 ^Total Phase |Promira Serial Platform |USB,​ Ethernet |eSPI |  ^Total Phase |Promira Serial Platform |USB,​ Ethernet |eSPI |
  
-####示波器+#### 4.3 示波器
 每个主要的示波器供应商都为SPI提供了基于示波器的触发和协议解码,大多数支持2线、3线和4线SPI。 触发和解码功能通常作为可选附件提供。SPI信号可通过模拟示波器通道或数字MSO通道进行访问。 每个主要的示波器供应商都为SPI提供了基于示波器的触发和协议解码,大多数支持2线、3线和4线SPI。 触发和解码功能通常作为可选附件提供。SPI信号可通过模拟示波器通道或数字MSO通道进行访问。
  
-####逻辑分析仪+#### 4.4 逻辑分析仪
 在开发和/​或排除SPI总线故障时,检查硬件信号非常重要。 逻辑分析仪是收集、分析、解码和存储信号的工具,因此人们可以用它来查看高速波形。 逻辑分析仪显示每个信号电平变化的时间戳,这有助于发现协议问题。大多数逻辑分析仪都能够将总线信号解码为高级协议数据并显示ASCII数据。 在开发和/​或排除SPI总线故障时,检查硬件信号非常重要。 逻辑分析仪是收集、分析、解码和存储信号的工具,因此人们可以用它来查看高速波形。 逻辑分析仪显示每个信号电平变化的时间戳,这有助于发现协议问题。大多数逻辑分析仪都能够将总线信号解码为高级协议数据并显示ASCII数据。
  
-###相关设计资源参考+### 5. 相关设计资源参考
   * 苏老师公众号文章 - [几种最常用的串行数据传输总线(1)- SPI](https://​mp.weixin.qq.com/​s/​jWbvn-DGR9xrrMHKBqXleQ)   * 苏老师公众号文章 - [几种最常用的串行数据传输总线(1)- SPI](https://​mp.weixin.qq.com/​s/​jWbvn-DGR9xrrMHKBqXleQ)
   * FPGA4FUN上关于如何使用SPI的文章及相应的参考代码 - [[https://​www.fpga4fun.com/​SPI.html|SPI接口]]   * FPGA4FUN上关于如何使用SPI的文章及相应的参考代码 - [[https://​www.fpga4fun.com/​SPI.html|SPI接口]]