首页 > 其他 > 详细

SPI 协议学习

时间:2020-11-05 08:36:53      阅读:58      评论:0      收藏:0      [点我收藏+]

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
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 控制Flash

我们以FLASH这种可读可写的器件作为举例。

SPI flash W25Qxx: W25Q系列的spiflash。

每页(Page)256B,每16个page为一个sector(扇区=4KB),每16个扇区为一个block(块=64KB)

W25Q16 = 16Mb = 2MB = 2048KB = 32block = 512sector = 8192page;

操作:SPI flash写操作必须确保为0XFF才能写入,否则需要檫除操作,檫除的最小单位为Sector即4KB,所以有的会在单片机内部开一个4K的缓存(有点奢侈),写之前先读出来,檫除数据,合并数据(在檫除数据的同时进行操作,合并完了在检查檫除是否完成,不闲着;操作系统级的 将因此进入挂起。要么设定一个合适的超时时间,要么有一个专门的轮训这些标志完成则发信号量),再写入。

驱动程序:https://blog.csdn.net/weixin_42381351/article/details/80813104

SPI SPI flash驱动规范:

1 硬件SPI/软件SPI涉及的MOSI/MISO/SCK的IO设置、SPI设置读写一个字节。

2 存储器件IC涉及的片选、调用SPI读写一个字节操作在某个指定地址读写一个字节/多个字节,檫除等操作。

3业务层次的读写记录,APP升级等。

技术分享图片技术分享图片

一主多从可以通过不同片选来发送(都片选则都会收到),但对接收,如果关闭某个片选则可能得不到及时相应;如果都打开则同时来时的处理。IO模拟SPI一主多从如右图,先操作译码器(速度要快)再操作SPI的其它三根口线即可。

GPIO模拟的SPI操作灵活,但效率不高。同时这种方法不适用于SPI的DMA传输,仅适合数据量少、对传输速度要求不同的场合。

硬件SPI的片选可以软件控制也能硬件控制(DMA传输时必须)

关于IO模拟SPI驱动的另一种编程方法:SCLK用PWM输出方波(脉宽周期按手册),其它的4线配置SCLK进行操作,通过读SCLK引脚

GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)来配合时序,不满足就等,满足就进行其它IO的置高置低(配置SYSTICK或NOP进行延时)

关于如何根据时序图用IO模拟写驱动/上升沿采样下降沿发送数据的含义,以TM7705为例:

技术分享图片

上图表示对主机MCU而言:

写的时候:MOSI上上升沿采样,上升沿前低电平时就要发送bit数据即:SCLK=0延时一小段时间就将send_data的MSB发出,然后SCLK=1再延时一段时间,接着进行下一个bit的操作。

读的时候:再MISO上也是上升沿采样,高电平期间读bit.SCLK=0;delay(4),SCLK=1,delay(2),读MISO引脚电平,delay(1),接着进行下一个bit的操作。

技术分享图片 View Code

RT-THREAD下挂载文件系统时如果SUFD没有找到对应产品需要根据手册在SFUD_FLASH_CHIP_TABLE添加信息:

技术分享图片

技术分享图片

技术分享图片

技术分享图片

附录:SPI 内部机制

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

ref :

SPI 协议学习

原文:https://www.cnblogs.com/schips/p/13908295.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!