当前位置:文档之家› SPI总线综述

SPI总线综述

SPI总线综述
SPI总线综述

SPI总线综述

SPI是英文Serial Peripheral Interface的缩写,中文意思是串行外围设备接口。SPI是Motorola公司推出的一种同步串行通讯方式,是一种标准的四线同步双向串行总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。SPI可以使微控制器(MCU)与各种外围设备(包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和微控制器等)以串行方式进行通信以交换信息。SPI总线使用同步协议传送数据,接收或发送数据时由主机产生的时钟信号控制。SPI接口可以连接多个SPI芯片或装置,主机通过选择它们的片选来分时访问不同的芯片

1 基本原理

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,设备之间有4线模式(双向传输时)或3线模式(单向传输时)。在4线模式下,它们是 SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选);在3线模式下,SDI 和 SDO并为一根,定义为SIO。

(1)MOSI–SPI 总线主机输出/从机输入(SPI Bus Master Output/Slave Input)

(2)MISO–SPI 总线主机输入/从机输出(SPI Bus Master Input/Slave Output)

(3)SCLK–时钟信号,由主设备产生

(4)CS–从设备使能信号,由主设备控制

其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。

接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCK提供时钟脉冲,SDI、SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

SPI 总线系统有以下几种形式:1个主机和多个从机、多个从机相互连接构成多主机系统(分布式系统)、1个主机与1个或几个I/O设备构成的系统等SPI总线信号线基本连接关系,如下图

SPI总线包括1根串行同步时钟信号线以及2根数据线。SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图3、图4所示。

SPI是一个环形总线结构由SS(CS)、SCK、SDI、SDO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。

假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。

那么第一个上升沿来的时候数据将会是SDO=1;寄存器=0101010x。下降沿到来的时候,SDI上的电平将所存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个SPI时序。

例子:

假设主机和从机初始化就绪:并且主机的SBUFF=0xaa,从机的SBUFF=0x55,下面将分步对SPI的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

下表示下降沿,SDI、SDO相对于主机而言的。其中SS引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来。

要注意的是,SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义。

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号。

2 主要特性

?全双工通信,可以同时发出和接收串行数据

? 1.05Mbit/s的最大主机位速率

?四种可编程主机位速率

?可编程串行时钟极性与相位

?可以当作主机或从机工作

?提供频率可编程时钟

?发送结束中断标志

?写冲突保护

?总线竞争保护等

3 应用范围

SPI主要应用在高速数据传输的外设上,例如 SD卡,FLASH芯片等。在集成电路飞速发展的近几年SPI总线应用非常广泛,大量的新型器件如LCD模块、FLASH、EEPROM存储器、数据输入、输出设备、实时时钟、AD转换器、数字信号处理器和数字信号解码器等都有采用SPI接口。在早期的单片机系统中,CPU大都不具有SPI接口,因此,对SPI接口设备的访问,基本都是通过软件模拟产生SPI接口所需要的时序。但是随着单片机技术的进步,新型的单片机一般都已将

SPI接口控制器集成在单片机内部。SPI在单片机上的应用是其应用范围上的一大转折点,进一步拓宽了其应用领域,使得SPI的优势能在更多的领域体现。

4 应用实例

1)MCP42X2双SPI 数字电位器

SPI 模块支持两种(共4 种)标准SPI 模式。它们是模式0 和3。SCK的上升沿数据采样。CS的无效状态Vih,低有效状态Vil和高有效状态Vihh。Vil 就是低电平,Vih就是MCP42X2的供电电压,Vihh需要一个MCP42X2的供电的倍压。当与MCP42X2通讯时,CS只需要给出一个有效电平(低电平或倍电压)就可以。

SPI0时序图

命令格式

命令字节具有3 个字段,即地址、命令和2 个数据位。当前仅定义了一个数据位(D8)。它用于写命令。当主器件发送正确的命令字节选择所需的操作时,会访问器件存储器。被访问的存储器单元包含在命令字节的AD3:AD0位中。所期望的操作包含在命令字节的C1:C0位中。C1:C0 决定所期望的存储器单元是被读取、写入、递增(抽头设置 + 1)还是递减(抽头设置 - 1)。递增和递减命令仅对于易失性抽头寄存器有效。当命令字节装入器件(在SDI 引脚上)时,器件的SDO引脚被驱动。对于该命令的前6 位,SDO 引脚将输出高位。在第7 位,SDO 引脚将输出CMDERR 位状态。第8 位的状态取决于所选择的命令

