SPI通信协议

串行外设接口(SPIV3)模块描述

1.1简介

SPI组件允许MCU与外设之间进行同步串行通信。软件可以轮询SPI状态标识或可以中断驱动的SPI操作。

 

1.1.1特性

SPIV3包含以下特性:

  • 主模式与从模式
  • 准模式
  • 从选择输出
  • 带有CPU中断能力的模式故障标识位
  • 双缓冲数据寄存器
  • 串行时钟的极性与相位可编程
  • 等待模式下的SPI操作控制

 

1.1.2操作模式

SPI工作在3中模式下,分别是运行、等待和停止。

  • 运行模式(Run Mode)

这是基本的操作模式

  • 等待模式(Wait Mode)

SPI工作在等待模式是一种可配置的低功耗模式,可以通过SPICR2寄存器的SPISWAI位进行控制。在等待模式下,如果SPISWAI位清0,SPI操作类似于运行模式。如果SPISWAI位置1,SPI进入低功耗状态,并且SPI时钟将关闭。如果SPI配置为主机,所有的传输将停止,但是会在CPU进入运行模式后重新开始。如果SPI配置为从机,会继续接收和传输一个字节,这样就保证从机与主机同步。

  • 停止模式(Stop Mode)

为了降低功耗,SPI在停止模式是不活跃的。如果SPI配置为主机,正在进行的传输会停止,但是在CPU进入运行模式后会重新开始。如果SPI配置为从机,会继续接受和发送一个字节,这样就保证了从机与主机同步。

这里只是一个简要的描述,详细的操作模式会在“1.4 功能描述”一节中说明。

 

1.1.3 方框图

图1-1给出了SPI结构的整体概述。SPI的主要部分是状态、控制、数据寄存器、转换逻辑、波特率发生器、主/从控制逻辑和端口控制逻辑。

SPI通信协议_第1张图片

图1-1 SPI方框图

 

1.2 外部信号描述

这一部分列出所有连接或断开芯片的输入/输出引脚的名称与描述。SPIV3模块共有4个外部信号。

 

1.2.1 MOSI——主机输出/从机输入

SPI模块配置为主机时,该引脚用于发送数据;当SPI配置为从机时,该引脚用于接收数据。

 

1.2.2 MISO——主机输入/从机输出

SPI模块配置为主机时,该引脚用于接收数据;当SPI配置为从机时,该引脚用于发送数据。

 

1.2.3 S(—)S(—)——从机选择引脚

SPI配置为主机时,该引脚用于向其它进行数据传输的外设输出一个片选信号。SPI作为从机时,该引脚作为输入用于接收从机选择信号。

 

1.2.4 SCK——串行时钟引脚

该引脚用于输出传输数据的时钟,作为从机时,为接收时钟。

 

1.3 内存映射和寄存器定义

这一节对SPI使用的地址空间与寄存器进行详细的说明。

SPIV3的内存映射如表1-1所示。列出的每个寄存器地址都是基地址与地址偏移的和。基地址是SoC级的定义,地址偏移是定义在模块级的。对保留位进行读操作返回0,对保留位进行写操作无效。

 

1.3.1模块内存映射

表1-1 SPIV3内存映射

地址

使用

访问

0x0000

SPI控制寄存器1(SPICR1)

R/W

0x0001

SPI控制寄存器2(SPICR2)

R/W1

0x0002

SPI波特率寄存器(SPIBR)

R/W1

0x0003

SPI状态寄存器(SPISR)

R2

0x0004

保留

—2,3

0x0005

SPI数据寄存器(SPIDR)

R/W

0x0006

保留

—2,3

0x0007

保留

—2,3

1 某些位不可写

2 对此寄存器的写入被忽略

3 从此寄存器进行读取返回0

 

1.3.2寄存器描述

这一节按地址顺序对寄存器进行说明。每个描述包括一个带有相关数字编号的标准寄存器图。寄存器位的详细信息以及域的功能按寄存器框图的位进行排列。

SPI通信协议_第2张图片

图1-2 SPI寄存器概要

 

1.3.2.1 SPI控制寄存器1(SPICR1)

SPI通信协议_第3张图片

图1-3 SPI控制寄存器1(SPICR1)

读取:随时

写入:随时

表1-2 SPICR1域描述

描述

7

SPIE

SPI中断是能位——该位使能SPI中断请求,如果SPIF或MODF状态标志位被设置。

0 SPI中断禁止

1 SPI中断使能

6

SPE

