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

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

3天内不再提示

基于STM32编写一个SPI接口例程

冬至子 来源:物联网知识 作者:跋扈洋 2023-10-31 15:53 次阅读

引言

SPI是串行外设接口的缩写,是一种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口之一。本文将详细讲解一下SPI,并且最后基于STM32编写一个例程。

介绍

SPI简介

SPI(Serial Peripheral Interface)是一种串行外设接口,用于在微控制器MCU)或数字信号处理器DSP)等主设备与外部设备之间进行通信。SPI的设计旨在实现高速数据传输和简单的硬件实现。

SPI接口通常由一个主设备(Master)和一个或多个从设备(Slave)组成。主设备控制通信的时序和数据传输,而从设备根据主设备的指令进行响应。SPI通信基于全双工传输方式,主设备和从设备可以同时发送和接收数据。

物理层

SPI通信中的数据传输通过四根线实现:

  • SCLK(Serial Clock):时钟线,由主设备产生,并控制数据的传输速度。不同的设备支持的最
    高时钟频率不同,两个设备之间通讯时,通讯速率受限于低速设备。
  • MOSI(Master Output Slave Input):主设备输出线,负责将数据从主设备发送到从设备。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
  • MISO(Master Input Slave Output):主设备输入线,负责将数据从从设备发送到主设备。
  • SS(Slave Select):从设备选择线,用于选择特定的从设备与主设备进行通信。当有多个从设备时,上面的三条线是共同使用的,而 NSS 则是用来区分多个不同的设备,当主机需要选择某个从设备时,使用 NSS 信号线来寻址,把该从设备的 NSS 信号线设置为低电平,则该从设备被选择,片选有效,然后主机与被选择的从设备开始通讯。

图片

SPI通信中的数据传输是基于帧(Frame)的概念,每个帧由一个传输字节(Byte)组成。主设备通过时钟线控制数据传输的时序,并通过主输出线(MOSI)发送数据,从设备则通过主输入线(MISO)将数据发送回主设备。

协议层

通讯的起始和停止信号

当 NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机从自己的 NSS 线检测到起始信号后,就知道自己被主机选中了 ,准备与主机通讯。NSS 由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

图片

SPI 模式

SPI通信中存在四种常见的模式,用于描述主设备和从设备之间数据传输的时序和极性。他们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。这是通过 SPI_CR 寄存器的 CPOL 和 CPHA 位来控制。这些模式由两个参数定义:时钟极性(CPOL)和时钟相位(CPHA)。
时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通讯开始前、NSS 线为高电平时 SCK 的状态)。CPOL=0 时,SCK 在空闲状态时为低电平,CPOL=1 时,则相反。
时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿(串行同步时钟的第一个跳变沿)”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿(串行时钟的第二个跳变沿)”。

图片
图片

  • 模式0(CPOL = 0,CPHA = 0):
    时钟极性(CPOL)为低电平。
    时钟相位(CPHA)为下降沿采样。
    数据在时钟的下降沿进行采样,数据的变化在时钟的上升沿进行传输。
    数据在时钟的空闲状态为低电平。
  • 模式1(CPOL = 0,CPHA = 1):
    时钟极性(CPOL)为低电平。
    时钟相位(CPHA)为上升沿采样。
    数据在时钟的上升沿进行采样,数据的变化在时钟的下降沿进行传输。
    数据在时钟的空闲状态为低电平。
  • 模式2(CPOL = 1,CPHA = 0):
    时钟极性(CPOL)为高电平。
    时钟相位(CPHA)为下降沿采样。
    数据在时钟的下降沿进行采样,数据的变化在时钟的上升沿进行传输。
    数据在时钟的空闲状态为高电平。
  • 模式3(CPOL = 1,CPHA = 1):
    时钟极性(CPOL)为高电平。
    时钟相位(CPHA)为上升沿采样。
    数据在时钟的上升沿进行采样,数据的变化在时钟的下降沿进行传输。
    数据在时钟的空闲状态为高电平。

这四种模式的选择取决于主设备和从设备之间的时钟和数据采样方式。具体选择哪种模式取决于所使用的设备和应用的要求,以确保正确的数据传输和通信。

