zoukankan      html  css  js  c++  java
  • SPI 协议学习

    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 通信速率:一般情况下,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模式有关理解框图

    img

    附录:SPI 内部机制

    img

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

    ref :

  • 相关阅读:
    netty编译报错
    idea快捷键:查找类中所有方法的快捷键
    vue修改浏览器的标题title
    django使用原生SQL的方法
    js 动态刷新页面日期
    H.264中的SPS和PPS
    CppProperties.json 参考
    FFmpeg代码导读——HEVC在RTMP中的扩展
    FFmpeg从入门到精通:SEI那些事
    FFmpeg代码导读——基础篇
  • 原文地址:https://www.cnblogs.com/schips/p/protocol_spi_about.html
Copyright © 2011-2022 走看看