《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI

2.1 SPI简介

SPI,是Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。是一种高速全双工的通信总线,它由摩托罗拉公司提出,当前最新的为 V04.01—2004 版。它被广泛地使用在ADC、LCD 等设备与 MCU 间通信的场合。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

2.1.1 SPI 信号线

SPI 包含 4 条总线,SPI 总线包含 4 条总线,分别为SS、SCK、MOSI、MISO。它们的作用介绍如下 :
1)SS ( Slave Select):片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,见图 15- 1。当 SS 信号线为低电平时,片选有效,开始SPI 通信。

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第1张图片

图1SPI 多设备通信

2)SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。

3)MOSI (Master Output, Slave Input):主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。

4)MISO(Master Input, Slave Output):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。

2.1.2 SPI模式

SPI通信中可作为从机也可以作为主机,这取决于硬件设计和软件设置。

当器件作为主机时,使用一个IO引脚拉低相应从机的选择引脚(NSS),传输的起始由主机发送数据来启动,时钟(SCK)信号由主机产生。通过MOSI发送数据,同时通过MISO引脚接收从机发出的数据。

当器件作为从机时,传输在从机选择引脚(NSS)被主机拉低后开始,接收主机输出的时钟信号,在读取主机数据的同时通过MISO引脚输出数据。
根据 SPI 时钟极性(CPOL)和时钟相位(CPHA) 配置的不同,分为 4 种 SPI 模式。
时钟极性是指 SPI 通信设备处于空闲状态时(也可以认为这是 SPI 通信开始时,即SS 为低电平时),SCK 信号线的电平信号。CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时则相反。

时钟相位是指数据采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的奇数边沿被采样。当 CPHA=1 时,数据线在 SCK 的偶数边沿采样。

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第2张图片

图2 CPHA =0 时,SPI 时序

我们来分析这个 CPHA=0 的时序图。首先,由主机把片选信号线SS 拉低,即为图中的SS (O)时序,意为主机输出,SS (I)时序实际上也是SS 线信号,SS (I)时序表示从机接收到SS 片选被拉低的信号。

在SS 被拉低的时刻,SCK 分为两种情况,若我们设置为 CPOL=0,则 SCK 时序在这个时刻为低电平,若设置为 CPOL=1,则 SCK 在这个时刻为高电平。

无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在采样时刻的时序中我们可以看到,采样时刻都是在 SCK 的奇数边沿(注意奇数边沿有时为下降沿,有时为上升沿)。因此,MOSI 和 MISO 数据线的有效信号在 SCK 的奇数边沿保持不变,这个信号将在SCK 奇数边沿时被采集,在非采样时刻,MOSI 和 MISO 的有效信号才发生切换。

对于 CPHA=1 的情况也很类似,但数据信号的采样时刻为偶数边沿,其时序图见下图。使用 SPI 协议通信时,主机和从机的时序要保持一致,即两者都选择相同的 SPI 模式。

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第3张图片

图3 CPHA =1 时,SPI 时序

2.1.3 SPI特性

STM32的小容量有一个SPI接口,中容量有2个,大容量有3个接口,其特性如下所示。

 3线全双工同步传输;
 8或16位传输帧格式选择;
 主或从操作,支持多主模式;
 8个主模式波特率预分频系数(最大为fPCLK/2);
 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变;
 可编程的时钟极性和相位;
 可编程的数据顺序,MSB在前或LSB在前;
 可触发中断的专用发送和接收标志;
 SPI总线忙状态标志;
 支持可靠通信的硬件CRC;
 可触发中断的主模式故障、过载以及CRC错误标志;
 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求。

2.2 SPI架构

图4 所示为 STM32 的 SPI 架构图,可以看到 MISO 数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。

当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI 数据线。

SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。

控制寄存器 CR1 掌管着主控制电路,STM32 的 SPI 模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2 则用于设置各种中断使能。

最后为 NSS 引脚,这个引脚扮演着 SPI 协议中的SS 片选信号线的角色,如果我们把 NSS 引脚配置为硬件自动控制,SPI 模块能够自动判别它能否成为 SPI 的主机,或自动进入 SPI 从机模式。但实际上我们用得更多的是由软件控制某些 GPIO 引脚单独作为SS信号,这个 GPIO 引脚可以随便选择。

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第4张图片