SPI系统使能位——该位使能SPI系统并将SPI端口引脚用于SPI系统功能。如果SPE被清0,SPI将被禁止并被迫进入闲置状态,SPISR寄存器中的状态位被复位。

0 SPI禁止(低功耗)

1 SPI使能,端口引脚用于SPI功能

5

SPTIE

SPI发送中断使能——该位使能SPI中断请求,如果SPIEF标识被设置。

0 SPTEF中断禁止

1 SPTEF中断使能

4

MSTR

SPI主/从模式选择位——如果SPI按主机或从机模式操作,选择该位。从主机切换到从机或迫使SPI系统进入空闲模式。

0 SPI工作在从机模式

1 SPI工作在主机模式

3

CPOL

SPI时钟极性位——该位选择一个倒置或非倒置SPI时钟。要在SPI模块间传输数据,SPI模块必须有相同的CPOL值。在主机模式,这个位的更改将会中止当前传输并迫使SPI系统进入空闲状态。

0 选择高有效。空闲状态SCK为低。

1 选择低有效。空闲状态SCK为低。

2

CPHA

SPI时钟相位位——该位用于选择SPI时钟格式,在主机模式中,更改这个位将会中止当前传输并迫使SPI系统进入空闲状态。

0 数据采样发送在SCK时钟的奇数边(1、3、5、…、15)

1 数据采样发送在SCK时钟的奇数边(2、4、6、…、16)

1

SSOE

从机选择输出使能——仅在主机模式中可以使能S(—)S(—)的输出特征,如果MODFEN被设置,作用取决于表1-3的SSOE。在主机模式中,更改该位将会中止当前传输并迫使SPI系统进入空闲状态。

0

LSBFE

LSB优先使能——该位不会影响MSB与LSB在数据寄存器中的位置。读取和写入数据寄存器总是从bit7的MSB开始。在主机模式中,更改该位将会中止当前传输并迫使SPI系统进入空闲状态。

0 优先发送数据的高位

1 优先发送数据的低位

表1-3 S(—)S(—)输入/输出选择

MODFEN

SSOE

主机模式

从机模式

0

0

S(—)S(—)不用于SPI

S(—)S(—)输入

0

1

S(—)S(—)不用于SPI

S(—)S(—)输入

1

0

S(—)S(—)是带有MODF特征的输入

S(—)S(—)输入

1

1

S(—)S(—)作为从机选择输出

S(—)S(—)输入

 

1.3.2.2 SPI控制寄存器2(SPICR2)

SPI通信协议_第4张图片

图1-4 SPI控制寄存器2(SPICR2)

读取:随时

写入:随时,写入保留位无效

表1-4 SPICR2域描述

描述

4

MODFEN

模式故障使能位——该位允许MODF特征被检测到。如果SPI工作在主机模式并且MODFEN被清0,S(—)S(—)端口不用于SPI。在从机模式中,S(—)S(—)仅作为输入,不受MODFEN的影响。MODFEN对端口S(—)S(—)的影响请参考表1-3。在主机模式中,更改该位将中止当前传输并迫使SPI进入空闲状态。

0 S(—)S(—)端口不用于SPI

1 S(—)S(—)端口带有MODF特征

3

BIDIROE

在双向模式中使能输出——工作在双向模式时(SPC0被设置),该位控制SPI的MOSI和MISO输出缓存。在主机模式中该位控制MOSI端口的输出缓存,在从机模式中该位控制MISO端口的输出缓存。主机模式中如果SPC0被设置,对该位的更改将会中止当前传输并迫使SPI进入空闲状态。

0 输出缓存禁用

1 输出缓存使能

2

SPISWAI

等待模式下的SPI停止位——在等待模式下,该位用于低功耗模式。

0 SPI时钟在等待模式中正常工作

1在等待模式中停止产生SPI时钟

0

SPCO

串行引脚控制位0——该位使能双向引脚配置,如表1-5所示。在主机模式中,对该位的更改将会中止当前传输并迫使SPI进入空闲模式。

 

表1-5 双向引脚配置

引脚模式

SPC0

BIDIROE

MISO

MOSI

主机模式

正常

0

X

主机输入

主机输出

双向

1

0

MISO不用于SPI

主机输入

1

主机输入/输出

从机模式

正常

0

X

从机输出

从机输入

双向

1

0

从机输入

MOSI不用于SPI

1

从机输入/输出

 

1.3.2.3 SPI波特率寄存器(SPIBR)

SPI通信协议_第5张图片

