16. SPI总线控制器 (SPI)

16.1. 概述

SWM221系列所有型号SPI模块操作均相同,不同型号SPI数量可能不同。使用前需使能对应SPI模块时钟。

SPI是一种用于全双工模式的串行同步数据通讯协议。该模块为支持SPI通讯协议的接口控制模块,它支持主/从工作模式,并可通过4线实现设备的通讯。

SPI模块支持SPI模式及SSI模式。SPI模式下支持MASTER模式及SLAVE模式。具备深度为8的FIFO,速率及帧宽度可灵活配置。

除了支持SPI协议外,还可支持SSI协议,并支持SPIFLASH的4线快速读操作。

16.2. 特性

  • 支持主机模式和从机模式

  • 支持SPI和SSI两种帧结构

  • 内置深度为8的FIFO,作为接收和发送数据的缓存

  • 数据位数4~16位可配置

  • 可编程时钟极性和相位

  • 支持LSB和MSB可配置

16.3. 功能描述

16.3.1. 位速率的产生

SPI模块包含一个可编程的位速率时钟分频器来生成串行输出时钟。串行位速率通过设置CTRL寄存器FAST、CLKDIV位对输入时钟进行分频来获得。分频值的范围为2~512分频值。计算公式如下Fsclk_out = FPCLK1/SCKDIV。

16.3.2. 帧宽度

使能SPI模块前,可通过设置CTRL寄存器SIZE位选择数据帧长度,支持4~16位。设置该寄存器位时,需保证SPI处于关闭状态。

16.3.3. SPI模式

使能SPI模块前,可通过设置CTRL寄存器中FFS位域选择为SPI模式。此时,可通过CTRL寄存器中CPOL和CPHA配置SPI模块时钟空闲状态极性与数据采样时间点。

当CPOL=0,CPHA=0时,时钟空闲状态为低电平,起始采样点为时钟上升沿。

当CPOL=0,CPHA=1时,时钟空闲状态为低电平,起始采样点为时钟下降沿。

当CPOL=1,CPHA=0时,时钟空闲状态为高电平,起始采样点为时钟下降沿。

当CPOL=1,CPHA=1时,时钟空闲状态为高电平,起始采样点为时钟上升沿。

输出波形如 图 76 所示:

../../_images/spi_waveform.svg

图 76 SPI模式波形图

所有模式下,片选线均为发送一个数据后自动拉高,第二个数据再次拉低,因此当需要使用连续片选时,需使用GPIO模拟片选线。

16.3.4. SSI模式

可通过设置CTRL寄存器中FFS位选择输出模式,当选择SSI模式时,单次输出波形如

图 77 所示:

../../_images/ssi_one_out_waveform.svg

图 77 SSI模式单次输出波

连续输出波形如 图 78 所示:

../../_images/ssi_continuous_out.svg

图 78 SSI模式连续输出波形

16.3.5. 主设备操作

当SPI模块作为主模块工作时,操作流程如下:

  • 通过CTRL寄存器CLKDIV位定义串行时钟波特率

  • 设置CTRL寄存器SIZE位来选择数据位数

  • 选择CTRL寄存器CPOL和CPHA位,定义数据传输和串行时钟间的相位关系。主、从设备的CPOL和CPHA位必须一致

  • 配置CTRL寄存器FFS位定义数据帧格式,主、从设备的数据帧格式必须一致。

  • 设置CTRL寄存器MSTR位为主模式

  • 使能CTRL寄存器EN位

在主设备配置中,MOSI引脚是数据输出,而MISO引脚是数据输入。

注:当选择硬件提供的CS引脚作为从设备片选使能时,每传输一个字节的数据,CS引脚均会变高。因此,当从设备需要连续拉低的片选信号时,需要使用GPIO模拟CS信号。

16.3.6. 从设备操作

在从模式下,SCK引脚用于接收从主设备来的串行时钟。对CTRL寄存器中CLKDIV的设置不影响数据传输速率。

