电力电子技术
直播中

邢党铿

7年用户 189经验值
私信 关注
[问答]

SPI协议的优缺点

SPI协议介绍
SPI协议的优缺点

回帖(4)

董润

2020-12-24 11:44:23
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
高速和同步可以理解,全双工是什么鬼?
全双工是指host(主设备)与外围从设备之间的发送线和接受线各自独立,发送数据的同时也能够接收数据,两者同步进行。
SPI协议主要用于短距离的通信系统中,特别是嵌入式系统,比如以下芯片:
存储器:RAM,EEPROM,Flash等
数模转换:A/D,D/A转换器等
驱动接口:LED显示驱动器、I/O接口芯片、UART收发器等。
2017年哪类芯片最缺货啊?存储器相关的啊!好吧,就选它了:SPI Flash。SPI Flash的本质就是使用SPI的协议去对Flash 存储器进行各种读写操作。结合Flash有助于我们更好的理解SPI协议。
举报

尤立虔

2020-12-24 11:44:40
datasheet对应的是一颗存储容量为512M-bit SPI NOR Flash。
从特征介绍可以看出这颗产品支持标准单端口(1IO)、Dual SPI(2IO)、Quad SPI(4IO)模式的SPI协议。


从封装方式可以看到,芯片包含以下输入输出端口:SCLK, CS#, SI, SO, WP#, HOLD#


从datasheet的封装方式可以看到对输入输出pin功能的描述:



CS#是一个芯片选择信号,#表示这个pin输入low的时候才会选中当前芯片,其它pin的输入才可能有效;如果为high,则不选中该芯片,其它pin的输入是完全无效的。
SCLK是一个输入时钟,是由外部的主器件输入的;
SI是输入信号,也是有外部的主器件输入的;
SO是输出信号,是由从器件输出到主器件的;
通常标准SPI协议(1IO)只包含上面4个信号。对于这颗芯片中的Dual SPI (2IO)/Quad SPI(4IO) 模式还会用到另外2个pin:WP#和HOLD#。这里我们可以简单的认为WP#和HOLD#就是跟SI/SO地位平等的2个信号。
接着我们来看看这几个输入输出信号之间的时序关系,如下图所示:


芯片选择信号CS#和时钟信号SCLK有相对关系,用来确定输入SCLK有效和无效。
tSLCH :定义了CS# go low 到第一个CLK go high的时间,只有主器件给的时间大于这个时间,输入的CLK信号才算有效。这个参数在datasheet上要求最小是5n。如果主器件给的时间小于5n,则输入的第一个CLK有可能无效,整个传输过程就有可能发生错误。
tDVCH和tSLCH:定义了输入数据SI和输入时钟CLK之间的setup/hold 时间,这个跟我们数字电路里面的DFF触发器的setup/hold概念是相同的。这2个参数在datasheet上定义的最小值分别是2n/2n。
SPI协议的整个工作过程如下:
当CS# go low之后,输入到从器件的CLK开始有效,全双工的传输过程开始。主器件在信号线SI上输入数据并被从器件读取,从器件输出数据到SO信号线并被主器件读取。当CS# go high之后,从器件不再被选中,结束整个传输过程。
在传输的时候,不管是输入输出,通常都是以一个byte的最高有效位(MSB)开始传输:


比如主器件输入bit7->6->5->4->3->2->1>0,从器件接受每个bit之后再向右shift,最终一个byte传完之后,从器件看到的顺序是bit[0:7]。从器件的输出方式类似。
在datasheet的第9页有这样一句话:


SPI总线支持mode 0和3。这里的mode 0和3是指时钟模式,SPI协议通常有4种模式,可以通过CPOL(时钟极性 Clock Polarity)和CPHA(时钟相位 Clock Phase)来定义:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
CPOL表示SPI总线空闲的时候时钟的default状态,对于SPI NOR Flash而言就是CS# go high之后 SCLK的值。
如果是Mode0, SCLK 为0;
如果是Mode3 ,SCLK 为1;
CPHA表示用第几个边沿去采样数据,0表示第一个,1表示第二个:
对于Mode0而言,SCLK go high的时候去采样数据,就像一个正沿的dffp;
对于Mode3 而言,因为SCLK初始值为1,而采样沿为第二个,所以SCLK必须有1->0, 0->1的过程,同样也是在SCLK上升沿采样输入的数据;


对于Mode1和Mode2,大家可以自行推断总线空闲时CLK的初始值和采样数据的时钟沿。
不得不说SPI Flash的协议支持时钟的模式是精心挑选的,都是CLK的上升沿采样数据,没有坑设计人员。如果所有的时钟模式都支持,设计和验证的工作量可能会大大增加。有时候datasheet上面的随便一句话,对于我们设计人员可能要付出很大的面积和大量的验证时间的代价,更悲剧的是这个功能95%的时间都用不到。
既然上升沿用来采样输出数据,那输出数据只能是下降沿了:


对于SPI Flash而言,有一个参数tCLQV 用来定义在一定的负载电容下 Clock Low 到 Output Valid 的时间,实际应用中你必须大于这个时间来采样数据。如果系统的时钟频率(Host 和SPI Flash都是用的这个频率)比较慢,那你在下一个clk的上升沿就可以采集上一笔数据;如果系统的时钟频率比较快(百Mhz量级),只能在下一个时钟的下降沿去采集数据。
一般SPI的协议比较快的时钟频率可能能到几百Mhz,再快的IC君没见过。相对于I2C的几Mhz速度快了很多,速度越快要求驱动负载loading越轻。


这颗SPI Flash的时钟最快频率是104MHz,在最差的工艺角下仿真结果也要达到这个频率。
举一个读的例子来解释SPI协议在Flash中的应用,CS# go low, 利用SPI的协议输入8 bit的读command code 03H,再输入想读的地址(门牌号),Flash开始输出内容(房间里面有什么东西),输出一段时间后,主器件不再需要数据了, CS# go high 退出这个command。
举报

陈博朴

2020-12-24 11:44:58
SPI协议可以操作在主器件对单个或者多个从器件的条件下:


这个时候芯片选择信号有多个,但同一个时间只能有一个SS# (CS#)有效,选中一个从器件,从器件的输出信号MISO(SO)端口都是三态驱动的:
输出高电平 "1";
输出低电平 "0";
如果SS# (CS# 为high,不选中该从器件 )则输出高阻态;
被选中的从器件驱动MISO端口输出到主器件的时候,其它从器件的输出都是高阻态。
下面是一种CMOS三态驱动门的电路:


可以看到,EN=0的时候输出没有驱动能力,处于高阻状态。
举报

潘沪城

2020-12-24 11:45:11
SPI协议的优缺点:
优点


  • 协议简单利于硬件设计与实现,比如不需要像I2C协议中每个从器件都需要一个地址;只用到4根线,封装也很容易做
  • 全双工的协议,既能发送数据也能接受数据
  • 三态输出的驱动能力强,相对I2C的开漏输出,抗干扰能力强,传输稳定;
  • 相对于I2C协议,时钟速度快,没有最大限制
  • 输入输出的bit数也没什么限制,不局限于一个byte

缺点


  • 信号线4根,比I2C多,芯片选择线会随着从器件的个数的增加而增加
  • 传输的过程没有确认信号,撸起柚子加油传,不管从器件收不收到;在SPI Flash中会有read status 这个命令确认从器件的状态,是否处于busy状态
  • 没有校验机制,I2C也没有,难兄难弟啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分