图1-5 SPI波特率寄存器(SPIBR)

读取:随时

写入:随时,写入保留位无效

表1-6 SPIBR域描述

描述

6:4

SPPR[2:0]

SPI波特率预选位——这些位指定SPI的波特率,如表1-7所示。在主机模式中,更改这些位会中止当前传输并迫使SPI系统进入空闲状态。

2:0

SPR[2:0]

SPI波特率选择位——这些位指定SPI的波特率,如表1-7所示。在主机模式中,更改这些位会中止当前传输并迫使SPI系统进入空闲状态。

波特率的除数方程式如下:

BaudRateDivisor = (SPPR+1)•2(SPR+1)

波特率可以根据以下公式计算:

Baud Rate = BusClock ⁄ BaudRateDivisor

表1-7 可选SPI波特率示例(25MHz总线时钟)

SPPR2

SPPR1

SPPR0

SPR2

SPR1

SPR0

Baud Rate Divisor

Baud Rate

0

0

0

0

0

0

2

12.5 MHz

0

0

0

0

0

1

4

6.25 MHz

0

0

0

0

1

0

8

3.125 MHz

0

0

0

0

1

1

16

1.5625 MHz

0

0

0

1

0

0

32

781.25 kHz

0

0

0

1

0

1

64

390.63 kHz

0

0

0

1

1

0

128

195.31 kHz

0

0

0

1

1

1

256

97.66 kHz

0

0

1

0

0

0

4

6.25 MHz

0

0

1

0

0

1

8

3.125 MHz

0

0

1

0

1

0

16

1.5625 MHz

0

0

1

0

1

1

32

781.25 kHz

0

0

1

1

0

0

64

390.63 kHz

0

0

1

1

0

1

128

195.31 kHz

0

0

1

1

1

0

256

97.66 kHz

0

0

1

1

1

1

512

48.83 kHz

0

1

0

0

0

0

6

4.16667 MHz

0

1

0

0

0

1

12

2.08333 MHz

0

1

0

0

1

0

24

1.04167 MHz

0

1

0

0

1

1

48

520.83 kHz

0

1

0

1

0

0

96

260.42 kHz

0

1

0

1

0

1

192

130.21 kHz

0

1

0

1

1

0

384

65.10 kHz

0

1

0

1

1

1

768

32.55 kHz

0

1

1

0

0

0

8

3.125 MHz

0

1

1

0

0

1

16

1.5625 MHz

0

1

1

0

1

0

32

781.25 kHz

0

1

1

0

1

1

64

390.63 kHz

0

1

1

1

0

0

128

195.31 kHz

0

1

1

1

0

1

256

97.66 kHz

0

1

1

1

1

0

512

48.83 kHz

0

1

1

1

1

1

1024

24.41 kHz

1

0

0

0

0

0

10

2.5 MHz

1

0

0

0

0

1

20

1.25 MHz

1

0

0

0

1

0

40

625 kHz

1

0

0

0

1

1

80

312.5 kHz

1

0

0

1

0

0

160

156.25 kHz

1

0

0

1

0

1

320

78.13 kHz

1

0

0

1

1

0

640

39.06 kHz

1

0

0

1

1

1

1280

19.53 kHz

1

0

1

0

0

0

12

2.08333 MHz

1

0

1

0

0

1

24

1.04167 MHz

1

0

1

0

1

0

48

520.83 kHz

1

0

1

0

1

1

96

260.42 kHz

1

0

1

1

0

0

192

130.21 kHz

1

0

1

1

0

1

384

65.10 kHz

1

0

1

1

1

0

768

32.55 kHz

1

0

1

1

1

1

1536

16.28 kHz

1

1

0

0

0

0

14

1.78571 MHz

1

1

0

0

0

1

28

892.86 kHz

1

1

0

0

1

0

56

446.43 kHz

1

1

0

0

1

1

112

223.21 kHz

1

1

0

1

0

0

224

111.61 kHz

1

1

0

1

0

1

448

55.80 kHz

1

1

0

1

1

0

896

27.90 kHz

1

1

0

1

1

1

1792

13.95 kHz

1

1

1

0

0

0

16

1.5625 MHz

1

1

1

0

0

1

32

781.25 kHz

1

1

1

0

1

0

64

390.63 kHz

1

1

1

0

1

1

128

195.31 kHz

1

1

1

1

0

0

256

97.66 kHz

1

1

1

1

0

1

512

48.83 kHz

1

1

1

1

1

0

1024

