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

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

3天内不再提示

SPI协议相关的内容

我快闭嘴 来源:记得诚 作者:记得诚 2022-09-05 10:50 次阅读

大家好,我是记得诚。

今天分享SPI协议相关的内容。

目录

  • 前面的话

  • 目录

  • 先说串口

  • SPI通讯协议

  • SPI特性

  • 模式编号

  • 多从机模式

  • 优缺点

  • 编程实现

先说串口

之前写过一篇UART,通用串行异步通讯协议,感兴趣可以参考一下《通俗易懂的UART协议帧格式》;因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

如果要解决这个问题,UART为每个字节添加额外的起始位停止位,以帮助接收器在数据到达时进行同步;

双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。

传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示;

982cd136-2c54-11ed-ba43-dac502259ad0.png串口传输的过程

如果您注意到上图中的11001010不等于0x53,这是一个细节。串口协议通常会首先发送最低有效位,因此最小位在最左边LSB。低四位字节实际上是0011 = 0x3,高四位字节是0101 = 0x5

异步串行工作得很好,但是在每个字节发送的时候都需要额外的起始位停止位以及在发送和接收数据所需的复杂硬件方面都有很多开销。

不难发现,如果接收端和发送端设置的速度都不一致,那么接收到的数据将是垃圾(乱码)。

下面开始讲一下SPI协议,会有哪些优点。

SPI通讯协议

于是我们想有没有更好一点的串行通讯方式;相比较于UARTSPI的工作方式略有不同。

SPI是一个同步的数据总线,也就是说它是用单独的数据线一个单独的时钟信号来保证发送端和接收端的完美同步

时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。

产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);

数据的采集时机可能是时钟信号上升沿(从低到高)或下降沿(从高到低)。

具体要看对SPI的配置;

整体的传输大概可以分为以下几个过程:

  • 主机先将NSS信号拉低,这样保证开始接收数据;

  • 接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);

    由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。

  • 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;

  • 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

具体如下图所示;

984828b4-2c54-11ed-ba43-dac502259ad0.pngSPI的时序

注意,SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;

SPI特性

SPI总线包括4条逻辑线,定义如下:

  • MISOMaster input slave output 主机输入,从机输出(数据来自从机);

  • MOSIMaster output slave input 主机输出,从机输入(数据来自主机);

  • SCLKSerial Clock 串行时钟信号,由主机产生发送给从机;

  • SSSlave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;

  • MISO也可以是SIMODOUTDOSDOSO(在主机端);

  • MOSI也可以是SOMIDINDISDISI(在主机端);

  • NSS也可以是CECSSSEL;

  • SCLK也可以是SCK;

本文将按照以下命名进行讲解[MISO, MOSI, SCK,NSS]

下图显示了单个主机和单个从机之间的典型SPI连接。

986651e0-2c54-11ed-ba43-dac502259ad0.png主从连接

时钟频率

SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输

主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。

就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;

从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。

时钟极性 CKP/Clock Polarity

除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性

根据硬件制造商的命名规则不同,时钟极性通常写为CKPCPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;

CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。

  • CKP = 0:时钟空闲IDLE为低电平 0
  • CKP = 1:时钟空闲IDLE为高电平1

时钟相位 CKE /Clock Phase (Edge)

除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKECPHA

顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

  • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
  • CKE = 1:在时钟信号SCK的第二个跳变沿采样;

时钟配置总结

综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;

其中黑色线为采样数据的时刻;

蓝色线为SCK时钟信号;

具体如下图所示;

987912f8-2c54-11ed-ba43-dac502259ad0.png

模式编号

SPI的时钟极性和相位的配置通常称为 SPI模式,所有可能的模式都遵循以下约定;具体如下表所示;

SPI Mode CPOL CPHA
0 [00] 0 0
1 [01] 0 1
2 [10] 1 0
3 [11] 1 1

除此之外,我们还应该仔细检查微控制器数据手册中包含的模式表,以确保一切正常。

多从机模式

前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:

第一种方法:多NSS

  1. 通常,每个从机都需要一条单独的SS线。
  2. 如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

具体连接方式如下图所示;

9888c432-2c54-11ed-ba43-dac502259ad0.png多NSS连接

第二种方法:菊花链

在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链

  1. 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
  2. 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

具体的连接如下图所示;

98ad04dc-2c54-11ed-ba43-dac502259ad0.png菊花链连接

其中红线加粗为数据的流向;

所以最终的数据流向图可以表示为:

98c347f6-2c54-11ed-ba43-dac502259ad0.png数据流图

SCK为时钟信号,8clks表示8个边沿信号;

其中D为数据,X为无效数据;

所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

优缺点

SPI通讯的优势

使SPI作为串行通信接口脱颖而出的原因很多;

  • 全双工串行通信;
  • 高速数据传输速率。
  • 简单的软件配置;
  • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
  • 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