图4

通常SPI通过4个引脚与外部器件相连:
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK: 串口时钟,作为主设备的输出,从设备的输入。
● NSS: 从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。

2.3 SPI工作原理

2.3.1 (NSS)输入输出管理

 (NSS)输出管理
对于每个SPI的NSS可以输入,也可以输出。所谓输入,就是NSS的电平信号给自己,所谓输出,就是将NSS的电平信号发送出去,给从机。配置为输出,还是不输出,我们可以通过SPI_CR2寄存器的SSOE位。当SSOE=1时,并且SPI处于主模式控制时(MSTR=1),NSS就输出低电平,也就是拉低,因此当其他SPI设备的NSS引脚与它相连,必然接收到低电平,则片选成功,都成为从设备了。

 (NSS)输入管理
NSS软件模式:
 SPI主机:
需要设置SPI_CR1寄存器的SSM=1和SSI=1,SSM=1是为了使能软件管理,NSS有内部和外部引脚。这时候外部引脚留作他用(可以用来作为GPIO驱动从设备的片选信号)。内部NSS引脚电平则通过SPI_CRL寄存器的SSI位来驱动。SSI=1是为了使NSS内电平为高电平。为什么主设备的内部NSS电平要为1呢?
STM32手册上说,要保持MSTR=1和SPE=1,也就是说要保持主机模式,只有NSS接到高电平信号时,这两位才能保持置‘1’。

 SPI从机:
NSS引脚在完成字节传输之前必须连接到一个低电平信号。在软件模式下,则需要设置SPI_CR1寄存器的SSM=1(软件管理使能)和SSI=0.

NSS硬件模式:
对于主机,我们的NSS可以直接接到高电平.对于从机,NSS接低就可以。

2.3.2单主和单从应用

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第5张图片

图5 SPI内部结构简明图

从上图可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节发起一次传输。寄存器通过MOSI信号将字节传给从机,从机也将自己的移位寄存器中的内容通过MISO信号返还给主机。这样,两个移位寄存器中下的内容就被交换,外设的写操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个,就必须发送一个空字节来引发从机的传输。

2.3.3时钟信号的相位和极性

SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清’0’,SCK时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第6张图片

图6数据时序图

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第7张图片

图7数据时序图

2.3.4数据帧格式

根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。

2.3.5 SPI主从模式工作原理

配置SPI主模式的步骤如下:
1>设置SPI_CR1寄存器的BR[2:0]位,来定义串行时钟波特率。

2>选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系。

3>设置DFF位来定义8或16位数据帧格式。

4>配置SPI_CR1寄存器的LSBFIRST位定义帧格式。

5>如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS引脚连接到高电平;在软件模式中,需设置SPI_CR1寄存器的SSM=1和SSI=1。如果NSS引脚工作在输出模式,则只需设置SSOE=1位。

6>设置MSTR=1和SPE=1,只当NSS引脚被连到高电平,这些位才能保持置位。

配置SPI从模式的步骤如下:
1>设置DFF位以定义数据帧格式为8位或16位。

2>定义数据传输和串行时钟之间的相位关系。

3>帧格式必须和主设备相同,MSB在前还是LSB在前取决于SPI_CR1寄存器中的LSBFIRST位。

4>硬件模式下,在完整的数据帧(8位或16位)发送过程中,NSS引脚必须为低电平。软件模式下,设置SPI_CR1寄存器中的SSM=1,SSI=0。

5>MSTR=0位,设置SPE=1,使相应引脚工作于SPI模式下。

2.3.6状态标志

应用程序通过3个状态标志可以完全监控SPI总线的状态。
1.发送缓冲器空闲标志(TXE)
此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。

2.接收缓冲器非空(RXNE)
此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。

3.忙(Busy)标志
BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。

2.3.7 SPI中断

表1

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第8张图片

2.4硬件连接

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第9张图片

图8

2.5 SPI具体代码分析

笔者在代码中注释比较详细,就不在单独讲解了,完整代码参考如下。
点击进入

2.6实验现象

在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可接收到信息。
《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 SPI_第10张图片

图9实验现象

你可能感兴趣的:(《嵌入式》STM32开发指南)