SPI 协议学习

背景

2年之前学过SPI,但是因为现在太久没用、基础知识不牢靠(对自己的面试表现不满意);所以重新整理了一遍。

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

介绍

SPI是串行外设接口(Serial Peripheral Interface)的缩写;是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。

作为嵌入式工程师的老朋友,SPI与I2C一样,都可以用在对各类芯片通信上(实现对芯片的配置)。

一些比较好的配置芯片运行同时支持I2C、SPI或者其他总线协议。

通常,SPI是一种4线制的全双工总线协议;它们分别是:

  • SDI(数据输入):(主)设备数据输入;因为这里的 输入指的是主机的输入,那么对于对端来说,就是从机输出;所以通常被称为MISO。
  • SDO(数据输出):主设备数据输出,从设备数据输入,即MOSI。
  • SCLK(时钟):时钟信号,由主设备产生。通信时一直变化,没有通信时保持固定电平。
  • CS(片选):从设备使能信号,由主设备控制。一般每一个从设备的CS都不一样。

如果只需要单向接收,那么可以省去一个IO。

结合框图理解一下:

当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。

SPI 通信速度

SPI 通信速率:一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。

不比I2C,SPI的通信速率主要看主从器件SPI控制器的性能限制:

  1. SPI的最大时钟频率(短板理论)
  2. CPU处理SPI数据的能力
  3. 输出端驱动能力(PCB所允许的最大信号传输速率)

SPI的最大时钟频率

一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。虽然SPI的传输速率主要受限于CPU处理SPI数据的能力,但在同另一个非高速率的SPI设备通讯时,其SPI的最大时钟频率将有可能制约其传输速率

短板效应:盛水的木桶是由许多块木板箍成的,盛水量也是由这些木板共同决定的。若其中一块木板很短,则盛水量就被短板所限制。这块短板就成了木桶盛水量的“限制因素”(或称“短板效应”)。

CPU处理SPI数据的能力

通常情况下,考虑到系统中CPU有可能需要处理其他任务,以及对所接收SPI数据的具体运算处理方法,CPU处理SPI数据的能力将影响到整体的传输速率。

例如,系统在收到SPI数据后只是作简单的累加。如果当前SPI模块的时钟频率是1/2系统时钟频率,接收每一个SPI byte将需要16个系统时钟周期。那么在下一笔SPI数据接收到之前CPU有足够的时间来处理当前数据,此时SPI的最大传输速率即为系统时钟的1/2。

接下来考虑另外一种情形,假设CPU有50%的时间用于处理其他任务,同时对所接收到的每byte SPI数据,需要100个系统时钟周期来作运算处理。每接收1 byte SPI数据,CPU需要100个时钟周期来作处理,同时需要100个时钟周期来处理其他任务,因此总共需要消耗200个系统时钟周期。用公式表达如下:

200 *Tsysclk = 8 * Tspiclk;
spiclk = sysclk/25;

因此,在这个例子中,我们可以看出SPI的最大传输速率由CPU处理SPI数据的能力所决定。

输出端驱动能力

最后要考虑的因素是输出节点的驱动力。PCB上的微量电容和器件引脚的输出阻抗相结合,将会形成一个低通滤波器,限制设备间信号的传输速度。通常该滤波器的截止频率可以近似为:

Fmax = 1 /(2 × π × Rdrive * Ctrace)

其中Rdrive是所驱动的最大阻抗值,Ctrace表示输出节点所驱动的所有微量电容的总和。

在固定阻抗条件下,电路的微量电容将成为制约SPI传输速率的因素。系统中如果设备间的距离非常短(Ctrace较小值),那么CPU的处理能力或SPI的时钟频率将是主要限制因素。如果系统中总线上有多个SPI设备,同时设备间的连线很长(Ctrace较大值),那么输出驱动能力将制约SPI的传输速率。

SPI模式

在SPI协议中,使用SPI通信时,需要注意两个概念,这两个概念共同决定了SPI通信的属性。

时钟极性CPOL,规定了时钟的有效电平(高或低):配置SCLK的电平处于哪种状态时是空闲态或者有效态

  • 若CPOL = 1,串行同步时钟的空闲状态为高电平(常高电平时不工作);
  • 若CPOL = 0,串行同步时钟的空闲状态为低电平(常低电平时不工作);

时钟相位CPHA ,规定了数据的采样时刻(奇或偶):是用来配置数据采样是 在串行同步时钟的 奇或偶 个 跳变沿(上升或下降)数据将被采样

  • 若CPHA = 0,在串行同步时钟SCLK的第一个跳变沿(上升或下降)数据将被采样;
  • 若CPHA = 1,在串行同步时钟SCLK的第二个跳变沿(上升或下降)数据将被采样;
  • 时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

根据CPOL(时钟极性)和CPHA(时钟相位)的不同,市面上的总线协议共有4种模式:

  • Mode0:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样(读取)是在上升沿,数据发送是在下降沿。
  • Mode1:CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样(读取)是在下降沿,数据发送是在上升沿。
  • Mode2:CPOL=1,CPHA=0 :此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集(读取)是在下降沿,数据发送是在上升沿。
  • Mode3:CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集(读取)是在上升沿,数据发送是在下降沿。

不同的从设备的SPI模式一般是不能改变的;而为了达到通信的目的,双方的SPI模式必须匹配;因此,有时候需要修改主机的通信模式。

SPI 通信过程

SPI以主从方式工作:主机主动发起通信,按MSB或LSB的顺序一位一位传输数据;从机被动接收、处理主机发送的数据。

不光是数据,甚至,时钟、片选使能信号也是主机提供的。

SPI能够实现发送时按位接收从设备的数据。

下面以CPHA=0为例讲解SPI时序。