操作流程:

  • 设置CTRL寄存器SIZE位来定义数据位数选择。

  • 选择CTRL寄存器CPOL和CPHA位,与主设备一致。

  • 配置CTRL寄存器FFS位定义数据帧格式。

  • 设置CTRL寄存器MSTR位为从模式

在从设备配置中,MOSI引脚是数据输入,MISO引脚是数据输出。

16.3.7. FIFO操作

发送FIFO

通用发送FIFO是一个32位宽、8单元深、先进先出的存储缓冲区。通过写DATA寄存器来将数据写入发送FIFO,数据在由发送逻辑读出之前一直保存在发送FIFO中。并行数据在进行串行转换并通过MOSI管脚分别发送到相关的从机之前先写入发送FIFO。

接收FIFO

通用接收FIFO是一个32位宽、8单元深、先进先出的存储缓冲区。从串行接口接收到的数据在读出之前一直保存在缓冲区中,通过读DATA寄存器来访问读FIFO。从MISO管脚接收到的串行数据在分别并行加载到相关的主机接收FIFO之前先进行记录。

可通过中断使能寄存器IE、中断状态寄存器IF、状态寄存器STAT对FIFO状态及中断进行查询与控制。

16.3.8. 中断配置与清除

可通过配置中断使能寄存器IE相应位使能中断。当中断触发后,中断标志寄存器IF对应位置1。如需清除此标志,需在对应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入。

16.4. 寄存器映射

名称

偏移

复位值

SPI BASE: 0x40041800

CTRL

0x00

0x009E1172

DATA

0x04

0x00000000

STAT

0x08

0x00010006

IE

0x0C

0x00000000

IF

0x10

0x00000000

16.5. 寄存器描述

16.5.1. 控制寄存器CTRL

偏移: 0x00

复位值: 0x009E1172

31

30

29

28

27

26

25

24

BIDIMODE

BIDIOE

INNOSPL

LSBF

SAMPLE_DLY

TFCLR

RFCLR

23

22

21

20

19

18

17

16

TFTHR

RFTHR

SSN

FILTE

15

14

13

12

11

10

9

8

DMARXEN

DMATXEN

FAST

MSTR

FFS

CPOL

CPHA

7

6

5

4

3

2

1

0

SIZE

EN

CLKDIV

位域

名称

类型

描述

31

BIDIMODE

R/W

单线半双工模式开关

30

BIDIOE

R/W

单线半双工模式下信号输出使能

29

INNOSPL

R/W

输入信号不进行采样控制

0:输入信号处理方式FILTE寄存器来控制

1:输入信号不进行任何采样

注:若不进行采样,则输入信号直接进行电路进行工作,可最大化的提高传输速率,但会降低可靠性。该为有效后,SPI的传输速率在理论上无论主从模式全双工还是单工,最大的传输速率可达到pclk1的2分频。

28

LSBF

R/W

LSB配置寄存器

1:数据按照LSB发送(发送时,TX寄存器数据的bit0位会首先被发出;接收时,接收的第一个bit数据会放到RX寄存器的bit0位)

0:数据按照MSB发送(发送时,TX寄存器数据的最高位会首先被发出;接收时,接收的第一个bit数据会放到RX寄存器的最高位)

27:26

SAMPLE_DLY

R/W

输入采样延时选择位

0:表示不延迟采样

1:表示延迟一个时钟周期

2:表示延迟两个时钟周期

3:表示延迟三个时钟周期

25

TFCLR

R/W

发送FIFO清除控制位

1:发送FIFO清除有效

0:发送FIFO清除无效

24

RFCLR

R/W

接收FIFO清除控制位

1:接收FIFO清除有效

0:接收FIFO清除无效

23:21

TFTHR

R/W

发送FIFO达到设置门限后产生中断配置位

000:发送FIFO中最多有0个数据

001:发送FIFO中最多有1个数据

010:发送FIFO中最多有2个数据

011:发送FIFO中最多有3个数据

100:发送FIFO中最多有4个数据

101:发送FIFO中最多有5个数据

110:发送FIFO中最多有6个数据

111:发送FIFO中最多有7个数据