C1C0 功能位数

11 读数据16

00 写数据16

01 递增8

10 递减8

存储器映射和受支持的命令

只有SPI 发送具有正确的SCK 脉冲数时,才会执行SPI发送。只有接收到全部数量的时钟之后,命令才会被执行。如果CS 引脚被强制为无效状态(VIH),串行接口会复位。不完整的命令不会被执行。

器件支持连续执行命令的功能。当CS 引脚处于有效状态(VIL 或VIHH)时,可以接收任意的有效命令序列

2)基于LPC2103的SPI总线技术的应用

本文给出了一种基于SPI总线的LPC2103控制外围LED显示的设计方法。利用74HC595驱动静态共阳LED数码管,使用串转并的方式实现I/ O口的扩展。

1 LPC2103中的SPI功能特性

LPC2103是一个基于支持实时仿真的16/32位ARM7TDMI—S CPU的微控制器,内部具有2个完全独立的SPI控制器,采用全双工的数据通信方式,最大数据位速率为外设时钟Fpclk的l/8。与SPI总线接口有关的专用寄存器有:(1)SPCR控制寄存器。该寄存器包含一些可编程位来控制SPI总线的功能,而且在数据传输之前进行设定,主要有时钟相位控制、时钟极性控制、主从模式选择、字节传输移动方向及SPI中断使能;(2)SPSR状态寄存器(为只读寄存器)。用于监视SPI功能模块的状态,包括一般性功能和异常情况。主要用途是检测数据传输是否完成,通过判断SPIF位来实现,其他位用于指示异常情况;(3)SPDR数据寄存器。为SPI提供数据的发送和接收,处于主模式时,向该寄存器写入数据,将启动SPI数据传输。串行数据的发送和接收通过内部移位寄存器来实现;(4)SPCCR时钟计数器寄存器。用于设置SPI时钟分频值,SPI处于主模式时,该寄存器用于控制时钟速率,即SPI总线速率,寄存器值为l位SCK时钟所占用的PCLK周期数,并且值为偶数,必须不小于8;(5)SPINT 中断标志寄存器。包含了SPI的中断标志位,由数据传输完成及发生模式错误

1.1 SPI电气连接

利用SPI总线可在软件的控制下构成各种系统,如l个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为主机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。同一时刻只允许有1个主机操作总线。在数据传输过程中。总线上只能有1个主机和1个从机通信。在一次数据传输中,主机总是向从机发送1个字节数据,而从机也总是向主机发送1个字节数据。图l为SPI在主模式下控制2个SPI从机的硬件连接图。

1.2 SPI数据传输

在SPI数据传输中,SPCR控制寄存器的CPHA和CPOL位作用非常关键。CPHA 为时钟相位控制,该位决定SPI传输时数据和时钟的关系,并控制从机传输的起始和结束,该位为1,时钟前沿数据输出,后沿数据采样;为0,时钟前沿数据采样,后沿数据输出。CPOL为时钟极性控制。为l时,SCK为低电平有效;为0时。SCK努高电平有效。

图2为SPI的4种不同数据传输格式时序。描述的是8位数据传输。该时序图水平方向分成3部分:(1)描述SCK和SSEL信号;(2)描述CPHA为0时的MOSI 和MISO信号;(3)描述CPHA为l时的MOSI和MISO信号。SSEL信号为低电平,说明SPI工作在从模式。其中,MOSI和MISO信号中的bitl—bit8表示传输的第几位数据。

2 74HC595扩展I/O接口电路

SPI是一个串行输入输出的接口,使用串转并的接口芯片可以实现扩展I/0口。74HC595芯片为一种常用的8位串转并移位寄存器芯片。本系统利用74HC595来驱动静态共阳LED数码管。74HC595的主要优点:具有数据存储寄存器。在移位过程中。输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。LPC2103I作在SPI主模式下。

图3为74HC595逻辑图。图中,SI为串行数据输入引脚,用来连接LPC2103的MOSI功能引脚;SCK为移位寄存器的时钟输入,连接LPC2103串行时钟线SC

K;为清移位寄存器引脚;RCK为锁寄存器锁存时钟引脚;即输出触发端与SSEL连接;为输出使能引脚;SQH为串行数据输出引脚,连接MISO;QA~QH

引脚为并行输出。当为高电平、使能接低时,SCK产生一个上升沿,SI