24.41 kHz

1

1

1

1

1

1

2048

12.21 kHz

注意

1.3.2.4 SPI状态寄存器(SPISR)

SPI通信协议_第6张图片

图1-6 SPI状态寄存器(SPISR)

读取:随时

写入:无效

表1-8 SPISR域描述

描述

7

SPIF

SPIF中断标识位——接收到的数据字节已传输到SPI数据寄存器,置起该位。通过读取SPISR寄存器可以清除该位(SPIF被置起),随后是对SPI数据的读取访问。

0 传输未完成

1 新数据已复制到SPIDR

5

SPTEF

SPI空传中断标识位——如果置起,该位表示发送数据寄存器为空。要清除该位并向发送数据寄存器写入数据,SPISR的SPTEF读取值必须为1,然后才可以写入SPIDR。对SPTEF读取不为1,此时对SPI数据寄存器的写操作是被忽略的。

0 SPI数据寄存器非空

1 SPI数据寄存器为空

4

MODF

模式故障标识位——当SPI配置为主机且模式故障检查被使能时,S(—)S(—)输入变为低时该位被置起,SPICR2寄存器的MODFEN为被设置。请参考“1.3.2.2 SPI控制寄存器(SPICR2)”的MODFEN位描述。通过读取SPI状态寄存器(MODF被置起)可以自动清除该位,其后跟随着对SPI控制寄存器1的写入操作。

0 模式故障未发生

1 模式故障已发生

 

1.3.2.5 SPI数据寄存器(SPIDR)

SPI通信协议_第7张图片

图1-7 SPI数据寄存器(SPIDR)

读取:随时,通常仅在SPIF被置起后读取

写入:随时

SPI数据寄存器同时作为SPI数据的输入和输出寄存器。写入该寄存器的数据将会等待发送。当SPI配置为主机时,等待的数据会在上一次发送完成后立即发送。当SPI数据寄存器可以接受新数据时,SPISR寄存器中的SPI空传标识位SPTEF将会指示。

1.4功能说明

SPI模块允许MCU与外设进行双工同步串行通信。软件可以轮询SPI状态标识位或可被中断驱动的SPI操作。

SPI系统通过设置SPI控制寄存器1的SPI使能位(SPE)进行使能。当SPE位被设置时,4个相关的SPI引脚专用于SPI功能:

  • 从机选择(S(—)S(—))
  • 串行时钟(SCK)
  • 主机输出/从机输入(MOSI)
  • 主机输入/从机输出(MISO)

SPI系统的主要元件是SPI数据寄存器。主机和从机的8位数据寄存器分别连接在MOSI和MISO引脚上形成一个分布式16位寄存器。当执行数据传输操作时,该16位寄存器被主机的S时钟连续移动8位,实现主机与从机的数据交换。写入SPI数据寄存器的数据成为发向从机的输出数据,在传输操作完成后从主机SPI数据寄存器读取的数据是来自从机的输入数据。

先对SPISR进行读取操作(SPTEF = 1)然后将数据写入SPIDR可将数据放入传输寄存器。当传输完成后,接收的数据已被移动到接收数据寄存器。在下次传输开始前,随时可以将数据从该双缓存系统中读出。对该8位寄存器进行读取,该寄存器将作为SPI接收数据寄存器;对该寄存器进行写入,该寄存器将作为SPI传输数据寄存器。一个SPI寄存器地址会用于从读数据缓存器读取数据或向传输数据寄存器写入数据。

通过SPI控制寄存器1(SPICR1)中的时钟相位控制位(CPHA)和时钟极性控制位(CPOL)对SPI系统使用的4种时钟格式进行选择。CPOL位选择非倒置或倒置时钟。CPHA位用于控制在奇数SCK边或偶数SCK边上采样数据,以适应两个根本不同的协议(参考1.4.3 传输格式)。

SPI可以配置为主机或从机。当SPI控制寄存器1的MSTR位被置1,设置为主机模式,MSTR位清0,选择为从机模式。

 

1.4.1 主机模式

当MSTR位置1是SPI工作在主机模式。仅主机的SPI模块可以启动发送。通过向SPI数据寄存器写入数据可启动传输。如果位移寄存器为空,字节数据会立即传输到位移寄存器。字节数据在串行时钟的控制下开始从MOSI引脚移出。

  • S-时钟