优缺点

优点

SPI接口具有以下几个优点:

  • 高速数据传输:SPI接口通常能够提供较高的数据传输速率,特别适用于对速度要求较高的应用。由于SPI使用全双工通信方式,数据可以同时在主设备和从设备之间传输,实现更快的数据交换速度。
  • 简单硬件实现:SPI接口的硬件实现相对简单,通常只需要少量的引脚和简单的电路即可。SPI接口没有复杂的协议和通信控制器,因此在嵌入式系统和小型设备中使用SPI接口可以减少成本和复杂性。
  • 灵活性:SPI接口支持点对点和多点通信。主设备可以连接多个从设备,每个从设备都有一个独立的片选信号(Slave Select),可以根据需要选择与主设备进行通信的从设备。这种灵活性使得SPI接口适用于连接多个外部设备或模块的应用场景。
  • 可靠性:SPI接口通常在短距离内进行通信,信号传输的距离相对较短,因此具有较低的传输误差和干扰风险。此外,SPI接口通常使用全双工通信,主设备和从设备可以同时发送和接收数据,从而提高了通信的可靠性。
  • 应用广泛:SPI接口在各种领域都得到广泛应用。它常用于连接各种外部设备,如传感器、存储器(如闪存和EEPROM)、显示器、数字转换器ADCDAC)等。由于其高速性和灵活性,SPI接口在通信和数据传输方面提供了一种有效的解决方案。

缺点

尽管SPI接口具有许多优点,但也存在一些缺点需要考虑:

  • 引脚占用:SPI通信通常需要使用多个引脚,包括时钟线、数据输入线、数据输出线和片选信号线。这可能对系统设计带来一定的复杂性,并且在引脚资源有限的情况下可能会造成问题。
  • 距离限制:由于SPI通信通常是基于并行电平传输,其传输距离受到电信号衰减和干扰的限制。通信距离相对较短,一般在几米以内。对于需要较长距离传输的应用,SPI可能不是最佳选择。
  • 缺乏标准化:SPI接口本身没有严格的标准化规范,导致不同设备和厂商可能会有不同的实现方式和特定的通信协议。这可能会导致兼容性问题,需要针对不同设备进行适配和定制。
  • 无差错校验:SPI协议本身没有提供内置的差错检测和校验机制。这意味着在数据传输过程中,如果发生传输错误,接收方无法直接检测到或纠正错误。对于对数据完整性要求较高的应用,需要额外的机制来确保数据的可靠性。
  • 仅适用于点对点或简单拓扑:SPI接口通常适用于点对点或简单的拓扑结构,其中一个主设备控制一个或多个从设备。对于复杂的网络结构或大规模系统,SPI的连接和管理可能变得复杂,并且不容易扩展和维护。

使用例程

基于STM32的SPI通信

硬件连接

图片

软件实现

  1. 首先是使能引脚,选择 SPI1 的双全工模式。选择 PD3 作为片选脚,也就是 NSS 信号线,产生起始和停止信号。
    图片
    图片
  2. 将 PD3 初始化为推挽输出。可以看到 3 个 SPI 引脚都是使用 GPIO 的复用模式。
  3. SPI参数配置
    图片
  4. 生成的程序里,主要的配置信息如下。
void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;//主机模式
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为八位
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的奇变化沿
  hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSS
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;//4分频,84MHz/4=21MHz
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
  hspi1.Init.CRCPolynomial = 10;//默认值,无效
  if (HAL_SPI_Init(&hspi1) != HAL_OK)////初始化
  {
    Error_Handler();
  }
}

总结

在现如今数据量剧增的时代,SPI这种通信速度快的通信接口以后一定会使用更加频繁,所以还是要加以学习。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10897

    浏览量

    355818
  • EEPROM
    +关注

    关注

    9

    文章

    1020

    浏览量

    81568
  • 时钟相位
    +关注

    关注

    0

    文章

    2

    浏览量

    5943
  • SPI接口
    +关注

    关注

    0

    文章

    258

    浏览量

    34377
  • 数字信号处理器

    关注

    5

    文章

    464

    浏览量

    27340
