<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC45x User Manual》SPI** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2020, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# SPI

## 概述

SPI接口主要使用在，外部设计采用SPI协议的应用场景下。SPI的工作模式软件可选，默认为SPI
Motorola模式。SPI接口支持全双工传输和半双工传输。当接口配置为Master模式时，可发送时钟信号供外部Slave设备使用。

## 主要特性

- 支持Master和Slave操作
- 全双工传输，可根据应用情况，使用3根或者4根信号线
- 支持半双工传输，可根据应用情况，使用2根信号线
- 可编程的时钟极性和相位
- 可编程的数据顺序：MSB或LSB
- 最快传输速度为系统最高时钟频率的1/8
- 片选信号均可选。Master模式下，片选信号可以软件控制也可以硬件产生；Slave模式下，片选信号可以恒定有效，也可以来自外界设备
- 无本地FIFO。包含溢出检测和片选信号异常检测

## 功能描述

### 功能框图

本接口采用同步串行设计，实现MCU同外部设备之间的SPI传输。支持轮询和中断方式获得传输状态信息。本接口的主要功能模块如下图所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-1 SPI模块结构框图

接口信号包括，spi_din，spi_dout，sclk_in，sclk_out，ss_in和ss_out。

spi_din：接口接收的数据信号。同SPI协议比较，当接口配置为Master模式时，其等效为MISO；当接口配置为Slave模式时，其等效为MOSI。

spi_dout：接口发送的数据信号。同SPI协议比较，当接口配置为Master模式时，其等效为MOSI；当接口配置为Slave模式时，其等效为MISO。

sclk_in：接口接收的时钟信号。此时，接口的工作模式为Slave。非Slave模式下，此信号输入无效。

sclk_out：接口发送的时钟信号。此时，接口的工作模式为Master，非Master模式下，此信号输出恒定为0。

ss_in：接口接收的片选信号。此时，接口的工作模式为Slave。非Slave模式下，此信号输入无效。

ss_out：接口发送的片选信号。此时，接口的工作模式为Master。非Master模式下，此信号输出恒定为1。

### 功能说明

#### 全双工模式

默认情况下，SPI接口配置为全双工模式。此时，数据传输需要两根数据线。数据信号的变化，发生在时钟信号的边沿，即同步于时钟信号。

接口为Master模式时：

- spi_din为数据输入，接外部Slave设备的MISO
- spi_dout为数据输出，接外部Slave设备的MOSI
- spi_ss_out为片选信号，根据应用情况选择是使用该信号还是软件控制其它GPIO实现

接口为Slave模式时：

- spi_din为数据输入，接外部Master设备的MOSI
- spi_dout为数据输出，接外部Master设备的MISO
- spi_ss_in为片选信号，根据应用情况是使用该信号还是片选恒有效

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-2SPI接口全双工模式互连框图

从上图可知，GPIO若配置为输出，则SPI接口可发送数据；GPIO若配置为输入，则SPI接口可接收数据。

#### 半双工模式

SPI接口可配置为半双工模式。此时，数据传输只需要一根数据线。数据信号的变化，发生在时钟信号的边沿，即同步于时钟信号。一次传输只能是一个方向的，要不就是发送，要不就是接收。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-3 SPI接口半双工模式互连框图

注意，上图中若本接口做Master，则clk为本接口的输出信号；若本接口做Slave，则clk为本接口的输入信号。

仅发送

SPI_CFG.
DUPLEX配置为2，半双工发送模式有效。此时，本接口只能发送数据。GPIO_0的oe使能，发送spi_dout数据到外界；GPIO_0的ie关闭，spi_din恒定输入为0。此模式下，支持Master/Slave模式下的发送。

仅接收

SPI_CFG.
DUPLEX配置为3，半双工接收模式有效。此时，本接口只能接收数据。GPIO_0的oe关闭，spi_dout无法发送数据到外界；GPIO_0的ie开启，spi_din接收来自外部的数据。此模式下，支持Master/Slave模式下的接收。

注意，全双工下是两个GPIO用于数据传输，半双工下可从中任意选一个GPIO用于数据传输。

#### 片选信号

本接口做Slave模式时，片选信号可选，SPI_CFG.CS决定片选来源。ss为Master设备发出的选通使能信号，低电平有效。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-4 SPI模块Slave模式片选信号选择

本接口做Master模式时，片选信号亦可选。模块硬件产生了标准的片选信号，实际应用可屏蔽此信号通过软件操作额外的GPIO实现。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-5 SPI模块Master模式片选信号选择

注意，图16-5虚线仅表示不确定。若使用spi_ss_out为ss的源头，那么将GPIO_0同外界设备互连；若使用软件操作GPIO的方式，那么可将GPIO_1同外界设备互连。

#### 通讯格式

在SPI通讯过程中，发送或者接收操作均是基于SPI时钟的。通讯格式受到SPI_CFG.
SAMPLE和SPI\_ CLK_POL控制。SPI_CFG. SAMPLE为Phase控制位，SPI\_
CLK_POL为Polarity控制位。