波特率选择位SPR2、SPR1和SPR0联合SPI波特率寄存器中的波特率预选位SPPR2、SPPR1和SPPR0来控制波特率发生器确定传输速度。SCK引脚是SPI时钟输出。通过SCK引脚,主机的波特率发生器可以控制从机外设的位移寄存器。

  • MOSI与MISO引脚

在主机模式中,串行数据输出脚(MOSI)和串行数据输入脚(MISO)的功能由SPC0和BIDIROE控制位决定。

  • S(—)S(—)引脚

如果MODFEN和SSOE位被置起,SS脚被配置为从机选择输出。在传输期间SS输出转为低电平,SPI为空闲状态时为高电平。

如果MODFEN被置起,SSOE被清零,SS脚配置为输入,用来检测模式故障。在其它主机尝试驱动MOSI和SCK线时,如果SS输入转为低电平就表示是模式故障错误。这种情况下,SPI将立即切换至从机模式,通过清除MSTR位也可以禁用从机输出缓存MISO(或双向模式的SISO)。因此,结果就是所有输出被禁用,SCK、MOSI和MISO作为输入。如果模式故障发生时正在进行传输,传输被中止并且SPI被强制转为空闲模式。

 

该模式故障会置起SPI状态寄存器(SPISR)的模式故障(MODF)标识。如果MODF标识被设置时,SPI的中断使能位(SPIE)是置起的,就会发起一个SPI中断序列请求。

在主机模式中,当对SPI数据寄存器进行写操作时,会有半个SCK周期的延时。延时过后,SCK在主机中启动。根据SPI控制寄存器1的SPI时钟相位位CPHA指定的时钟格式不同,位移操作略有不同(参考1.4.3 传输格式)。

 

注意

在主机模式中,更改CPOL, CPHA, SSOE, LSBFE, MODFEN, SPC0,BIDIROE(SPC0置起时),SPPR2–SPPR0和SPR2–SPR0将会立即中止当前传输并迫使SPI进入空闲模式。远程从机是无法检测到这种情况的,因此,主机必须确保远程从机设置为空闲模式。

 

1.4.2 从机模式

当SPI控制寄存器1的MSTR位清除时,SPI工作在从机模式。

  • SCK时钟

在从机模式下,SCK是来自主机的SPI时钟输入脚。

  • MISO与MOSI引脚

在从机模式下,串行数据输出脚(MISO)和串行数据输入脚(MOSI)的功能由SPI控制寄存器2的SPC0和BIDIROE控制位决定。

  • SS引脚

SS脚是从机选择输入。在数据传输开始前,从机的SS脚必须为低电平。SS必须保持低电平,直到数据传输完成。如果SS变为高电平,SPI将被迫进入空闲模式。

SS输入也控制着串行数据输出脚,如果SS为高电平(未选择),串行数据输出脚为高阻抗,如果SS为低电平,SPI数据寄存器的第一位被从串行数据输出脚输入。同时,如果未选择从机模式(SS为高电平),SCK输入被忽略,不会发生SPI位移寄存器内部位移。

虽然SPI能够进行双工操作,一些SPI外设也只能在从机模式下接收数据。更简单的设备是没有串行输出脚的。

 

注意

当外设具备双工能力时,注意不要同时使能两个串行输出驱动同一数据输出线的接收设备。

 

只要驱动同一数据输出线的设备不超过一个,那么多个从机同时接收相同主机传输的数据是可能的,虽然此时主机是无法接收所有从机返回信息的。

 

如果SPI控制寄存器1的CPHA位被清除,SCK输入时钟的奇数边沿锁存串行数据输入引脚的数据。偶数边沿将先前从串行数据输入引脚锁存的值转移到SPI移位寄存器的LSB或MSB中,这取决于LSBFE位。

如果CPHA位被置起,SCK输入时钟的偶数边沿锁存串行数据输入引脚的数据。奇数边沿将先前从串行数据输入引脚锁存的值转移到SPI移位寄存器的LSB或MSB中,这取决于LSBFE位。

当CPHA被置起,第一个边沿用于获取串行数据输出线的第一个数据。当CPHA被清除并且SS输入为低电平(选择从机),SPI数据的第一个为被驱动输出到串行数据输出位。8个位移完成后,视为传输结束并且被转移到SPI数据寄存器中。SPI状态寄存器中的SPIF被置起时表示传输完成。

 

注意

在从机模式中,更改CPOL, CPHA, SSOE, LSBFE, MODFEN, SPC0与BIDIROE(SPC0置起)将会中止当前传输,必须避免这种情况。

 

1.4.3 传输格式