20:18

RFTHR

R/W

接收FIFO达到设置门限后会产生中断配置位

000:接收FIFO中至少有1个数据

001:接收FIFO中至少有2个数据

010:接收FIFO中至少有3个数据

011:接收FIFO中至少有4个数据

100:接收FIFO中至少有5个数据

101:接收FIFO中至少有6个数据

110:接收FIFO中至少有7个数据

111:接收FIFO中至少有8个数据

17

SSN

R/W

SSN在传输过程中是否出现控制位。(在数据帧为SPI模式下,并且配置主模式工作时,通过该位可控制在传输过程中每帧数据之间是否需要SSN拉高)

0:传输过程中SSN始终为0

1:传输过程中每一帧数据之间会将SSN至少拉高0.5个SCK周期

16

FILTE

R/W

输入信号去抖控制

0:对输入信号不进行去抖操作

1:对输入信号进行去抖操作

15

DMARXEN

R/W

DAM读FIFO使能

1:通过DMA读FIFO

0:通过MCU读FIFO

14

DMATXEN

R/W

DAM写FIFO使能

1:通过DMA写FIFO

0:通过MCU写FIFO

13

FAST

R/W

快速模式选择

1:SPI的SCLK为pclk1的2分频

0:SPI的SCLK由CLKDIV控制

12

MSTR

R/W

主从模式选择

1:SPI系统配置为主器件模式

0:SPI系统配置为从器件模式

11:10

FFS

R/W

数据帧格式选择

00:SPI模式

01:SSI模式

10:保留

11:保留

9

CPOL

R/W

时钟极性选择

0 = 串行时钟空闲状态为低电平,有效电平为高电平

1 = 串行时钟空闲状态为高电平,有效电平为低电平

8

CPHA

R/W

时钟相位选择

0 = 在串行时钟的第一个跳变沿采样数据

1 = 在串行时钟的第二个跳变沿采样数据

7:4

SIZE

R/W

数据位数选择

0000:保留

0001:保留

0010:保留

0011:4bit数据

0100:5bit数据

0101:6bit数据

0110:7bit数据

0111:8bit数据

1000:9bit数据

1001:10bit数据

1010:11bit数据

1011:12bit数据

1100:13bit数据

1101:14bit数据

1110:15bit数据

1111:16bit数据

3

EN

R/W

SPI使能位

0:禁止

1:使能

注1:该寄存器使能后,若在主模式下,当发送FIFO有数据时则开始启动数据帧传输;在从模式下,等待数据帧传输

2:0

CLKDIV

R/W

波特率选择

000:PCLK1 4分频

001:PCLK1 8分频

010:PCLK1 16分频

011:PCLK1 32分频

100:PCLK1 64分频

101:PCLK1 128分频

110:PCLK1 256分频

111:PCLK1 512分频

16.5.2. 数据寄存器DATA

偏移: 0x04

复位值: 0x00000000

31

30

29

28

27

26

25

24

DATA

23

22

21

20

19

18

17

16

DATA

15

14

13

12

11

10

9

8

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

31:0

DATA

R/W

SPI接收/发送数据寄存器

读操作从接收FIFO中读出接收到的数据

写操作将数据写入发送FIFO中

注:若数据不是32bit,则按照右对齐进行排列,高位不关心。

16.5.3. 状态寄存器STAT

偏移: 0x08

复位值: 0x00010006

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

BUSY

RFLVL

TFLVL

7

6

5

4

3

2

1

0

TFLVL

RFOV

RFF

RFNE

TFNF

TFE

WTC

位域

名称

类型

描述

31:16

RO

15

BUSY

RO

SPI传输忙标志位

0:表示SPI未进行传输

1:表示SPI正在进行传输

14:12

RO

11:9

RFLVL

RO

接收FIFO数据深度位标志,RO

000:RFF为1时,表示FIFO内有8组数据

RFF为0时,表示FIFO内没有数据;

001:表示FIFO内有1组数据;

010:表示FIFO内有2组数据;

011:表示FIFO内有3组数据;

