0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32基础知识:SPI总线概述

CHANBAEK 来源:上下求索电子er 作者:上下求索电子er 2023-10-26 14:26 次阅读

SPI总线概述

1 基本概念

串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信也可以只使用3根线(NSS、MISO/MOSI、SCK),就可以利用这种机制实现一对多或者一对一的通信。

2 引脚定义

通常SPI通过4个引脚与外部器件相连:

  • MISO (Master Input Slave Output):主设备输入/从设备输出引脚 。该引脚在从模式下发送数据,在主模式下接收数据。
  • MOSI (Master Output Slave Input):主设备输出/从设备输入引脚。 该引脚在主模式下发送数据,在从模式下接收数据。
  • SCK (Serial Clock):串行时钟 ,作为主设备的输出,从设备的输入.
  • NSS (Negative Slave Select):低电平有效的从器件选择。 这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

图片
SPI总线:单一主机对单一从机

图片
SPI总线:单一主机对复合从机

SPI总线采用的 环形结构 ,利用的是主从模式(主机→从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机发送的数据。

图片

MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。

NSS的说明:主机的NSS引脚在空闲状态下应处于高电平(VDD),主机发送数据时,主机的NSS应为输出模式,从机的NSS为输入模式,当主机的NSS引脚拉低,从设备的NSS引脚可以检测到低电平,该设备被选中。

从SPI的结构框图中可以看到NSS也是外部引脚的名称,其实控制SPI收发数据是通过内部的NSS信号实现的,而这个内部的NSS信号源可以由SPI_CR1寄存器的SSM(Software slave management)位来配置。

  • 软件NSS模式,SSM=1 :可以通过设置SPI_CR1寄存器的SSM位来使能这种模式。在这种模式下NSS引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。
    图片
    图片
    SSM :软件从设备管理。当SSM被置位时,NSS引脚上的电平由SSI位的值决定。
    0:禁止软件从设备管理;
    1:启用软件从设备管理。
  • 硬件NSS模式,SSM=0:内部NSS信号电平由NSS引脚电平决定。在这种“硬件模式”下要用SPI_CR2的SSOE(Software Save Output Enable)位来控制NSS作为输入还是输出,当SSOE=0时,NSS引脚被配置为输入;当SSOE=0时,NSS引脚被配置为输出。

3 工作模式

注意:由于SPI外设是 全双工同步通信 ,所以时钟信号就由SCK引脚来生成, SCK引脚只能由主设备控制,从设备是无法控制的 ,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。

3.1 时钟信号的相位和极性

SPI_CR寄存器的CPOL(时钟极性位)和CPHA(时钟相位位),能够组合成四种可能的时序关系。

  • 时钟极性CPOL :指的是在SPI总线空闲状态下(不传输任何数据)SCK引脚的默认的电平状态。SCK空闲状态下的电平可以由SPI_CR1寄存器的CPOL位来进行设置。主设备的时钟极性要根据从设备来设置。
    • 如果CPOL被清‘0’,SCK引脚在空闲状态保持低电平;
    • 如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。
  • 时钟相位CPHA :指的是在传输数据时选择脉冲信号的边沿(上升沿或者下降沿)来进行数据的采集或者修改。该位可以由SPI_CR1寄存器的CPHA位来进行设置。主设备的时钟相位要根据从设备来设置。
    • 如果CPHA位被置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。
    • 如果CPHA位被清’0’,SCK时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。
CPOLCPHA模式说明
00该模式指的是SCK引脚在空闲状态下为低电平,并且在第一个时钟边沿(上升沿)采集数据,在第二个时钟边沿(下降沿)来修改数据。
01该模式指的是SCK引脚在空闲状态下为低电平,并且在第二个时钟边沿(下降沿)采集数据,在第一个时钟边沿(上升沿)来修改数据。
10该模式指的是SCK引脚在空闲状态下为高电平,并且在第一个时钟边沿(下降沿)采集数据,在第二个时钟边沿(上升沿)来修改数据。
11该模式指的是SCK引脚在空闲状态下为高电平,并且在第二个时钟边沿(上升沿)采集数据,在第一个时钟边沿(下降沿)来修改数据。

通过这两位可以得到四种不同的组合,就被作为SPI总线的工作模式( 模式0~模式3 ),到底要选择哪种模式,主机的工作模式必须根据从设备的数据手册的说明进行设置。

在实际的开发过程中,使用最多是模式0模式3 ,比如2.4G无线通信模块NRF24L01采用模式0来通信。

图片

3.2 数据帧格式

  • 根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB(高位先出)在先也可以LSB(低位先出)在先。主机的数据格式必须要根据从机的数据格式进行设置。
  • 根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。

图片

DFF :数据帧格式 (Data frame format)

  • 0:使用8位数据帧格式进行发送/接收;
  • 1:使用16位数据帧格式进行发送/接收。
    注:只有当SPI禁止(SPE=0)时,才能写该位,否则出错

LSBFIRST :帧格式 (Frame format)

  • 0:先发送MSB;
  • 1:先发送LSB。
    注:当通信在进行时不能改变该位的值。

4 通信速率

图片

5 使用流程

The SPI HAL driver can be used as follows:

  (#) **Declare a SPI_HandleTypeDef handle structure**, for example:
      `SPI_HandleTypeDef  hspi`;

  (#)**Initialize the SPI low level resources** by implementing the `HAL_SPI_MspInit()` API:
      (##) **Enable the SPIx interface clock**
      (##) **SPI pins configuration**
          (+++) Enable the clock for the SPI GPIOs
          (+++) Configure these SPI pins as alternate function push-pull
      (##) **NVIC configuration if you need to use interrupt process**
          (+++) Configure the SPIx interrupt priority
          (+++) Enable the NVIC SPI IRQ handle
      (##) **DMA Configuration if you need to use DMA process**
          (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel
          (+++) Enable the DMAx clock
          (+++) Configure the DMA handle parameters
          (+++) Configure the DMA Tx or Rx Stream/Channel
          (+++) Associate the initialized hdma_tx(or _rx)  handle to the hspi DMA Tx or Rx handle
          (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel

  (#) **Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS
      management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.**

  (#) **Initialize the SPI registers by calling the** `HAL_SPI_Init() API`:
      (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
          by calling the customized HAL_SPI_MspInit() API.

简述如下:

  • 声明一个 SPI_HandleTypeDef 句柄结;
  • 通过 HAL_SPI_MspInit() 初始化 SPI 低级资源;
    • 使能 SPIx 接口时钟
    • SPI 引脚配置
    • 如果需要使用中断进程,配置NVIC
    • 如果需要使用DMA进程,配置DMA
  • 在hspi初始化结构体中配置Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS, management, Clock polarity and phase, FirstBit and CRC
  • 通过调用 HAL_SPI_Init()初始化 SPI 寄存器:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148494
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348743
  • SPI总线
    +关注

    关注

    4

    文章

    100

    浏览量

    27442
  • 同步通信
    +关注

    关注

    0

    文章

    26

    浏览量

    9098
收藏 人收藏

    评论

    相关推荐

    STM32单片机中的C语言基础知识

    C语言是单片机开发中的必备基础知识,本文列举了部分STM32学习中比较常见的一些C语言基础知识
    发表于 09-21 17:21 4135次阅读

    SPI总线协议的基础知识

    SPI,是英语 Serial Peripheral Interface 的缩写顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线, 并且在芯片的管脚上只占用四根线。
    发表于 06-07 15:40 4283次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>协议的<b class='flag-5'>基础知识</b>

    Redis基础知识概述

    Redis——基础知识
    发表于 04-21 07:42

    CAN协议基础知识

    CAN协议基础知识I2C.SPI总线多用于短距离传输,协议简单,数据量少,主要用于IC之间的通讯,而 CAN 总线则不同,CAN(Controller Area Network)
    发表于 08-19 06:24

    单片机基础知识学习笔记分享

    单片机基础知识学习笔记有关总线1.IIC总线2.SPI总线
    发表于 11-23 07:37

    《振南电子STM32视频教程》第十一讲:SPI总线

    [第11讲] SPI总线(85分钟),由何强主讲.本课主要讲解:(1).SPI总线介绍;(2).SPI
    发表于 10-09 16:08 1393次阅读

    MATLAB基础知识MATLAB的简介,编程环境和基本操作的详细概述

    MATLAB基础知识MATLAB的简介,编程环境和基本操作的详细概述
    的头像 发表于 06-02 10:18 7091次阅读
    MATLAB<b class='flag-5'>基础知识</b>MATLAB的简介,编程环境和基本操作的详细<b class='flag-5'>概述</b>

    S7300数值及BCD基础知识概述

    本文主要介绍了S7300数值及BCD基础知识概述.
    发表于 06-27 08:00 1次下载
    S7300数值及BCD<b class='flag-5'>基础知识</b><b class='flag-5'>概述</b>

    电子元器件基础知识概述(含图片)

    本文主要介绍了电子元器件基础知识概述(含图片)。
    发表于 06-26 08:00 0次下载
    电子元器件<b class='flag-5'>基础知识</b><b class='flag-5'>概述</b>(含图片)

    单片机基础知识学习笔记

    单片机基础知识学习笔记有关总线1.IIC总线2.SPI总线
    发表于 11-14 16:51 26次下载
    单片机<b class='flag-5'>基础知识</b>学习笔记

    全面介绍PCIe总线基础知识

    全面介绍PCIe总线基础知识
    发表于 12-14 11:49 0次下载

    STM32SPI相关知识

    STM32SPI相关知识一、前言本人使用的是stm32f103的开发板,Flash芯片是W25Q64。本章介绍SPI的相关通讯
    发表于 12-22 19:33 7次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SPI</b>相关<b class='flag-5'>知识</b>

    CAN总线基础知识详细讲解

    CAN总线基础知识详细讲解。
    发表于 04-02 17:44 14次下载

    STM32中C语言的基础知识

    C语言是单片机开发中的必备基础知识,本文列举了部分STM32学习中比较常见的一些C语言基础知识,希望能对大家有所帮助。
    的头像 发表于 04-27 17:42 993次阅读
    <b class='flag-5'>STM32</b>中C语言的<b class='flag-5'>基础知识</b>

    SPI协议基础知识

    电子发烧友网站提供《SPI协议基础知识.pdf》资料免费下载
    发表于 11-16 10:32 1次下载
    <b class='flag-5'>SPI</b>协议<b class='flag-5'>基础知识</b>