Polarity控制了SPI时钟信号在默认情况下的电平状态。Polarity为0时，默认时钟电平为低电平；Polarity为1时，默认电平为高电平。

Phase控制了SPI数据的发送/接收时刻。Phase为0时，时钟从默认电平到第一个跳变边沿为采样数据时刻，Phase为1时，时钟从默认电平到第一个跳变边沿为发送数据时刻。

#### 数据格式及长度

SPI数据传输格式分成两种：MSB和LSB。数据传输格式受到SPI_CFG.ENDIAN控制。注意，在数据传输过程中硬件自动实现传输格式的转换，无需软件转换。

SPI数据字节长度可配，范围是从8-Bit到16-Bit。SPI_SIZE.BITSIZE控制长度。

#### DMA传输

在大容量数据传输应用下，SPI接口支持DMA传输，减轻MCU的负担。一次传输，最大传输量为由DMA模块决定，最小传输量为1字节。在全双工模式下，接收和发送均可实现DMA传输；在半双工模式下，仅接收或发送实现DMA传输。

在接收到新的数据后，硬件自动产生DMA请求，通过DMA模块将数据搬移到RAM中。在发送新数据前，硬件自动产生DMA请求，通过DMA模块将数据从RAM中搬移到SPI接口。因SPI无FIFO，SPI发送一次DMA请求，DMA只能搬移一个字节数据。**若要实现多字节搬移，DMA需配置为多轮搬移，每一轮搬移一个字节的方式**。

DMA传输需要配置DMA模块相应寄存器。

因SPI接口支持DMA传输，也支持MCU传输。两者区别在于--DMA传输，发送的数据来自DMA的搬移；MCU传输，发送的数据来自MCU的搬移。

DMA传输，推荐软件配置流程如下：

- 初始化DMA模块，将本次发送的数据来源，接收的数据去向配置好，传输长度配置完毕。
- 初始化GPIO模块，将SPI复用的GPIO配置完毕。
- 初始化SPI接口，SPI_IE/SPI_CFG/SPI_BAUD/SPI_SIZE等寄存器配置完毕。
- 触发SPI接口，进入发送/接收状态。触发条件是MCU对SPI_TXDATA寄存器执行写操作，因最终发送的数据来自DMA，本次MCU写入的数据不会混入SPI发送流程。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 19-6 SPI DMA 数据流与握手逻辑框图

#### MCU传输

一次只能发送/接收一个SPI_SIZE.BITSIZE长度的数据，每次完成后需要通过中断或者轮询的方式判断传输是否完成。无论是主模式还是从模式，写SPI_TXDATA寄存器，才能触发传输。主模式为主动发送，从模式为加载数据到发送队列等待主模式发出时钟信号，开始传输。推荐软件配置流程如下:

- 初始化GPIO模块，将SPI复用的GPIO配置完毕。
- 初始化SPI接口，SPI_IE/SPI_CFG/SPI_BAUD/SPI_SIZE等寄存器配置完毕。
- MCU对SPI_TXDATA寄存器执行写操作，触发SPI接口进入发送流程。从模式下，数据加载到内部状态机等待主设备发起读取操作；主模式下，触发发送。

**注意：若需要连续发送，则需要重新配置SPI_TXDATA寄存器，并且配置SPI_TXDATA寄存器时需要保证此时的CS信号为高。通过中断或者轮询方式获得传输完毕信息。**

**【图片已删除】**图
19-7 SPI 传输的软件配置与操作流程

#### 中断处理

SPI接口包含三种类型的中断事件，分别是：数据传输完成事件，异常事件和溢出事件。

- 数据完成事件，当前数据传输完成。高电平有效，对SPI_IE.
  CMPLT_IF写1清除。
- 异常事件，SPI接口为Slave模式，若在传输过程中片选信号受到干扰，被拉高，将产生片选异常事件。高电平有效，对SPI_IE.
  AB_IF写1清除。
- 溢出事件，SPI_RX_DATA寄存器数据没有及时被读走，，将产生溢出事件。高电平有效，对SPI_IE.
  OV_IF写1清除。

上述事件，默认是不触发SPI中断，可以通过配置SPI_IE\[7:4\]使能事件产生中断。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图19-8 SPI模块中断选信号产生图

#### 波特率设置

SPI接口时钟通过对系统时钟分频获得，分频系数来自SPI_BAUD.
BAUD。SPI传输波特率配置计算公式为：

SPI传输波特率 = 系统时钟 / (2\*(BAUD + 1))

SPI协议为半拍协议，上升沿发送数据，下降沿采集数据；或者下降沿发送数据，上升沿采样数据。

SPI接口采用同步设计，需要对外部设备的信号进行同步采样，同步时钟为系统时钟。数据和时钟信号（此时为Slave模式）的同步，需要两拍系统时钟。考虑到时钟相位的偏移，此时需要一拍系统时钟的冗余，由此推导出最快的SPI传输波特率为系统时钟的1/8，高电平周期为四拍系统时钟，低电平周期为四拍系统时钟。因此，SPI_BAUD.
BAUD的配置值不能小于3。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