100:表示FIFO内有4组数据;

101:表示FIFO内有5组数据;

110:表示FIFO内有6组数据;

111:表示FIFO内有7组数据;

8:6

TFLVL

RO

发送FIFO数据深度位标志,RO

000:TFNF为0时,表示FIFO内有8组数据

TFNF为1时,表示FIFO内没有数据;

001:表示FIFO内有1组数据;

010:表示FIFO内有2组数据;

011:表示FIFO内有3组数据;

100:表示FIFO内有4组数据;

101:表示FIFO内有5组数据;

110:表示FIFO内有6组数据;

111:表示FIFO内有7组数据;

5

RFOV

R/W

接收FIFO溢出标志,软件清零,写清零

0:没溢出

1:溢出

4

RFF

RO

接收FIFO满标志

0:非满

1:满

3

RFNE

RO

接收FIFO非空标志

0:空

1:非空

2

TFNF

RO

发送FIFO非满标志

0:满

1:非满

1

TFE

RO

发送FIFO空标志

0:非空

1:空

0

WTC

R/W

SPI数据帧传输结束标志

每次数据帧传输结束后,该标志会被置位。

软件清零,写1清零。

16.5.4. 中断使能寄存器IE

偏移: 0x0C

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

CSRISE

CSFALL

WTC

FTC

7

6

5

4

3

2

1

0

TFTHR

RFTHR

TFHF

TFE

RFHF

RFF

RFOV

位域

名称

类型

描述

31:12

RO

11

CSRISE

R/W

从机模式下,SSN信号上升沿检测中断使能

1:使能

0:不使能

10

CSFALL

R/W

从机模式下,SSN信号下降沿检测中断使能

1:使能

0:不使能

9

WTC

R/W

SPI传输结束中断使能

1:使能

0:不使能

8

FTC

R/W

SPI数据帧传输结束中断使能

1:使能

0:不使能

7

RO

6

TFTHR

R/W

发送FIFO达到设定门限中断使能

1:使能

0:不使能

5

RFTHR

R/W

接收FIFO达到设定门限中断使能

1:使能

0:不使能

4

TFHF

R/W

发送FIFO半满使能

1:使能

0:不使能

3

TFE

R/W

发送FIFO空中断使能

1:使能

0:不使能

2

RFHF

R/W

接收FIFO半满使能

1:使能

0:不使能

1

RFF

R/W

接收FIFO满中断使能

1:使能

0:不使能

0

RFOV

R/W

接收FIFO溢出中断使能

1:使能

0:不使能

16.5.5. 中断状态寄存器IF

偏移: 0x10

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

WTC

FTC

7

6

5

4

3

2

1

0

TFTHR

RFTHR

TFHF

TFE

RFHF

RFF

RFOV

位域

名称

类型

描述

31:12

RO

11

CSRISE

R/W1C

从机模式SSN上升沿中断,写1清中断

1:中断

0:未中断

10

CSFALL

R/W1C

从机模式SSN下降沿中断,写1清中断

1:中断

0:未中断

9

WTC

R/W1C

SPI传输结束中断标志,写1清中断

1:中断

0:未中断

8

FTC

R/W1C

SPI数据帧传输结束中断标志,写1清中断

1:中断

0:未中断

7

RO

6

TFTHR

R/W1C

发送FIFO达到设定断标志,写1清中断

1:中断

0:未中断

5

RFTHR

R/W1C

接收FIFO达到设定门限中断标志,写1清中断

1:中断

0:未中断

4

TFHF

R/W1C

发送FIFO半满中断标志,写1清中断

1:中断

0:未中断

3

TFE

R/W1C

发送FIFO空中断标志,写1清中断

1:中断

0:未中断

2

RFHF

R/W1C

接收FIFO半满中断标志,写1清中断

1:中断

0:未中断

1

RFF

R/W1C

接收FIFO满中断标志,写1清中断

1:中断

0:未中断

0

RFOVF

R/W1C

接收FIFO溢出中断标志,写1清中断

1:中断

0:未中断