引脚当前电平值将在移位寄存器中左移l位,在下一个上升沿到来时移位寄存器中的所有位都会向左移l位,同时SQH引脚也会串行输出移位寄存器中的高位的值。当RCK产生上升沿时,移位寄存器的值将会被锁存到锁存器里,并从QA~Q H引脚输出。

图4为SPI接13与74HC595的连接原理图。其中QA~QH分别连接共阳LED 数码管的8个段。在SPI输出1个字节的数据时,SSEL产生1个低电平,SPI 主机串行地发该字节的各个位,各个位都依次被锁存在74HC595的移位寄存器内,当1个字节的数据传输完成后,SSEL由低电平变为高电平,从而使74HC59 5的移位寄存器的值被锁存到74Hc595的锁存器并从其QA~QH引脚输出;在SP I输出1个字节数据的同时,74HC595移位寄存器之前的值也通过MISO引脚被S PI主机读回。

3 软件设计

软件设计包括:进行IO口初始化,设置SPI引脚连接,启用LPC2103的SP I0总线,设置GPIO的P0.4、P0.5、P0.6、P0.7为SPl 0总线的SCK0、MIS00、MOSIO、SSELO特殊功能,置74HC595片选端的I/O口为输出功能。其代码如下:PINSEL0=0x00005500;//股置SPI引脚连接

PINSELl=Ox00000000;

IODIR=HC595_CS;//设置片选端I/O口为输出

3.1 SPI总线操作初始化

图5为SPI总线操作流程图。使用LPC2103的SPI总线主模式下实现对74H C595的数据传输,用来驱动外围LED数码管。设置SPI时钟。在SPI主模式下,SPCCR寄存器控制SCK的频率,SPI速率为Fpclk/SPCCR。通过SPCR控制寄存器设置时钟相位、时钟极性、主模式控制、字节移动方向及SPI中断使能等。代码实现如下:

Void MSpilni(void)

{

SPI_SPCCR=0x52; //设置SPI时钟分频

SPI_SPCR=(0<<3)| // CPHA=0,数据再从SCK的第一时钟沿采样

(1<<4)| //CPOL=1,SCK为低有效

(1<<5)| //STR=1,SPI处于主模式

(0<<6)| // LSBF=0,SPI数据传输MSB(位71)在先

(0<<7); //SPIE=0,SPI中断被禁止

}

3.2 SPI总线主模式下数据发送过程

首先选择从机。设置片选。选择74HC595为从机,置片选端SSEL为低有效。将发送的数据写入SPDR。发送出去。等待SPIF置位,即数据发送完毕。最后可从SPDR读取收到的数据。以下为发送函数:

uint8 MSendData(uint8 data)

{ IOCLR=HC595_CS;//片选端,由LPC2103指定的I/O口置位

SPI_SPDR=data;

while(0==(SPI_SPSR&Ox80)); //等待SPIF置位,即等待数据发

//完毕

IOSET=HC595_CS; //片选置高无效,结束发送

return(SPI_SPDR); //返回接收到的数据

}

3.3控制LED数码管主函数

主函数使用LPC2103的SPI接口输出给74HC595,用来

控制LED数码管显示。DISP_TAB[]为LED显示0一F字模的

16进制码表。MSendData()实现每一字节数据的发送。

#define HC595_CS Ox00000100 //P0.8口为74HC595的片选

uint8 const DISP_TAB[16I={0xC0,OxF9,0xA4,OxBO,0x99,0x92,Ox8 2,OxF8,0x80,0x90,0x88,0x83,0xC6,0xA l,0x86,Ox8E};

int main(void)

{ uint8 rcv_data;

uint8 i;

PINSEL0=0x00005500;//设置SPI引脚连接

PINSELl=0x00000000;

IODIR=HC595_CS;//设置LPC2103片选I/O口为输出功能

MSpiIni();//初始化SPI接口

while(1)

{ for(i=0;i<16;i++)

{rcv_data=MSendData(DISP_TAB[i]); //发送显示数据

DelayNS(50); //延时

}

}

return(O);

}

基于SPI总线的数据通信技术已经广泛应用在MCU与各种外围设备的串行通信中。如存储系统、A/D转换系统、网络控制器和多MCU构成的分布式系统。本文给出了74HC595芯片驱动LED数码管显示的电路,采用SPI总线技术实现对LED 显示的数据传输,方便快捷、准确性高、速度快。满足了复杂微控制系统对外围设备控制的要求。

相关主题
文本预览
相关文档 最新文档