1 引 言
SPI(Serial PeripheralInterface)串行外围接口是一种3线同步串行全双工通信接口,它具有电路简单,速度陕,通信可靠等优点,近年来大量的新型器件如LCD模块、FLASH、EEPROM存储器、数据输入输出设备都采用了SPI接口,新型的单片机一般都已将SPI接口控制器集成在单片机内部,这样能够大大降低软件的工作量。
由于SPI系统总线一共只需3~4位数据线和控制线即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8—16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/0口线,提高设计的可靠性,使用SPI总线可以增加应用系统接口器件的种类,提高应用系统的性能。
2 SPI模块的接口信号、时序要求及工作模式
2.1 内部总线接口
在本设计中,内部总线接口采用的是AMBA总线3.0协议,具有较好的可移植性和可复用性。SPI是APB总线上的Slave模块。APB总线的时序完全遵照(ABMASpecification)(Rev 3.0)。因此此SPI模块支持3种DMA操作,除了标准信号线外,还有3根与DMA模块连接的中断请求信号线。
2.2 SPI总线接口及时序
SPI串行接口使用4条线可与多种标准外围器件直接接口:串行时钟线SCLK,主机输入/从机输出数据线MISO,主机输出/从机输人数据线MOSI和低电平有效的从机选择线SSN。SCLK是主机时钟线,为MISO数据的发送和接收提供同步时钟信号。
在正常工作的时候,主机的4个引脚应和从机对应的4个引脚分别相连。
SPI模块为了和外设进行数据交换,根据外设的工作要求,其输出串行同步时钟的极性和相位可以进行配置,时钟的极性(CPOL)对传输的协议没有重大影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;相反,如果CPOL=l,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设时钟相位和极性应该一致。SPI接口时序如图1、图2所示。
图1 CPOL=0 CPHA =0
图2 CPOL=0 CPHA=1
2.3 工作模式
SPI有两种工作模式,可以通过外部引脚跳线的方式来切换。
主模式:发送和接收可以同时工作在主模式下。
主模式的显著特征是不论是发送还是接收始终有SCLK信号,发送操作是由向发送FIFO中写数据而触发的。在主模式下,时钟信号的1次作用对应一位数据的发送(MOSI)和另一位数据的接收(MISO)。
如图3所示,在主片中数据从移位寄存器中自右向左发出送到从片(MOSI),同时从片中的数据自左向右发到主片(MISO),经过8位时钟周期完成1个字节的发送。输入字节保留在移位寄存器中,此时SPI INT FLAG位自动置位(如果有中断设置,则产生中断),移位寄存器的数据将被锁存到接收FIFO中,此后对接收FIFO的读操作将把数据读出。
从模式:发送和接收同时工作在从模式下。从模式的显著特征是:不论是发送还是接收始终必须在SCLK信号作用下进行,并且SSN信号必须有效。
当SSN信号无效时,数据的发送无法进行并且输入的数据视为无效。数据的发送和接收过程见图3所示,与主模式下基本相似,只是移位寄存器的数据移出和输入方向与之相反。
图3 主片和从片发送和接收操作
3 SPI模块功能设计
3.1 模块划分
根据功能定义及SPI的工作原理,将整个SPI IP划分为8个子模块:APB接口模块、时钟分频模块、发送数据FIFO模块、接收数据FIFO模块、寄存器控制模块、命令解析模块、中断处理模块及发送接收数据模块。整个SPI模块划分结构图如图4所示。
图4 数据传输结构
在这些模块中,Tx—FIFO和Rx—FIFO用来做接收发送数据的FIFO。DMA/INT是中断控制模块,通知MCU或者DMA发送或者接收数据的FIFO。CMD ANALYSIS模块用来解析在从模式下Host发过来的命令。CTRl/Register用来放置寄存器,供MCU读写配置SPI的各种参数。Shifter用来做串并转换,收发送数据。Clock模块用来产生主模式下时钟。
3.2 设计方案
通过深入分析SPI的四种传输协议可以发现,根据一种协议,只要对串行同步时钟进行转换,就能得到其余的三种协议。为了简化设计,规定如果要连续传输多个数据,在两个数据传输之问插入一个串行时钟的空闲等待,这样状态机只需两种状态(空闲和工作)就能正确工作。相比其它设计,在基本不降低性能的前提下,思路比较精炼、清晰,能够大大缩短写代码的时间,降低出错率。
此SPI模块有两种工作方式:查询方式和DMA方式。查询方式通过处理器核监视SPI的状态寄存器来获取其所处的状态,从而决定下一步动作。
DMA方式由DMA模块控制数据在内存和SPI间的交换,而不需要处理器核的参与,有效提高了总线利用率。
外部MCU可以通过和内部MCU通讯的方式,把从模式的SPI配置成可以解析命令的模式,这样外部主模式的SPI可以在SSN低电平的时候连续传输多位数据,在下降沿的第一个数据被认为是命令。从模式的SPI可以解析这些命令然后做相应的操作。这些操作主要包括,清除接收FIFO或者发送FIFO中的数据,选择MCU或者DMA来作为数据交互的对象等,可以大大节省和MCU交互所需要的带宽。
作为主要组成部分的寄存器控制模块和SPI核心模块采用同步电路设计,它们之间的通讯采用异步电路设计。这些主要是考虑到SPI的带宽通过MCU的控制是可调的。SPI核心部分的时钟频率可调,可实现多种带宽,增加了本设计SPI的灵活性。
3.3 电路实现
为了保证RTL代码的正确性,对IP的功能进行全面的仿真验证。仿真包括RTL级和门级仿真验证。RTL级仿真是将代码文件调入硬件描述语言的仿真软件进行功能仿真,门级仿真包括布局布线前和布局布线后仿真。布局布线后仿真,获得精确的时延参数。将RTL级代码转换成门级网表,0.13um工艺标准单元库。
在传统的设计流程中进行功能验证,首先需要通过写测试矢量的方式给需要进行功能测试的模块加激励,然后通过观察模块的输出结果,判断模块的功能是否正确。但是在写测试矢量时,测试工程师是在自己对模块功能理解的基础上进行的。这样就存在一个问题,测试矢量对模块的激励有可能是不完备的,还有可能是错误的,但测试矢量的激励并没有使错误体现出来;也有可能模块的功能是正确的,误报错误使验证过程变得非常低效。为避免以上问题,对本设计模块的功能验证中,采用系统级验证环境。该环境由IP总线、驱动器、监视器、外部模块和协调它们工作的脚本组成。组成系统的各模块可以按需要加人环境。每次验证过程就是相应的激励作用于环境的过程。验证结果由环境产生、检验和输出。以保证测试矢量的完备性和正确性。
该验证环境在LINUX操作系统下,仿真器采用Cadence公司的Nc—verilog,支持C/C++、Verilog和VHDL协同仿真,可以直接把SPI模块挂在验证环境中,通过Verilog的$readmemh任务读入软件激励进行验证。
在系统时钟为36MHz的情况下,图5(a)给出了CPOL=0,CPHA=1时,发送6位数据的仿真结果。图5(b)给出了在CPOL=0,CPHA=0的情况下,接收6位数据的仿真结果。
图5 仿真结果
这两个仿真结果说明本设计完全支持4种SPI传输协议,而且能够以最大的速率无缝传输数据。
4 结束语
本设计的SPI可作为IP核嵌入监控系统SOC芯片中。芯片通过流片验证,各项指标已达到了原设计的要求,通过板级测试,芯片中SPI能支持4种传输协议,工作的最高频率可达18M bps,在一秒钟内能够抓图或者回显l5帧图像,达到业内较高水平。本设计中的不足之处是没有做数据校验,随着市场需求的提高,可在设计中增加CRC校验以增加数据的正确性,提高系统效率。