单片机学习小组
直播中

cherry1989

12年用户 958经验值
擅长:嵌入式技术
私信 关注

什么是SPI? SPI的通信过程是怎样的?

什么是SPI?SPI的通信过程是怎样的?

回帖(1)

卢鉴冰

2022-2-10 11:10:13
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的配置

参考代码如下:

2)SPI的模式初始化
包括SPI的方向,主从选择,数据长度,时钟极性和相位,NSS的选择,波特率的设置,高/低位先行等.
参考代码如下:
之后需要使能SPI外设

3) 数据收发
根据前面SPI的通信过程,在发送数据时,需要等TXE置1才能发送,在发送时把数据存在发送缓冲器里,当RXE置1表示发送一帧完成,接收缓冲器里非空了,可以将接收缓冲器的数据取出。
参考代码如下:

举报

更多回帖

发帖
×
20
完善资料,
赚取积分