收藏 人收藏

    评论

    相关推荐

    STM32 SPI基础内容

    、存储芯片、温度传感器等众多器件都有使用SPI接口通信。 这些器件通常作为从设备,单片机作为主设备来控制它们,今天就结合STM32来分析SPI
    的头像 发表于 08-19 09:14 3327次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>SPI</b>基础内容

    请问有SPI接口的wifi模块例程吗?

    STM32spi接口的wifi开发例程吗?
    发表于 02-26 01:19

    SPI协议接口例程改写任务要求

    文章目录任务要求SPI协议接口例程改写任务要求练习通过SPI总线实现OLED屏幕显示。显示自己的学号和姓名。本人所用开发板:野火STM32F
    发表于 08-16 06:36

    STM32 SPI协议(7针)接口下的OLED屏显示 精选资料推荐

    ;代码编写烧录:KEIL5所用协议:SPI;所用例程来源:http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_ModuleSPI协议
    发表于 08-24 06:57

    0.96_OLED显示屏_STM32系列_SPI_例程

    0.96OLED显示屏_STM32系列_SPI_例程.rar
    发表于 07-12 10:36 186次下载

    分享LCD-12832的STM32驱动例程

    分享LCD-12832的STM32驱动例程
    发表于 04-01 16:11 80次下载

    SPI FLASH LittleFS文件系统例程资料免费下载

    SPI FLASH LittleFS文件系统例程,基于STM32F103+STM32Cube开发的详细资料免费下载。
    发表于 02-18 08:00 36次下载
    <b class='flag-5'>SPI</b> FLASH LittleFS文件系统<b class='flag-5'>例程</b>资料免费下载

    STM32SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码

    本文主要介绍STM32SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。
    的头像 发表于 09-24 14:09 1.6w次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>、cubeMX软件配置<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>和分析<b class='flag-5'>SPI</b>相关代码

    STM32F4 SPI-FLASH实验例程

    STM32F4 SPI-FLASH实验例程(java的哪个版本用于嵌入式开发)-STM32F4 SPI-FLASH实验
    发表于 07-30 16:01 23次下载
    <b class='flag-5'>STM32</b>F4 <b class='flag-5'>SPI</b>-FLASH实验<b class='flag-5'>例程</b>

    Proteus编写STM32F1 LED例程

    Proteus编写STM32F1 LED例程前提新建工程建立代码工程仿真最后前提1.已下载并破解安装好proteus2.Proteus里
    发表于 12-22 18:55 1次下载
    Proteus<b class='flag-5'>编写</b><b class='flag-5'>STM32</b>F1 LED<b class='flag-5'>例程</b>

    用HAL库函数实现STM32的两SPI接口相互通信

    最近要测试两设备间的SPI通信,可手上只有块开发板,虽然将开发板上SPI1接口的MISO与MOSI短接之后可以实现自发自收,但是我还想多
    发表于 12-22 19:17 9次下载
    用HAL库函数实现<b class='flag-5'>一</b>片<b class='flag-5'>STM32</b>的两<b class='flag-5'>个</b><b class='flag-5'>SPI</b><b class='flag-5'>接口</b>相互通信

    STM32CubeMX-HAL库的SPI接口使用

    本文主要介绍STM32SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。
    发表于 02-08 15:27 10次下载
    <b class='flag-5'>STM32</b>CubeMX-HAL库的<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>使用

    STM32微控制器上的Octo-SPI接口

    STM32微控制器上的Octo-SPI接口
    发表于 11-21 08:11 4次下载
    <b class='flag-5'>STM32</b>微控制器上的Octo-<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>

    基于STM32SPI通信

    SPI是串行外设接口的缩写,是种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口
    的头像 发表于 06-21 15:08 2840次阅读
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>SPI</b>通信

    STM32SPI控制器实现SPI

    SPI种高速的,全双工,同步的通信总线,原理和使用简单,占用引脚资源少,是种常用的通信方式。STM32通常有2~3
    发表于 07-22 11:47 3798次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SPI</b>控制器实现<b class='flag-5'>SPI</b>