当前位置: 首页 > news >正文

SPI总线协议详解

目录

一.概述

二.特点

1.寻址方式

2.采用主-从模式(Master-Slave) 的控制方式

3.采用同步方式(Synchronous)传输数据

4.极性和相位

三.SPI总线传输的模式

四.SPI和I2C的区别


一.概述

         SPI(serial peripheral interface)是一种同步串行通信协议,由一个主设备和一个或多个从设备组成,主设备启动与从设备的同步通信,从而完成数据的交换。SPI是一种高速全双工同步通信总线,标准的SPI仅仅使用4个引脚,主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间。

SPI需要至少四根线,分别是MISO,MOSI,SCLK,CS

SDO/MOSI    – 主设备数据输出,从设备数据输入
SDI/MISO      – 主设备数据输入,从设备数据输出
SCLK   – 时钟信号,由主设备产生
CS        – 从设备使能信号,由主设备控制
        CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能;

  SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输;

       要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档;

      在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

二.特点

1.寻址方式

        当主设备要和某个从设备进行通信时,主设备需要先向对应从设备的片选线上能能发送使能信号(高电平或低电平,根据从机而定)表示选中该从设备。和I2C不同,I2C通过从设备的地址来进行寻址。

2.采用主-从模式(Master-Slave) 的控制方式

        SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作.

3.采用同步方式(Synchronous)传输数据

SPI的通信过程:(注意:I2C中必须是SCL低电平发送数据,接收数据SCL低电平但是SPI中是可以调节的。)

        SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑1,低电平表示逻辑0;一个字节传送完成后无需应答即可开始下一个字节的传送;spi总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送。(串口uart是异步通信,通信之前要将波特率定下来,spi是同步通信,是通过
时钟线来,一个时钟周期发一位)

4.极性和相位

对于一个特定的从设备来说,一般在出厂时就会将其设计为某种特定的工作模式我们在使用该设备时就必须保证主设备的工作模式和从设备保持一致,否则无法进行通信,所以一般需要对主设备的CPOL和CPHL进行配置

CPOL:clock polarity 时钟的极性;表示 SPI 在空闲时, 时钟信号是高电平还是低电平. 

CPHA:clock phase 时钟的相位;表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样.


CPOL表示SCLK空闲的状态:0---SCLK低   1---SCLK高
CPHA表示采样时刻: 0---每个周期第一个时钟沿采样
                                        1---每个周期的第二个时钟沿采样

三.SPI总线传输的模式

  SPI总线传输一共有4种模式,这4种模式分别由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)来定义,其中CPOL参数规定了SCK时钟信号空闲状态的电平,CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采样。这四种模式的时序图如下图所示:

模式0:CPOL= 0,CPHA=0。SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

模式1:CPOL= 0,CPHA=1。SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式2:CPOL= 1,CPHA=0。SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式3:CPOL= 1,CPHA=1。SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

SPI接口时钟配置心得:

       在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的MOSI连接从设备的MISO,从设备的MOSI连接主设备的MISO,从设备MISO接收的数据是主设备的MOSI发送过来的,主设备MISO接收的数据是从设备MOSI发送过来的,所以主设备这边SPI时钟极性的配置(即MOSI的配置)跟从设备的MOSI接收数据的极性是相反的,跟从设备MOSI发送数据的极性是相同的


意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。


四.SPI和I2C的区别


I2C和SPI的异同
相同点:
1.均采用串行,同步的方式
2.均采用TTL电平,传输距离和应用场景类似
3.均采用主从方式工作

不同点:
1.I2C为半双工,SPI为全双工
2.I2C有应答机制,SPI无应答机制
3.I2C通过向总线广播从机地址来寻址,SPI通过向对应从机发送使能信号
(优缺点:I2C布线简单占用资源少费时间,SPI占用资源多但是速度快)
4.I2C的时钟极性和时钟相位固定,SPI的时钟极性和时钟相位可调。
 

相关文章:

  • 【产品设计】产品外观设计的特点与优势
  • SpingBoot自动装配原理
  • qt编程中的一些技巧
  • 刷题记录:NC146615简单的数据结构
  • 2022.10月11月todo
  • Pytorch混合精度训练
  • 不会代码(实操能力弱一点)的我如何快速开发出一个Android/Web/IOS/小程序
  • 【博客503】kubelet device plugin如何管理与分配device
  • 第4章-4 验证“哥德巴赫猜想”
  • 嗨购商业模式赋能消费者、创业者和实体商家,助力中小微企业
  • 1469_TC275串口字符串输出例程中的中断功能分析
  • 360面试——计算机视觉面试
  • CentOS6.9更换yum源镜像网站方法大汇总
  • React组件间传值
  • SQL入门(三)数据库之表连接(内联外联的区别)
  • $translatePartialLoader加载失败及解决方式
  • [译] 怎样写一个基础的编译器
  • 【EOS】Cleos基础
  • IP路由与转发
  • JSONP原理
  • nfs客户端进程变D,延伸linux的lock
  • React组件设计模式(一)
  • vue2.0项目引入element-ui
  • vue数据传递--我有特殊的实现技巧
  • Vultr 教程目录
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Yii源码解读-服务定位器(Service Locator)
  • 半理解系列--Promise的进化史
  • 技术胖1-4季视频复习— (看视频笔记)
  • 你真的知道 == 和 equals 的区别吗?
  • 前端面试总结(at, md)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Spring第一个helloWorld
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​ssh免密码登录设置及问题总结
  • #13 yum、编译安装与sed命令的使用
  • #AngularJS#$sce.trustAsResourceUrl
  • #include到底该写在哪
  • (3)(3.5) 遥测无线电区域条例
  • (4)(4.6) Triducer
  • (4)事件处理——(7)简单事件(Simple events)
  • (Java数据结构)ArrayList
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (笔试题)分解质因式
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)elasticsearch 源码之启动流程分析
  • (小白学Java)Java简介和基本配置
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转载)OpenStack Hacker养成指南
  • *p++,*(p++),*++p,(*p)++区别?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core Web APi类库如何内嵌运行?