发起通信

主设备拉起片选NSS(N代表低电平有效),选中对应的从设备。

同时,主设备开始驱动CLK时钟产生信号。

假设下面的8位寄存器装的是待发送的数据1010 1010(0XAA),上升沿发送、下降沿接收、高位先发送(MSB)。

发送后,从机对应的寄存器的buff存放了0101 0101(0X55)。

那么第一个上升沿来的时候 数据将会是SDO=1;寄存器=0101010x(X代表不确定,因为没有从从设备读回数据)。下降沿到来的时候,将SDI上的电平保存为二进制值,那么这时寄存器=0101 010 BIT[SDI] ;SCLK时钟再接下来的7个脉冲以后,主从中的两个寄存器的内容便互相交换一次。这样就完成里一个SPI时序。

举例:

假设主机和从机初始化就绪:并且主机的sbuff=0xaa(1010 1010),从机的sbuff=0x55(0101 0101),下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

加粗的地方代表需要重点留意;高量的地方代表已经储存的值。

SCLK脉冲 主机buff 从机buff MISO(sdi) MOSI(sdo)
低电平 1010 1010 0101 0101 X X
第1个 0101 010X 1010101X X 1
第1个 0101 010 0 10101011 0 X
第2个 1010 100X 0101 011X X 0
第2个 1010 1001 0101 0110 1 X
第3个 0101 001X 1010 110X X 1
第3个 0101 0010 1010 1101 0 X
第4个 1010 010X 0101 101X X 0
第4个 1010 0101 0101 1010 1 X
第5个 010 0101X 1011 010X X 1
第5个 0100 1010 1011 0101 0 X
第6个 1001 010X 0110 101X X 0
第6个 1001 0101 0110 1010 1 X
第7个 0010 101X 110 1010X X 1
第7个 0010 1010 1101 0101 0 X
第8个 010 1010X 1010 101X X 0
第8个 0101 0101 1010 101X 1 X

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。

根据以上分析,一个完整的传送周期是16位,即两个字节:因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

附录:SPI模式有关理解框图

附录:SPI 内部机制

SSPSR: SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。

ref :

SPI 协议学习的更多相关文章

  1. SPI协议及IO模拟

    SPI协议 SPI协议网上资料比较多,但是也比较乱,当初在网上搜集的错误资料导致现在比较混乱. SPI协议资料比较正规的是: 1.SPI的规约协议英文文档,例如<摩托罗拉spi协议规范> ...

  2. TCP/IP协议学习(五) 基于C# Socket的C/S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  3. FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  4. [SPI]SPI协议详解

    转自:https://my.oschina.net/freeblues/blog/67400 1.SPI协议简介 1.1.SPI协议概括 SPI,是英语Serial Peripheral interf ...

  5. [SPI&I2C]I2C和SPI协议介绍

    IIC vs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...

  6. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  7. http协议学习系列

    深入理解HTTP协议(转)  http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列   1. 基础概念篇 1.1 介绍 H ...

  8. SPI协议及其工作原理详解

    一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...

  9. SPI协议及其工作原理浅析

    转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...

  10. BGP协议学习总结

    BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...

随机推荐

  1. SpringBoot 二维码生成

    一.基于Google开发工具包ZXing生成二维码 1.引入需要的依赖 <!-- zxing生成二维码 --> <dependency> <groupId>com. ...

  2. nim 5. 读写文件

    读文件 假设nim程序相同的文件夹下,有个people.txt文件,内容如下: Alice A. Bob B. Carol C. 读取这个文件的代码 import strutils let conte ...

  3. 1.简单的C语言程序

    简单的C语言程序 什么是计算机程序? 什么是计算机语言? 所谓程序,就是一组计算机能识别和执行的指令. 什么是计算机语言? 机器语言(0,1 '低级语言'),汇编语言(符号化 '低级语言'),高级语言 ...

  4. 逆向wechat

    本篇博客园地址https://www.cnblogs.com/bbqzsl/p/18171552 计划来个wechat的逆向系列,包括主程序WeChat,以及小程序RadiumWMPF. 开篇,对We ...

  5. Splashtop Enterprise提供全面的远程访问和远程支持解决方案

    ​ 全球领先的远程访问和远程支持解决方案领导者 Splashtop Inc. 发布了全新的 Splashtop Enterprise ,这是一个全面的远程访问和远程支持解决方案,满足企业的IT人员,服 ...

  6. python基础环境

    刚开始接触并学习一门开发语言,带着不求甚解的想法,其实也挺有好处的:我并不是所有的东西都知道,但是代码跑起来了. 但是时间久了,还是带着这种想法,可能就会遇到一些棘手的问题.比如电脑上不知不觉已经安装 ...

  7. 基于 ESP8266_RTOS_SDK 驱动 HC-SR04

    平台 芯片 ESP8266EX 模组 ESP-12F 开发板 NodeMCU SDK ESP8266_RTOS_SDK branch master commit 83517ba1f5e26b9413f ...

  8. python377和python27的区别?

    python27无法解释print(1,2,3,sep="*"),Windows命令行窗口运行会报语法错误:无效语法  SyntaxError:invalid syntax pyt ...

  9. C#异步调用Process(),后台静默调用cmd控制台

    C#调用cmd控制台操作,网上有太多的教程了,但是大多数都是执行完一条指令,退出Process,下次执行指令,再次new Process(),(只为了接收到cmd指令的回复,不然会进程阻塞,程序至此不 ...

  10. dhcp报错

    报错详情 查看dhcpd.service状态 使用命令检查配置文件报错 dhcpd -t -cf /etc/dhcp/dhcpd.conf 修改配置文件 重启dhcpd服务 [root@servera ...