1.SPI总线基本概念
SPI(Serial Peripheral Interface,串行外设接口)总线是Motorola公司推出的一种同步串行接口技术。SPI总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信、数据交换。外围设备包括FLASHRAM、A/D转换器、网络控制器、MCU等。SPI是一种高速的、全双工、同步的通信总线,并且在芯片的引脚上只占用4根线,节约了芯片的引脚,同时为PCB的布局节省了空间,提供了方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。其工作模式有两种:主模式和从模式。SPI是一种允许一个主设备启动一个从设备的同步通信的协议,从而完成数据的交换。也就是SPI是一种规定好的通信方式。这种通信方式的优点是占用端口较少,一般4根线就够基本通信了(不算电源线)。同时传输速度也很高。一般来说要求主设备要有SPI控制器(也可用模拟方式),就可以与基于SPI的芯片通信了。
2.SPI总线系统结构
SPI系统可直接与各个厂家生产的多种标准外围器件直接接口,一般使用4根线:串行时钟线(SCK)、主机输入/从机输出数据线MISO(DO)、主机输出/从机输入数据线MO-SI(DI)和低电平有效的从机选择线CS。MISO和MOSI用于串行接收和发送数据,先为MSB(高位),后为LSB(低位)。在SPI设置为主机方式时,MISO是主机数据输入线,MOSI是主机数据输出线。SCK用于提供时钟脉冲将数据一位位地传送。SPI总线器件间传送数据框图如图10-37所示。
3.SPI总线的接口特性
利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为主控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。
当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可以通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因为只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其他输入或输出芯片。
4.SPI总线的数据传输
SPI是一个环形总线结构,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。SPI数据传输原理很简单,它需要至少4根线,事实上3根线也可以。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。在SPI方式下数据是一位一位地传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。假设8位寄存器内装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候数据将会是高位数据SDO=1。下降沿到来的时候,SDI上的电平将被存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个SPI时序。下面举一个实例来说明其数据传送过程。(www.xing528.com)
假设主机和从机初始化就绪,并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对SPI的8个时钟周期的数据情况演示一遍:(下表中“上”表示上升沿,“下”表示下降沿)见表10-9。
图10-37 SPI总线器件间传送数据框图
表10-9 脉冲与数据变化对应表
这样就完成了两个寄存器8位的交换,SDI、SDO是相对于主机而言的。其中CS引脚作为主机的时候,从机可以把它拉低被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为首先主机要发送命令,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。这样的传输方式有一个优点,与普通的串行通信不同,普通的串行通信一次连续传送至少8位数据,而SPI允许数据一位一位地传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通信的控制。SPI还是一个数据交换协议,因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。
对于不带SPI串行总线接口的MCS51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。如我们可以定义三个普通I/O口用来模拟SPI器件的SCK、MISO、MOSI。对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口的初始状态设置为1,而在允许接口后再置为0。这样,MCU在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至单片机的模拟MISO线,此后再置SCK为1,使单片机从模拟的MOSI线输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入输出便宣告完成。此后再置SCK为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置SCK为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。