1. 杂谈
快两个月没有写博文了,前段时间确实很忙,以至于天天跟我妈抱怨说快累死了,可是最近才知道我妈的工时变成了早五晚8,却从来没有听到她的抱怨,对比我妈,我真的是差的远,不仅行动上懒惰,在时间规划上也差一大截,所以接下来要多行动少抱怨,享受当下,毕竟好的坏的都是你曾经的一部分。
2.什么是SPI?
SPI(Serial Peripheral Interface)是一种串行同步接口,最早由motorola公司提出,用在ADC,flash等与控制器之间通信的场合。同步是它的特点,意思是它在通信时由时钟控制,而不像UART由通信协议规定。 SPI总线一般有四根线,MISO(主输入从输出),MOSI(主输出从输入),SCK(串行移位时钟),NSS(/SS)(片选)。 SPI采用主从方式进行通信,有一个主机,可以跟随多个从机,采用全双工的通信方式,下图是主机和从机的连接方式,注意,不同于UART,发送和接收在两个设备中要交叉连接,这里是主机的MISO和从机的MISO相连,主机的MOSI和从机的MOSI相连,在硬件连接调试时可别弄错了。 下面针对STM32中SPI的四根线进行介绍。
-
NSS:从片选 低有效。包括两种模式,软件NSS和硬件NSS,两者共同决定了内部片选的输入。 软件NSS:NSS的电平由软件进行控制,主要是通过写SPI 控制寄存器的SS位进行实现。 硬件NSS:分为两种情况,一种是NSS内部输出被使能,作为主SPI时,SSOE被使能,使得NSS使能,所有与NSS相连的设备自动变成从设备;另一种情况是。NSS内部输出被禁止,只能由外部决定,当NSS被拉低时,说明是从设备了。 -
SCK:时钟信号,主输出,从输入 用于通讯数据的同步。由主机产生,最大的通讯速率为fpclk/2,可以通过配置控制寄存器的BR寄存器设置. APB(advanced peripheral bus):外围设备总线。 -
MOSI:主输出从输入 数据方向从主机到从机,当作为主机时,数据从这条线发送,而作为从机,从这条线接收数据。 -
MISO:主输入从输出 数据传输方向跟MOSI刚好相反。
SPI的内部原理如下图所示。
- 图中3部分是数据控制逻辑部分。MISO和MOSI直接与移位寄存器相连。
->发送数据时,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去。发送缓冲区的数据来自于数据总线。 -> 接收数据时,数据移位寄存器把数据一位一位存储到“接收缓冲区”中。 - 部分4是整体控制逻辑部分,用来协调整个 SPI 外设。控制参数包括配置SPI 模式、波特率的选择、主从模式选择等。
3. SPI的通信过程
3.1 通讯时序
下图是SPI作为主机时的通讯时序图。 上图包括以下几个信号; 1)起始信号和停止信号 当从机的NSS被拉低时,开始与主机进行通信,当NSS从低变为高后,停止与主机进行通信。
2)触发信号 表示数据变化时刻。
3)采样信号 表示数据的有效传输时刻。这里值得说明的是,采样方式,有四种,由CPOL/CPHA 决定。 CPOL:时钟极性。指 SPI 通讯设备处于空闲状态(不进行数据传输)时, SCK 信号线的电平信号,为0时SCK空闲时为低电平,为1时是高电平。 CPHA:时钟相位。为0时,在SCK的奇数边沿采样,为1时,在SCK的偶数边沿采样。 四种方式总结如下表: 下图是SCK偶数边沿采样,而这个边沿是上升沿还是下降沿取决于SCK空闲时低电平还是高电平,为低电平即CPOL为0时是下降沿采样,反之为上升沿采样。
3.2 数据收发过程
上图是某一种采样模式下,主机的数据收发过程。 1)发送数据时
- 把要发送的数据写到数据寄存器中,即数据总线上,然后放在发送缓冲器中,通过总线,并行传到移位寄存器里,然后串行从MOSI引脚移出。
- 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空。注意要发送数据之前,必须往缓冲器里写数据才能发送,所以TXE要先清零再置位。
- 等待到“TXE标志位”为 1时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可
2)接收数据时 - 把MISO接收到的数据串行放在移位寄存器中,然后通过总线并行移到接收缓冲器里,然后放在数据总线上。
- 当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空
- “RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容。
4. STM32里SPI的配置
1)GPIO的初始化 因为STM32的引脚一般是复用的,所以需要将GPIO配置成SPI的模式。 GPIO 初始化流程如下: 参考代码如下:
2)SPI的模式初始化 包括SPI的方向,主从选择,数据长度,时钟极性和相位,NSS的选择,波特率的设置,高/低位先行等. 参考代码如下: 之后需要使能SPI外设 3) 数据收发 根据前面SPI的通信过程,在发送数据时,需要等TXE置1才能发送,在发送时把数据存在发送缓冲器里,当RXE置1表示发送一帧完成,接收缓冲器里非空了,可以将接收缓冲器的数据取出。 参考代码如下:
参考文献 《零死角玩转STM32F103》 《STM32中文参考手册(RM008)》 《rm0091-stm32f0x1stm32f0x2stm32f0x8-advanced armbased-32bit-mcus-stmicroelectronics》
|