在SPI传输期间,数据同时发送(连续移出)和接收(连续移入)。串行时钟(SCK)同步移位并在两条数据线上采样。从机选择线用来选择一个从机设备,未选择的从机设备不会干扰SPI总线活动。在主机设备上,从机选择线可用于表示多主机总线争用。

SPI通信协议_第8张图片

图1-8 主机/从机传输框图

 

1.4.3.1 时钟相位与极性控制

通过SPI控制寄存器1的2个位,软件可以选择4种时钟相位与极性组合的一种。

CPOL时钟极性位指定时钟的高电平或低电平有效,不会影响传输格式。

CPHA时钟相位控制位选择两种传输格式的一种。

主机与从机相连的设备,时钟相位与极性应当相同。在一些情况下,在传输之间改变相位和极性,以允许主设备与具有不同要求的外围从机通信。

 

1.4.3.2 CPHA = 0 传输格式

SCK线的第一个边沿用于记录从机传给主机的第一个数据位以及主机传给从机的第一个数据位。在一些外设中,从机数据输出线上的第一位数据在从机被选择后就是有效的。这种格式中,SCK边沿在SS转为低电平后的半个周期后发出。

SCK半个周期后,第二个边沿出现在SCK线上。当第二个边沿发出时,前一次从串行数据输入脚锁存的值被移入移位寄存器的LSB或MSB中,这取决于LSBFE位。

在第二边沿之后,SPI主机数据的下一位输出到主机的串行数据输出脚,发送给从机的串行数据输入脚。这种过程在SCK线上持续16个边沿,数据在奇数边沿被锁存,在偶数边沿被移位。

数据接收是双缓冲的。在传输过程中数据被连续移入SPI移位寄存器,在最后一位传输完成后移入SPI数据寄存器。

在第16个SCK边沿后:

  • 先前在主机SPI数据寄存器中的数据现在位于从机的数据寄存器中,并且从机的数据寄存器中的数据位于主机数据寄存器中。
  • SPI状态寄存器中的SPIF位置起表示传输完成。

图1-9是SPI传输的时序图,其中CPHA = 0。SCK波形分别对应CPOL=0和CPOL=1。此图可解释为主机或从机的时序图,因为主机和从机的SCK、MISO、MOSI引脚是直接相连的。MISO信号是从从机输出的,MOSI信号是从主机输出的。主机的SS引脚必须为高电平或配置为不影响SPI的其它功能。

SPI通信协议_第9张图片

图1-9 SPI时钟格式0(CPHA = 0)

在从机模式中,如果在连续传输中SS未断开,那么SPI数据寄存器中的内容不会被传输,而是传输上一次接收到的内容。如果SS在传输中中断一个最小空闲时间(半个SCK周期),SPI数据寄存器的内容将被传输。

在主机模式中,从机选择输出使能线SS要在连续传输中中断一个最小空闲时间。

 

1.4.3.3 CPHA = 1传输格式

一些外设在数据输出线上第一个数据位有效前需要一个SCK边沿,第二边沿将数据记录到系统中。这种格式中,第一个SCK边沿是在8位循环移位操作开始前通过设置CPHA位发出的。

第一个SCK边沿在半个SCK时钟周期延时后立即发出。第一个边沿控制从机将第一个数据位发送到主机的串行数据输入脚上。

半个SCK周期后,第二个边沿出现在SCK引脚上。该边沿是主机与从机的锁存边沿。

当第三个边沿出现时,之前从串行数据输入脚上锁存的值将移入SPI移位寄存器的LSB或MSB,这取决于LSBFE位。该边沿结束后,主机数据的下一位将输出到串行数据输出脚上,传输给从机串行输入脚。

这种过程在SCK线上持续16个边沿,数据在偶数边沿被锁存,在奇数边沿被移位。

数据接收使用双缓冲,在传输期间数据连续移入SPI移位寄存器,在最后一位传输完成后移入SPI数据寄存器。

在第16个SCK边沿后:

  • 先前在主机SPI数据寄存器中的数据现在位于从机的数据寄存器中,并且从机的数据寄存器中的数据位于主机数据寄存器中。
  • SPISR寄存器中的SPIF位置起表示传输完成。

图1-10给出CPHA=1时的两种时钟变化。此图可解释为主机或从机的时序图,因为主机和从机的SCK、MISO、MOSI引脚是直接相连的。MISO信号是从从机输出的,MOSI信号是从主机输出的。对于从机,SS线是从机选择输入。主机的SS引脚必须为高电平或配置为不影响SPI的其它功能。

