您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

SPI协议并没有我想的那么简单

时间:2022-09-05 15:11:57  来源:今日头条  作者:嵌入式胖胖

先说串口

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

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

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

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

串口传输的过程

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

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

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

SPI通讯协议

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

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

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

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

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

 

具体要看对SPI的配置;

 

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

 

  •  

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

     

  •  

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

     

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

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

     

  •  

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

     

 

具体如下图所示;

SPI的时序

 

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

 

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

 

  •  

    MISO: Master input slave output 主机输入,从机输出(数据来自从机);

     

  •  

    MOSI: Master output slave input 主机输出,从机输入(数据来自主机);

     

  •  

    SCLK: Serial Clock 串行时钟信号,由主机产生发送给从机;

     

  •  

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

     

 

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

 

  •  

    MISO也可以是 SIMO , DOUT , DO , SDO 或 SO (在主机端);

     

  •  

    MOSI也可以是 SOMI , DIN , DI , SDI 或 SI (在主机端);

     

  •  

    NSS也可以是 CE , CS 或 SSEL ;

     

  •  

    SCLK也可以是 SCK ;

     

 

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

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

主从连接 时钟频率

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

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

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

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

时钟极性 CKP/Clock Polarity

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

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

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

 

  •  

    CKP = 0 :时钟空闲 IDLE 为低电平 0 ;

     

  •  

    CKP = 1 :时钟空闲 IDLE 为高电平 1 ;

     

时钟相位 CKE /Clock Phase (Edge)

 

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

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

 

  •  

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

     

  •  

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

     

时钟配置总结

 

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

 

其中黑色线为采样数据的时刻;
蓝色线为SCK时钟信号;

 

具体如下图所示;

模式编号

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 线上传输数据,最终导致接收数据乱码。

     

 

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

多NSS连接

第二种方法:菊花链

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

 

  1.  

    菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;

     

  2.  

    另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

     

 

具体的连接如下图所示;

菊花链连接

 

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

 

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

数据流图

 

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) ;

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。



Tags:SPI协议   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
SPI协议并没有我想的那么简单
先说串口之前写过一篇UART,通用串行异步通讯协议,感兴趣可以参考一下《 我打赌!你还不会UART 》; 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度...【详细内容】
2022-09-05  Search: SPI协议  点击:(369)  评论:(0)  加入收藏
SPI协议详解
1、 SPI简介SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实...【详细内容】
2020-10-19  Search: SPI协议  点击:(266)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(37)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(39)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(149)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(51)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(78)  评论:(0)  加入收藏
相关文章
站内最新
站内热门
站内头条