1、理论知识
SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP (数字信号处理器)以及数字信号解码器上,是常用的也是较为重要的通讯协议之一。
SPI通讯协议的优点是支持全双工通信,通讯方式较为简单,且相对数据传输速率较快;缺点是没有指定的流控制,没有应答机制确认数据是否接收,与IIC总线通讯协议相比,在数据可靠性上有一定缺陷,IIC总线通讯协议的相关内容会在后面章节进行讲解。
对于SPI通讯协议的相关内容我们分为物理层、协议层两部分进行讲解,具体内容如下。
1.1 物理层
SPI通讯设备的通讯模式是主从通讯模式,通讯双方有主从之分,根据从机设备的个数,SPI通讯设备之间的连接方式可分为一主一从和一主多从
1.2 协议层
1.2.1 CPOL/CPHA及通讯模式
CPOL:时钟极性(clock polarity)状态 0 1
CPHA:时钟相位(clock phase)状态 0 1
SPI通讯协议一共有四种通讯模式,模式0、模式1、模式2以及模式3,这4种模式分别由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)来定义,其中CPOL参数规定了空闲状态(CS_N为高电平,设备未被选中)时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时钟的奇数边沿,本模式中,偶数边沿为下降沿。
对于4种通讯模式中,CPOL比较好理解,就是表示设备未被选中的空闲状态时,串行时钟SCK的电平状态,CPOL = 0,空闲状态时SCK为低电平,CPOL = 1,空闲状态时SCK为高电平;CPHA的不同参数则规定了数据采样是在SCK时钟的奇数边沿还是偶数边沿,CPHA = 0,数据采样是在SCK时钟的奇数边沿,CPHA = 1,数据采样是在SCK时钟的偶数边沿,这里不使用上升沿或下降沿表示,是因为不同模式下,奇数边沿或偶数边沿与上升沿或下降沿的对应不是固定的。
首先,根据SCK在空闲状态时的电平,分为两种情况。CPOL = 0,SCK信号线在空闲状态为低电平; CPOL = 1,SCK信号线在空闲状态为高电平。
无论CPOL = 0还是1,我们配置的时钟相位CPHA = 0,在图中可以看到,采样时刻都是在SCK的奇数边沿。注意当CPOL=0的时候,时钟的奇数边沿是上升沿,而CPOL=1的时候,时钟的奇数边沿是下降沿。所以SPI的采样时刻不是由上升/下降沿决定的。MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。
类似地,当CPHA=1时,不受CPOL的影响,数据信号在SCK的偶数边沿被采样,具体见图 。
1.2.2 SPI通讯过程
上文中,我们详细介绍了SPI通讯协议的4中通讯模式,其中模式0和模式3比较常用,下面我们以模式0为例,为大家讲解一下SPI基本的通讯过程。SPI模式0通讯时序图,即空闲时为低电平,采样点为奇数边沿。具体见图。
此图表示的是主机视角的通讯时序。SCK、MOSI、CS_N信号均由主机控制产生,SCK是时钟信号,用以同步数据,MOSI是主机输出从机输入信号,主机通过此信号线传输数据给从机,CS_N为片选信号,用以选定从机设备,低电平有效;而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MI SO的信号只在CS_N为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。
CS_N信号线由高变低,是SPI通讯的起始信号。CS_N是每个从机各自独占的信号线,当从机在自己的CS_N线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处,CS_N信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或LSB先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定,一般都会采图 4中的MSB先行模式。
观察图中的标号处,MOSI及MISO的数据在SCK的下降沿期间变化输出,在SCK的上升沿时被采样。即在SCK的上升沿时刻,MOSI及MISO的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及MISO为下一次表示数据做准备。
SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。
2 SPI-Flash全擦除实验
2.1 flash芯片原理图
我们在平时对工程进行上板验证的时候,可以通过两种方式烧录程序:一种是将程序下载到FPGA内部的SRAM之中,这种方式烧录过程耗时较短,但缺点是掉电后程序会丢失,再次上电后要重新烧录程序;另外一种就是将程序固化到FPGA外部挂载的Flash芯片中,Flash芯片是非易失性存储器,程序掉电后不会丢失,重 新上电后会执行掉电前烧录到Flash中的程序,但是烧录程序耗时较长。
如果我们对程序验证完成后,想要将固化到Flash中的程序删除时,可以通过两种方式,分别是全擦除和扇区擦除。
本文将带领读者分别编写全擦除工程和扇区擦除工程,使读者对这两种擦除方式有清醒的认识,让读者掌握两种擦除方式的实现方法。
Flash的全擦除,顾名思义就是将Flash所有的存储空间都进行擦除操作,使各存储空间内存储数据恢复到初始值。FPGA要实现Flash的全擦除也有有两种方式。
方式一:利用FPGA编译软件,通过Quartus软件的“programmer”窗口,将烧录到Flash的*.jic文件擦除,具体见图 ;
方式二:编写全擦除程序,实现Flash芯片的全擦除,就是我们下面要进行的实验。
2.2 实验目标
事先向Flash芯片中烧录流水灯程序,FPGA上电执行流水灯程序,下载Flash芯片全擦除程序到FPGA内部SRAM并执行,擦除Flash芯片中烧录的流水灯程序,FPGA重新上电后,无程序执行。
(持续更新......)