• 注册 / 登录
  • 切换到窄版
  • 查看: 1171|回复: 0

    图解SPI总线协议

    [复制链接]

    665

    主题

    679

    帖子

    6476

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6476
    发表于 2024-2-1 20:31:44 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 一路上 于 2024-2-1 21:20 编辑

    一、概述

    SPI(Serial Peripheral Interface)总线是主要应用于嵌入式系统内部通信的串行同步传输总线协议。通常为四线制的SPI总线支持全双工通信。SPI最初由Motorola在2000年提出,Motorola所定义的SPI标准为业界广泛引用,但不同半导体公司的实施细节可能有所不同,这些区别体现在寄存器设置、信号定义、数据格式等。业界没有统一的SPI标准,具体应用需要参考特定器件手册。

    SPI协议特点包括主从模式、全双工通信、片选功能、模式错误标识及CPU中断、缓冲数据寄存器和可配置时钟相位极性等。SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。

    SPI工作原理

    SPI数据传输原理是基于主从设备内部移位寄存器的数据交换;在主设备SCK的控制下,待传数据由各自设备的数据寄存器(Data Register)传输到移位寄存器(Shift Register),再通过MOSI和MISO信号线完成主从设备间的数据交换。

    1.png

    SPI发送与接收流程:主机只向从机进行写操作,可以忽略接收到的从机数据;主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。图2表示基本的SPI设备工作原理示意图,片选信号SS通常低电平有效。

    2.png
    图2. SPI主从模式传输示意图(电路)

    主从设备间数据交换逻辑示意图如下图3所示:

    3.png
    图3. SPI主从模式传输示意图(逻辑)

    图4表示Motorola定义SPI模块的内部框图,其主要构成包括状态/控制/数据寄存器(Status,Control and Data Registers)、移位寄存器(Shifter Logic)、波特率发生器(Baud Rate Generator)、主从控制逻辑(Master/Slave Control Logic)和端口控制逻辑(Port Control Logic)。

    4.png
    图4. SPI模块框图(Motorola)

    硬件拓扑

    单个主设备和单个从设备的SPI连接比较简单,以上图2和图3表示的就是这种拓扑结构。通过多个片选信号(SS)或菊花链方式(Daisy Chain Configuration),单个主设备可以同时控制多个不同从设备。

    1. 片选方式

    如图5示,每个从设备都需要单独的片选信号,主设备每次只能选择其中一个从设备进行通信。因为所有从设备的SCK、MOSI、MISO都是连在一起的,未被选中从设备的MISO要表现为高阻状态(Hi-Z)以避免数据传输错误。由于每个设备都需要单独的片选信号,如果需要的片选信号过多,可以使用译码器产生所有的片选信号。

    5.png
    图5. 主设备以片选方式控制多个从设备

    2. 菊花链方式

    如果只有一个从机选择引脚可用,则从器件可以按菊花链形式排列,如下所示:

    6.png
    图6. 主设备以菊花链方式控制多个从设备

    在菊花链模式下,从机的配置使得所有从机的芯片选择信号绑定在一起,数据从一个从机传播到下一个从机。在此配置中,所有子节点从机接收相同的SPI时钟。来自主机的数据直接连接到第一个从机,该从机向下一个从机提供数据,依此类推。

    在这种方法中,当数据从一个从机传播到下一个从机时,传输数据所需的时钟周期数与菊花链中的从机位置成正比。例如在图7的8位系统中,需要24个时钟脉冲才能在3上使用数据。而第三个从机在常规SPI模式下只有8个时钟脉冲。图中展示了时钟周期和通过菊花链传播的数据,并非所有SPI器件都支持菊花链模式。

    7.png
    图7. 菊花链配置:数据传播

    电源管理

    Motorola在SPI Block Guide中定义以下三种SPI电源模式:运行模式 Run Mode、等待模式 Wait Mode、停止模式 Stop Mode。

    1. 在运行模式下,SPI工作处于正常工作状态。通过修改SPICR1寄存器的SPE位更改此模式:

    1. 0: 禁用SPI模块(进入低功耗状态)
    2. 1: 使能SPI模块
    复制代码

    2. 在等待模式下,修改SPICR2寄存器的SPISWAI位:

    1. 0: 运行模式
    2. 1: 低功耗模式 SPI时钟停止运作
    复制代码

    对于主设备,进入等待模式意味终止SPI总线上所有数据传输,唯有将SPISWAI 重新置为0方可恢复通信;对于从设备,进入等待模式后仍将与主设备保持同步,从设备数据的接收和发送还是正常的。

    3. 在停止模式下,对于主设备,进入停止模式意味着所有总线上通信的终止;对于从设备,进入停止模式后数据的发送和接收还是正常的,仍然与主设备保持同步状态。

    TI在SPI User Guide定义两种低功耗状态:

    • 全局低功耗模式 Global Low-Power Mode
    • 局部低功耗模式 Local Low-Power Mode

    全局低功耗模式受系统控制,此模式下SPI时钟停止,处于完全不作为状态。

    通过写SPI全局寄存器(SPIGCR1)可以是SPI模块进入局部低功耗模式。此模式下,所有寄存器可以正常访问,但SPI的状态机处于停摆状态,数据收发可能异常。软件设置时需要注意不要在收发数据时让SPI进入低功耗模式。

    寄存器说明

    Motorola定义的SPI寄存器包括:
    • SPI Control Register 1 (SPICR1)
    • SPI Control Register 2 (SPICR2)
    • SPI Baud Rate Register (SPIBR)
    • SPI Status Register (SPISR)
    • SPI Data Register (SPIDR)

    其中除了状态寄存器SPISR为只读(Read-only),其它寄存器都是可读写的。通过往寄存器中写入不同的值,设置SPI模块的不同属性。

    1. 控制寄存器1 SPICR1

    8.png
    图8. 控制寄存器1 SPICR1

    1. SPIE — SPI Interrupt Enable Bit
    2. 1 = SPI interrupts enabled
    3. 0 = SPI interrupts disabled

    4. SPE — SPI System Enable Bit
    5. 1 = SPI enabled, port pins are dedicated to SPI functions
    6. 0 = SPI disabled (lower power consumption)

    7. SPTIE — SPI Transmit Interrupt Enable
    8. 1 = SPTEF interrupt enabled
    9. 0 = SPTEF interrupt disabled

    10. MSTR — SPI Master/Slave Mode Select Bit
    11. 1 = SPI is in Master mode
    12. 0 = SPI is in Slave mode

    13. CPOL — SPI Clock Polarity Bit
    14. 1 = Active-low clocks selected. In idle state SCK is high
    15. 0 = Active-high clocks selected. In idle state SCK is low

    16. CPHA — SPI Clock Phase Bit
    17. 1 = Sampling of data occurs at even edges (2,4,6,...,16) of the SCK clock
    18. 0 = Sampling of data occurs at odd edges (1,3,5,...,15) of the SCK clock

    19. SSOE — Slave Select Output Enable
    复制代码

    SSOE 用于主设备设置SS管脚功能,它和MODFEN组合决定主设备SS管脚功能;如表1所示其功能组合:

    b1.png
    表1. SS输入/输出选择

    1. <p>LSBFE — LSB-First Enable</p><p>1 = Data is transferred least significant bit first</p><p>0 = Data is transferred most significant bit first</p>
    复制代码

    2. 控制寄存器2 SPICR2

    9.png
    图9. 控制寄存器1 SPICR2

    1. MODFEN — Mode Fault Enable Bit
    2. 1 = SS port pin with MODF feature
    3. 0 = SS port pin is not used by the SPI

    4. BIDIROE — Output enable in the Bidirectional mode of operation
    复制代码
    控制双向模式(Bidirectional Mode)下主设备的MOSI和从设备MISO的输出缓冲器

    1. 1 = Output buffer enabled
    2. 0 = Output buffer disabled

    3. SPISWAI — SPI Stop in Wait Mode Bit
    4. 1 = Stop SPI clock generation when in wait mode
    5. 0 = SPI clock operates normally in wait mode

    6. SPC0 — Serial Pin Control Bit 0
    复制代码
    控制(单个)数据管脚是否配置为双向模式,与BIDIROE组合控制(单个)数据管脚同时支持收发功能(如下表2)

    b2.png
    表2. MOSI/MISO双向管脚配置

    3. 波特率寄存器 SPIBR

    10.png
    图8. 波特率寄存器 SPIBR

    1. SPPR2–SPPR0 — SPI Baud Rate Preselection Bits
    2. SPR2–SPR0 — SPI Baud Rate Selection Bits
    复制代码

    以上五个寄存器通过下面公式决定波特率除数因子(BaudRateDivisor),进而决定SCK时钟频率。

    除数因子:(通过五个参数计算出来的除数因子不仅包括2^N,还包括4/6/10等总计64个组合)

    计算波特率:

    g1.png

    举例,SPPR[2:0]设为101,SPR[2:0]设为000,计算得除数因子(5+1) * (2^1) = 12。如果系统时钟速率为25MHz,则SCK时钟速率 = 25MHz/12 = 2.0833MHz.

    g2.png

    4. 状态寄存器 SPISR

    11.png
    图11. 状态寄存器 SPISR

    SPISR表征SPI传输状态,只可读,不可写。

    1. SPIF — SPIF Interrupt Flag
    复制代码

    数据byte写入SPI数据寄存器后,此位被置为1。读取数据寄存器后,此位清零。

    1. 1 = New data copied to SPIDR
    2. 0 = Transfer not yet complete
    复制代码
    1. SPTEF — SPI Transmit Empty Interrupt Flag
    2. 1 = SPI Data register empty 表示发送数据寄存器为空,可以接收待发送数据
    3. 0 = SPI Data register not empty 此时忽略任何写入数据寄存器的指令

    4. MODF — Mode Fault Flag
    复制代码

    如表1,错误检测功能使能后,MODF表示检测到SPI模式错误。

    1. 1 = Mode fault has occurred.
    2. 0 = Mode fault has not occurred
    复制代码

    根据Motorola的定义,SPI仅提供一种错误——即模式错误(Mode Fault Error)——的检测机制,通过SS管脚状态判断SPI总线上是否存在两个及以上的设备同时驱动SCK和MOSI。模式错误检测仅适用于主设备(前提是在寄存器中激活此功能)。对于从设备,SS总是作为片选信号的。
    在发生模式错误后(MODF = 1),系统通过写入控制寄存器SPICR1(使设备由Master改为Slave模式,SCK、MISO和MOSI表现为高阻态以避免与总线上其它驱动设备冲突),随后系统自动将此bit置为零(MODF = 0)。

    5. 数据寄存器 SPIDR

    12.png
    图12. 数据寄存器 SPIDR

    SPIDR作为SPI收发两用的寄存器,数据在写入SPIDR后进入待传输队列,队列中的数据字节在前面数据传输结束后立即进行传输。状态寄存器SPISR的SPTEF位表示数据寄存器可以接收新数据。数据寄存器接收数据完毕后将SPIF置为1。

    如果SPIF已经置为1,但服务并未运行(not serviced),则下一个(第二个)接收的数据字节将暂存在移位寄存器中直到下次传输。数据寄存器中的数据字节不变。

    如果SPIF已经置为1,并且移位寄存器中已经暂存数据(即第二个数据字节),并且SPIF服务在第三个数据字节传输前完成,则移位寄存器中的数据(即第二个数据字节 )正常写入数据寄存器,SPIF仍保持置位状态(高),如图13所示;

    13.png
    图13. SPIF服务及时完成

    如果SPIF已经置为1,并且移位寄存器中已经暂存数据(即第二个数据字节),并且SPIF服务在第三个数据字节传输后完成,则移位寄存器中的数据(即第二个数据字节 )遭破坏,不能正常写入到数据寄存器,SPIF仍保持置位状态(高),如图14所示 。

    14.png
    图14. SPIF服务未及时完成

    六、SPI传输模式

    通过设置控制寄存器SPICR1中的CPOL和CPHA位,将SPI可以分成四种传输模式。

    CPOL,即Clock Polarity,决定时钟空闲时的电平为高或低。对于SPI数据传输格式没有显著影响。

    1. 1 = 时钟低电平时有效,空闲时为高
    2. 0 = 时钟高电平时有效,空闲时为低
    复制代码

    CPHA,即Clock Phase,定义SPI数据传输的两种基本模式。

    1. 1 = 数据采样发生在时钟(SCK)偶数(2,4,6,...,16)边沿(包括上下边沿)
    2. 0 = 数据采样发生在时钟(SCK)奇数(1,3,5,...,15)边沿(包括上下边沿)
    复制代码

    四种模式如下图15所示。先看第一列两张图(CPHA = 0),采样发生在第一个时钟跳变沿,即数据采样发生在SCK奇数边沿;再看第二列(CPHA =1),采样发生在第二个时钟跳变沿,即数据采样发生在SCK偶数边沿。第一行两张图(CPOL = 0),SCK空闲状态为低电平,第二行两张图(CPOL = 1),SCK空闲状态为高电平。

    主从设备进行SPI通讯时,要确保它们的传输模式设置相同。对于某些场合,可能需要调整CPOL/CPHA设置以满足设备特定要求。

    15.png
    图15. SPI四种传输模式

    时序要求

    具体时序要求参考器件手册。以下Motorola标准对CPHA = 0(图16)和CPHA =1(图17)不同设置时序的简要说明:

    1. CPHA = 0

    • 有些器件在片选后数据立即出现在MOSI/MISO管脚,数据锁存于第一个时钟边沿。
    • 片选SS先于SCK半个时钟有效。
    • 在SCK的第二个时钟边沿,上个时钟边沿锁存的数据写入移位寄存器(MSB或LSB)。
    • 以此类推,数据在奇数边沿锁存,在偶数边沿写入移位寄存器。
    • 经过16个时钟边沿后,串行传输的数据全部写入(并行的)移位寄存器,完成主从设备的数据交换。

    16.png
    图16. SPI时钟模式(CPHA = 0)

    2. CPHA = 1

    • 有些设备要求数据输出在SCK第一个时钟边沿之后,数据锁存于第二个时钟边沿。
    • 片选SS先于SCK半个时钟有效。
    • 在SCK的第三个时钟边沿,上个时钟边沿锁存的数据写入移位寄存器(MSB或LSB)。
    • 以此类推,数据在偶数边沿锁存,在奇数边沿写入移位寄存器。
    • 经过16个时钟边沿后,串行传输的数据全部写入(并行的)移位寄存器,完成主从设备的数据交换。

    17.png
    图17. SPI时钟模式(CPHA = 1)

    SPI通信过程

    简要说明ST和Spansion器件的SPI通讯过程。

    1. STMicroelectronics

    ST SPI规范定义,在系统启动后,主设备读取从设备8位SPI寄存器以确定从设备字长(16,24或32bit)及其它特性。每个帧(读/写)包括1个操作字节(Instruction Byte)和紧接着的1-3个数据字节(Data Byte)。

    操作字节可能是指令字节或全局状态字节。记住指令字节总是出现在(主从)设备的输入管脚(SDI),全局状态字节总是出现在(主从)设备的输出管脚(SDO)。

    • Command Byte 指令字节

    18.png
    图18. 指令字节格式

    指令字节前2位OC0/OC1指定SPI操作的四种类型,包括写操作、读操作、读和复位状态操作、读取设备信息操作;
    指令字节后6位Ax指定操作对象(RAM/ROM)的地址。

    • Global Byte 全局状态字节

    19.png
    图19. 全局状态字节格式

    指示设备状态信息,如工作模式、通讯错误等。

    如下图20读写操作数据帧格式。对于写操作,SDO输出全局变量字节之后紧接着地址寄存器中先前缓存的数据;对于读操作,全局变量字节后紧接着寻址待取的数据。

    20.png
    图20. SPI读写操作(ST)

    2. Spansion

    以常见的SPI接口Flash为例。如图21所示,在CS#低有效后,基于操作模式,决定在SCK的上升或下降沿触发采样数据。8位指令字节后紧接着24位地址,寻址Flash内部存储块。随着Flash容量增大,可能需要更多的寻址位。比如Micron的N25Q等器件,需要使能4 Byte地址模式以支持容量在128Mbit以上的器件。(单个地址寻址对应1 Byte数据,则24位地址寻址最大2^24 = 16 M Byte = 128Mbit)。

    21.png
    图21. SPI读操作(Spansion Flash)

    复位和中断

    复位后,寄存器值恢复初始状态(以上寄存器表下方所列出)。对于从设备,如果复位后不对SPIDR写入数据,它将输出随机数据或复位前从主设备接收到的数据;复位后SPIDR的数据全部清零。

    SPI的中断向量和优先级因设备而异。中断请求由状态寄存器SPISR中MODF、SPIF和SPTEF位逻辑或产生。

    协议分析

    利用示波器或逻辑分析仪的SPI协议分析功能(电气特性 & 译码),可以快速定位通信链路上出现的问题。示波器支持不同的触发方式,以Tektronix示波器为例,其支持SPI的触发方式包括:

    1. SS触发,基于片选信号状态变化触发
    2. SOF触发,根据时钟空闲时间确定Start Of a Frame触发
    3. MOSI触发,基于MOSI上特定的数据格式触发
    4. MISO触发,基于MISO上特定数据格式触发
    5. MOSI/MISO触发,基于MOSI和MISO上特定数据格式触发
    复制代码

    十一I2C & JTAG

    SPI和I2C,JTAG对比参考表3:

    Architecture
    Feature
    Multi- Master
    Data Rate
    Flyby Data  Transfer
    Full Duplex
    2 shared uni-directional data signals and a shared clock
    Bi-directional  communication on share bus
    Possible,  but not standard
    1  Mbps
    No
    Yes
    Shared data signal, and a shared clock signal
    Bi-directional  communication on shared bus
    Yes
    100  kbps,400 kbps,3.2 Mbps
    Yes
    No
    Daisy Chain data signal
    Can  verity device connectity,in-circuit emulation, device configuration, and  internal device functional testing
    No
    10-100MHz
    N/A
    N/A
    表3. SPI, I2C和JTAG协议概览

    十二结语

    优点
    缺点
    支持全双工通信
    相比I2C两根线,SPI四根线更多
    Push-Pull驱动性能相比Open Drain信号完整性更好,支持高速应用(100MHz以上)
    没有寻址机制,只能靠设备片选(chip  select)选择不同从设备
    协议支持字长不限于8bits,可根据应用特点灵活选择消息字长
    没有数据流控制(但主设备可以通过延缓时钟边缘降低传输速度)
    硬件连接简单
    没有从设备接收数据ACK,主设备对于发送成功与否不得而知
    只需要四根信号线(部分应用可以缩减到三根)
    典型应用只支持单主控
    相比I2C和SMbus节省上拉电阻
    没有定义数据校验机制
    相比I2C和SMbus不需要仲裁机制
    没有统一的国际组织维护,变种多不利于不同厂商设备的互操作性(interoperability)
    从设备使用主设备时钟,节约时钟要求
    相比于RS232、RS422、RS485和CAN,SPI传输距离短
    从设备无需地址寻址
    不支持热插拔
    无需收发器
    中断操作只能通过额外的信号线,或类似USB  1.1 and 2.0的Periodic Polling实现
    表4.优点和缺点

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2024-9-17 03:42 , Processed in 0.053069 second(s), 21 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表