地址分别是：0x4001_A800，0x4001_AC00

复位值：0x0020

表19-2系统控制寄存器SPI_CFG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||DUPLEX||CS|MS|CPHA|CPOL|ENDIAN|EN|
|||||||||RW||RW|RW|RW|RW|RW|RW|
|||||||||0||1|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:6\]|DUPLEX|半双工模式设置0X：关闭半双工模式10：开启半双工模式，仅发送11：开启半双工模式，仅接收|
|\[5\]|CS|SPI从设备下，片选信号来源。默认值为1。0：Slave模式下，片选信号恒为有效值--01：Slave模式下，片选信号来自Master设备|
|\[4\]|MS|SPI主从模式选择。默认值为0。0：Slave模式1：Master模式|
|\[3\]|CPHA|SPI相位选择。默认值为0。0：Phase为01：Phase为1|
|\[2\]|CPOL|SPI极性选择。默认值为0。0：Polarity为01：Polarity为1|
|\[1\]|ENDIAN|SPI模块传输顺序。默认值为0。0：MSB，高位先传输1：LSB，低位先传输|
|\[0\]|EN|SPI模块使能信号。默认值为0。0：关闭SPI模块1：开启SPI模块|

### SPIx_IE SPI中断寄存器(x = 0,1)

地址分别是：0x4001_A804，0x4001_AC04

复位值：0x0

表19-3 SPI_IE中断寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||IE|CMPLT_IE|AB_IE|OV_IE|TRANS_TRIG|CMPLT_IF|AB_IF|OV_IF|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|IE|SPI中断使能开关。默认值为0。0：关闭SPI中断1：使能SPI中断|
|\[6\]|CMPLT_IE|SPI传输，完成事件中断使能信号。0：屏蔽此中断源1：使能此中断源|
|\[5\]|AB_IE|SPI传输，异常事件中断使能信号。0：屏蔽此中断源1：使能此中断源|
|\[4\]|OV_IE|SPI传输，溢出事件中断使能信号。默认值为0。0：屏蔽此中断源1：使能此中断源|
|\[3\]|TRANS_TRIG|传输触发选择。 1：外部触发 0：内部自动执行。仅主模式有效|
|\[2\]|CMPLT_IF|SPI传输，完成事件。高电平有效，写1清除。|
|\[1\]|AB_IF|SPI传输，异常事件。Slave模式下，传输未完成，发生片选信号无效事件。高电平有效，写1清除。|
|\[0\]|OV_IF|SPI传输，溢出事件。前次接收的旧数据没有被取走，本次接收的新数据已经到达。高电平有效，写1清除。|

### SPIx_BAUD SPI波特率寄存器(x = 0,1)

地址分别是：0x4001_A808，0x4001_AC08

复位值：0x0

表19-4 SPI_BAUD控制寄存器

|||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15||14|13|12||11|10|9|8|7|6|5|4|3|2|1|0|
|TRANS_MODE|||||BAUD|||||||||||||
|RW|||||RW|||||||||||||
|0|||||0|||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[15\]|TRANS_MODE|SPI 数据搬移方式。默认为 0，DMA 方式。 0：SPI 接口支持 DMA 搬移数据到 SPI 接口，完成发送和接收。 1：SPI 接口支持 MCU 搬移数据到 SPI 接口，完成发送和接收。|
|\[14:12\]|--|--|
|\[11:0\]|BAUD|SPI传输波特率配置，SPI实际传输速度计算公式为：SPI传输速度 = 系统时钟 / (2\*(BAUD + 1))切记，BAUD的配置值不能小于3。|

### SPIx_TXDATA SPI数据发送寄存器(x = 0,1)

地址分别是：0x4001_A80C，0x4001_AC0C

复位值：0x0

表19-5 SPI_TXDATA数据发送寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|TX_DATA||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:16\]||未使用|
|\[15:0\]|TX_DATA|SPI数据发送寄存器|

### SPIx_RXDATA SPI数据接收寄存器(x = 0,1)

地址分别是：0x4001_A810，0x4001_AC10

复位值：0x0

表19-6 SPI_RXDATA数据接收寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RX_DATA||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:16\]||未使用|
|\[15:0\]|RX_DATA|SPI数据接收寄存器|

### SPIx_SIZE SPI数据字节长度寄存器(x = 0,1)

地址分别是：0x4001_A814，0x4001_AC14

复位值：0x0

表19-7 SPI_BITSIZE数据字节长度寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||||||BITSIZE|||||
||||||||||||RW|||||
||||||||||||0|||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[4:0\]|BITSIZE|字节长度寄存器。0x00：非法值0x07：非法值0x08：8-Bit0x09：9-Bit…0x0E：14-Bit0x0F：15-Bit0x10：16-Bit|

