一、简介

SPI(serial peripheral interface)是一种同步串行通信协议,由一个主设备和一个或多个从设备组成,主设备启动与从设备的同步通信,从而完成数据的交换。SPI是一种高速全双工同步通信总线,标准的SPI仅仅使用4个引脚,主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间。有迹象表明,SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。由于在芯片中只占用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间。 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术。
file

二、硬件特性

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作.

1、引脚定义

①、MOSI – Master数据输出,Slave数据输入

②、MISO – Master数据输入,Slave数据输出

③、SCK – 时钟信号,由Master产生

④、CS – Slave使能信号,由Master控制。

2、单个从设备硬件连接

file

3、多个从设备硬件连接

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

②、菊花链方式:数据信号经过主从设备所有的移位寄存器构成闭环。数据通过主设备发送(绿色线)经过从设备返回(蓝色线)到主设备。在这种方式下,片选和时钟同时接到所有从设备,通常用于移位寄存器和LED驱动器。

注意,菊花链方式的主设备需要发送足够长的数据以确保数据送达到所有从设备。切记主设备所发送的第一个数据需(移位)到达菊花链中最后一个从设备。

菊花链式连接常用于仅需主设备发送数据而不需要接收返回数据的场合,如LED驱动器。在这种应用下,主设备MISO可以不连。如果需要接收从设备的返回数据,则需要连接主设备的MISO形成闭环。同样地,切记要发送足够多的接收指令以确保数据(移位)送达主设备。
file

4、SPI易犯错误

file

由SPI的内部硬件框图可知,SPI的输入引脚和输出引脚名字没有直接的划分,只要能够保证正确的数据流,名字是自己起的(为了避免出现错误建议还是按照常用定义来使用)。

三、软件特性

1、数据输出模式

SPI总线传输一共有4中模式,这4种模式分别由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)来定义,其中CPOL参数规定了SCK时钟信号空闲状态的电平,CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采样。

模式0:CPOL= 0,CPHA=0。SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

模式1:CPOL= 0,CPHA=1。SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式2:CPOL= 1,CPHA=0。SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式3:CPOL= 1,CPHA=1。SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

其中比较常用的模式是模式0和模式3。为了更清晰的描述SPI总线的时序,下面展现了模式3下的SPI时序图:
file

四、 SPI的优点和缺点

使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,应该根据项目的要求知道何时使用SPI:

优点:

①、没有启动和停止位,因此数据可以连续流式传输而不会中断。

②、没有复杂的从机寻址系统,如I2C。

③、比I2C更高的数据传输速率(几乎快两倍)。

④、单独的MISO和MOSI线,因此可以同时发送和接收数据。

缺点:

①、使用四根线(I2C和UART使用两根)。

②、无法确认数据已成功接收(I2C已执行此操作)。

③、没有错误检查,如UART中的奇偶校验位。

④、仅允许单个主机。

五、常规寄存器

1. 控制寄存器1 SPICR1

file
SPIE — SPI中断启用位
1 = SPI中断已启用
0 = SPI中断已禁用

SPE — SPI系统启用位
1 = 启用SPI,端口引脚专用于SPI功能
0 = 禁用SPI(降低功耗)

SPTIE — SPI传输中断启用
1 = SPTEF中断已启用
0 = SPTEF中断已禁用

MSTR — SPI主/从模式选择位
1 = SPI处于主模式
0 = SPI处于从属模式

CPOL — SPI时钟极性位
1 = 已选择低电平时钟。在空闲状态下,SCK高.
0 = 已选择活动的高时钟。在空闲状态下,SCK低A.

CPHA — SPI时钟相位位
1 = 数据采样发生在SCK时钟的偶数边缘(2、4、6、…、16)
0 = 数据采样发生在SCK时钟的奇数边缘(1、3、5、…、15)

SSOE — 从属选择输出启用
SSOE 用于主设备设置SS管脚功能,它和MODFEN组合决定主设备SS管脚功能。如表1所示其功能组合:
file

LSBFE — LSB首次启用
1 = 数据首先传输最低有效位。
0 = 首先传输数据的最高有效位。

2. 控制寄存器2 SPICR2

file
MODFEN — 模式故障使能位
1 = 带MODF功能的SS端口引脚。
0 = SPI未使用SS端口引脚。

BIDIROE — 双向操作模式下的输出启用
控制双向模式(Bidirectional Mode)下主设备的MOSI和从设备MISO的输出缓冲器
1 = 输出缓冲区已启用
0 = 输出缓冲区已禁用

SPISWAI — SPI停止在等待模式位
1 = 在等待模式下停止SPI时钟生成
0 = SPI时钟在等待模式下正常工作

SPC0 — 串行引脚控制位0
控制(单个)数据管脚是否配置为双向模式,与BIDIROE组合控制(单个)数据管脚同时支持收发功能(如下表2)
file

3. 波特率寄存器 SPIBR

SPPR2–SPPR0 — 波特率预选位
SPR2–SPR0 — 波特率选择位

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

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

计算波特率:
file

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

4. 状态寄存器 SPISR

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

SPIF — SPIF中断标志
数据byte写入SPI数据寄存器后,此位被置为1。读取数据寄存器后,此位清零。
1 = 新数据复制到SPIDR
0 = 传输尚未完成

SPTEF — SPI 传输空中断标志
1 = 表示发送数据寄存器为空,可以接收待发送数据
0 = 此时忽略任何写入数据寄存器的指令

MODF — 模式故障标志
如表1,错误检测功能使能后,MODF表示检测到SPI模式错误。
1 = 出现模式故障。
0 = 未发生模式故障

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

5. 数据寄存器 SPIDR

file
SPIDR作为SPI收发两用的寄存器,数据在写入SPIDR后进入待传输队列,队列中的数据字节在前面数据传输结束后立即进行传输。状态寄存器SPISR的SPTEF位表示数据寄存器可以接收新数据。数据寄存器接收数据完毕后将SPIF置为1。
如果SPIF已经置为1,但服务并未运行(not serviced),则下一个(第二个)接收的数据字节将暂存在移位寄存器中直到下次传输。数据寄存器中的数据字节不变。

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注