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 所示:
图 76 SPI模式波形图
所有模式下,片选线均为发送一个数据后自动拉高,第二个数据再次拉低,因此当需要使用连续片选时,需使用GPIO模拟片选线。
16.3.4. SSI模式
- 可通过设置CTRL寄存器中FFS位选择输出模式,当选择SSI模式时,单次输出波形如
图 77 所示:
图 77 SSI模式单次输出波
连续输出波形如 图 78 所示:
图 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:未中断 |