SS线在连续传输时可以保持低电平活跃(随时可以限制为低电平)。该格式在系统仅有一个主机和一个从机时是首选的。

  • 主机模式下的背靠背传输

在主机模式中,如果传输已经完成并且SPI数据寄存器中的新数据是有效的,该字节会立即发送,而不需要最小空闲时间。

SPI中断请求标识(SPIF)同时对主机和从机模式有效。SPIF在最后一个SCK边沿后的半个SCK周期后置起。

SPI通信协议_第10张图片

图1-10 SPI时钟格式1(CPHA=1)

 

1.4.4 SPI波特率发生

波特率产生由多个分频级组成。SPI波特率寄存器的6个位(SPPR2,SPPR1,SPPR0,SPR2, SPR1,SPR0)决定SPI模块时钟分频,由此产生SPI波特率。

SPI时钟速率由产品波特率预选位(SPPR2-SPPR2)和波特率选择位(SPR2-SPR0)决定。模块时钟分频因子公式如图1-11所示。

当所有位清0时(默认状态),SPI模块时钟采样2分频。当选择位(SPR2-SPR0)为001且预选位(SPPR2-SPPR0)为000时,模块时钟采用4分频。当选择位为010,模块时钟采用8分频,如此类推。

当预选位为001,分频因子取决于选择位,并对其乘以2。当预选位为010,分频因子乘以3,如此类推。所有位的波特率计算请参考表1-7,基于25MHz总线时钟。两组选择允许时钟实现2的非幂分频,获得其它波特率,如6分频,10分频。

波特率发生器仅在SPI工作在主机模式并且串行传输进行时激活。其它情况下,驱动被禁止以减少IDD电流。

BaudRateDivisor = (SPPR+1)•2(SPR+1)

图1-11 波特率分频因子公式

 

1.4.5 特殊特征

1.4.5.1 SS输出

在传输期间SS输出自动驱动为低电平来选择外部设备,在空闲时驱动为高断开外部设备。当SS输出被选择,SS输出脚连接到外部设备的SS输入脚。

SS输出仅在主机模式由SSOE和MODFEN生效的正常SPI操作时有效。如表1-3所示。

当SS输出使能时,模式故障被禁用。

 

注意

在多主机系统中使用SS输出时需要小心,因为模式故障不能用于检测主机之间的系统错误。

 

1.4.5.2 双向模式(MOSI或MISO)

当SPI控制寄存器2的SPC0位置起时,选择双向模式(见表1-9)。该模式下,SPI仅使用一个串行数据脚连接外部设备。MSTR位决定使用哪个脚位。对于主机模式,MOSI引脚成为串行数据I/O(MOMI)。对于从机模式,MISO引脚成为串行数据I/O(SISO)。主机模式的MISO和从机模式的MOSI不用于SPI。

表1-9 正常模式与双向模式

SPI通信协议_第11张图片

每个串行I/O的方向由BIDIROE位决定。如果引脚配置为输出,来自移位寄存器的串行数据在引脚上输出。相同的引脚也是移位寄存器的串行输入。

SCK是主机模式的输出,是从机的输入。

SS是主机的输入或输出,对于从机,SS永远是输入。

双线模式不影响SCK与SS功能。

 

注意

双向主机模式中,若模式故障使能,数据线MISO和MOSI可以被SPI占用,虽然MOSI通常用于双向模式传输,MISO不用于SPI。如果模式故障发生,SPI自动切换至从机模式,这种情况下,MISO被SPI占用并且MOSI不被使用。如果MISO用于其它用途,必须要考虑这一点。

 

1.4.6 出错状态

SPI仅有一种错误状态:

  • 模式故障

 

1.4.6.1 模式故障

SPI配置为主机时,如果SS变为低电平,表示多个主机试图同时驱动MOSI和SCK线,这是一个系统错误。这种状态在正常操作中是不允许的,如果MODFEN位被置起,那么SPI状态寄存器中的MODF位会自动置起。

特殊情况下,SPI工作在主机模式但MODFEN位清0,此时SS不用于SPI。这种特殊情况中,模式故障功能被禁止且MODF保持清0。SPI系统配置为从机模式时,SS作为专用输入脚。在从机模式中不会发生模式故障。

如果发生模式故障,SPI会切换至从机模式,但是禁止从机的数据缓冲器。因此SCK、MISO与MOSI引脚强制作为高阻态输入,避免与其它输出设备产生冲突。正在进行的 传输立即中止SPI进入空闲状态。