SPI的缺点

  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
  • 通常仅支持一个主设备;
  • 需要更多的引脚(与I2C不同);
  • 没有定义硬件级别的错误检查协议;
  • RS-232和CAN总线相比,只能支持非常短的距离;

编程实现

下面是通过STM32的cubemx自动生成的HAL库代码,比较简单,截取了其中一部分,具体如下;

staticvoidMX_SPI1_Init(void)
{
hspi1.Instance=SPI1;
hspi1.Init.Mode=SPI_MODE_MASTER;//主机模式
hspi1.Init.Direction=SPI_DIRECTION_2LINES;//全双工
hspi1.Init.DataSize=SPI_DATASIZE_8BIT;//数据位为8位
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_2;//2分频,32M/2=16MHz
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(__FILE__,__LINE__);
}
}

//发送数据
HAL_StatusTypeDef
HAL_SPI_Transmit(SPI_HandleTypeDef*hspi,
uint8_t*pData,
uint16_tSize,
uint32_tTimeout);
//接收数据
HAL_StatusTypeDef
HAL_SPI_Receive(SPI_HandleTypeDef*hspi,
uint8_t*pData,
uint16_tSize,
uint32_tTimeout);

希望对你有帮助,我们下一期见。

审核编辑:汤梓红

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

    关注

    17

    文章

    1615

    浏览量

    89600
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99961
  • 通讯协议
    +关注

    关注

    9

    文章

    249

    浏览量

    20173

原文标题:SPI协议并没有我想的那么简单

文章出处:【微信号:记得诚,微信公众号:记得诚】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SPI协议层及固件库

    《STM32从零开始学习历程》@EnzoReventonSPI物理层相关链接:SPI协议SPI外设SPI固件库参考资料:[野火EmbedF
    发表于 08-20 08:00

    SPI通信协议的基础知识解析

    SPI通信协议详解写在最前: 本文讲述了SPI通信协议的基本内容包括如下SPI的基础知识
    发表于 12-13 08:05

    SPI协议相关资料分享

    FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]一.SPI协议简要介绍SPI,是英语SerialPeriphe
    发表于 01-18 10:01

    SPI协议相关资料推荐

    1.SPI协议简介1.1.SPI协议概括  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围
    发表于 01-24 07:06

    SPI协议相关资料推荐

    目录第一步:SPI协议简介1.物理层2.协议层第二步:SPI特性及架构第一步:SPI协议简介
    发表于 01-26 08:25

    STM32 SPI通信协议相关资料分享

    文章目录(一)SPI协议简介(二)SPI物理层(三)SPI协议层3.1、SPI基本通信过程3.2
    发表于 02-11 06:10

    SPI协议是怎么实现的

    写在前面:本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。目录一、SPI协议二、W25Qxx芯片三
    发表于 02-17 07:29

    基于SPI协议的SD卡读写

    基于SPI协议的SD卡读写,SD卡的协议分析。
    发表于 01-06 14:24 0次下载

    RT-Thread上SPI的细节内容

    相关内容,基于此,本文就来详细说明RT-Thread上设备SPI的移植与实践,SPI的通信原理不用赘诉,百度一搜索,对应的知识点就明明白白的。本文的主要内容还是阐述一下RT-Thre
    的头像 发表于 09-30 15:35 3588次阅读
    RT-Thread上<b class='flag-5'>SPI</b>的细节<b class='flag-5'>内容</b>

    基于FPGA的SPI协议及设计实现

    基于FPGA的SPI协议及设计实现博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢!引言介绍在电子通信领域里采用的通信协议有IIC,SPI
    发表于 11-05 19:05 22次下载
    基于FPGA的<b class='flag-5'>SPI</b><b class='flag-5'>协议</b>及设计实现

    软件模拟SPI协议

    软件模拟SPI协议什么是SPISPI的通讯模式通讯协议详细程序简写程序结语最近在学习51单片机的内容,为了防止自己学过就忘,在这里写一些平时的学习笔记,如果有错误希望大家可以给我指正一
    发表于 12-22 19:14 13次下载
    软件模拟<b class='flag-5'>SPI</b><b class='flag-5'>协议</b>

    SPI协议

    目录SPI协议简介SPI物理层SPI协议SPI协议
    发表于 12-22 19:17 30次下载
    <b class='flag-5'>SPI</b><b class='flag-5'>协议</b>

    spi协议介绍

    文章目录前言一、SPI介绍1.SPI总线2.寻址方式二、通信原理1.通信过程2.极性和相位3.四种工作模式三、SPI与I2C的异同1.相同点2.不同点总结前言spi
    发表于 12-22 19:21 19次下载
    <b class='flag-5'>spi</b><b class='flag-5'>协议</b>介绍

    STM32的SPI相关知识

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

    一文看懂SPI协议

    作者:王超首发:电子电路开发学习都有哪些内容SPI协议简介4线还是3线?4种工作模式多种传输速率SPI协议的时序
    发表于 01-25 18:35 38次下载
    一文看懂<b class='flag-5'>SPI</b><b class='flag-5'>协议</b>