如果模式故障发生在主机双向模式中,MIMO(MOSI为双向模式)的输出使能会被清除(如果是置起的)。SPI系统配置为从机时不会发生模式故障。

读取SPI状态寄存器并写入SPI控制寄存器1会清除模式故障标识位。如果模式故障标识位被清除,SPI再次成为正常的主机或从机。

 

1.4.7 运行模式的操作

在运行模式中,SPI控制寄存器的SPI系统使能位(SPE)清零时,SPI系统处于低功耗、禁用状态。SPI寄存器保持可访问,但是模块的时钟是禁用的。

 

1.4.8 等待模式的操作

等待模式下的SPI操作取决于SPI控制寄存器2的SPISWAI位。

  • 如果SPISWAI清除,如果CPU处于等待模式时,SPI操作正常。
  • 如果SPISWAI置起,如果CPU处于等待模式时,SPI时钟停止产生,进入低功耗状态。

——如果SPISWAI置位并且SPI配置为主机,在进入等待模式时任何发送和接收将停止。SPI从等待模式退出时发送与接收重新开始。

——如果SPISWAI置起并且SPI配置为从机,如果来自主机的SCK任然存在,当前发送与接收继续进行。保证从机与主机的SCK同步。

如果从机处于等待模式时主机发送多个字节,从机将继续发送进入等待模式前操作模式的内容(例如,如果从机当前向主机发送SPIDR,将会持续发送相同字节。如果从机当前发送的是从主机接收的字节,将继续发送之前主机的字节)。

 

注意

当从机处于等待或停止模式时,希望主机获取数据时需要小心。虽然移位寄存器任然可以操作,但SPI的其它是被关闭的(例如,SPIF中断直到退出停止或等待模式才会发生)。同时,移位寄存器的内容直到从机SPI退出等待或停止模式才会复制到SPIDR寄存器中。只有传输期间进入或退出等待模式才会产生SPIF和复制SPIDR。如果从机从空闲模式进入等待模式以及从等待模式退回到空闲模式,不会产生SPIF标识和SPIDR复制操作。

 

1.4.9 停止模式的操作

停止模式取决于系统。当模块时钟禁用时(保持高电平或低电平)SPI进入停止模式。如果SPI工作在主机模式,并在CPU进入停止模式时进行数据交换,传输会被冻结直到CPU退出停止模式。退出停止模式后,与外部SPI的数据交换是正确的。在从机模式,SPI将与主机同步。

停止模式不受SPISWAI为影响。

 

1.5 重置

寄存器重置值与信号在内存映射和寄存器一节中说明(参考1.3 内存映射与寄存器描述),详细说明了寄存器与位域。

  • 如果从机在重置后未写入SPIDR就进行数据传输,那么会发生一个垃圾数据或发送重置前从主机接收的数据。
  • 重置后读取SPIDR会读到数据0。

 

1.6 中断

SPIV3仅在启用SPI时发出中断请求(SPICR1的SPE位置起)。以下内容说明SPIV3如何产生请求以及MCU如何响应请求。中断向量偏移量与中断优先级与芯片相关。

中断标志位MODF、SPIF与SPTEF是逻辑或的关系产生中断请求。

 

1.6.1 MODF

当主机在SS脚上检测到错误时会产生MODF。主机SPI必须配置MODF(参见表1-3)。MODF置起后,当前传输被中止并更改以下位:

  • MSTR = 0,SPICR1主机位重置。

MODF中断反应在状态寄存器的MODF标识位中。清除该位会同时清除中断。当MODF标识位置起时该中断保持激活。MODF有一个自动清除过程,参见“1.3.2.4 SPI状态寄存器(SPISR)”。

 

1.6.2 SPIF

当数据接收完成并复制到SPI数据寄存器中时SPIF产生。SPIF置位后,直到响应后才会被清除。SPIF的自动清除过程在“1.3.2.4 SPI状态寄存器(SPISR)”有描述。如果SPIF在下一次传输结束前未得到服务(例如,SPIF在另一次传输过程中保持激活),后一次传输会被忽略,新的数据不会被复制到SPIDR中。

 

1.6.3 SPTEF

当SPI数据寄存器可以接收新数据时,SPTEF产生。SPTEF置起后,直到被服务后才会清除。SPTEF自动清除的过程在“1.3.2.4 SPI状态寄存器(SPISR)”中进行描述。

 

 

你可能感兴趣的:(通信协议)