SPI总线的串行扩展技术
SPI(Serial Peripheral Interface)总线结构是Motorola公司推出的一个同步外围三线制接口,允许MCU与各种外围设备以串行方式进行通信。
(一)SPI总线系统的组成
图6-13是典型的SPI总线系统示意图。
图6-13 SPI总线系统示意图
一个完整的SPI系统有如下的特性:
(1)主、从机工作方式。
(2)全双工、三线同步数据传送。
(3)可程控的主机位传送频率、时钟极性和相位。
(4)发送完成中断标志。
(5)写冲突保护标志。
SPI总线是同步串行外围接口,三口线包括同步时钟SCK、数据输出线DO和数据输入线DI。是每个SPI芯片的片选标志,低电平有效。总线上有多片SPI芯片时需占用CPU口线或利用硬件编码来控制
端。单片使用时
直接接地即可。SPI总线器件在启动一次数据传送时由CPU产生8个SCK脉冲作为同步时钟,数据则由DO输出、DI移入,其中引起数据变化及采样数据时的SCK有效边沿与芯片有关。SPI总线典型时序图,如图6-14所示。
图6-14 SPI串行总线典型时序图
由SPI扩展的应用系统可以是单主机系统(系统中只有一台主机,从机通常是外围接口器件,如E2PROM、A/D转换、日历时钟、显示驱动器等),也可以是只作从机状态的单片机(MCU)。一般SPI系统使用4个I/O引脚。
1.串行数据线(MISO、MOSI)
主机输入/从机输出数据线(MISO)和主机输出/从机输入数据线(MOSI),用于串行数据的发送和接收。数据发送时,先传送(高位)MSB,后传送(低位)LSB。在SPI串行扩展系统中,如果某一从器件只作单向输入或输出时,可节省一根输出(MISO)或输入(MOSI)的数据线。
2.串行时钟线(SCLK)
串行时钟线(SCLK)用于同步传送从MISO和MOSI引脚输入和输出的数据。
3.从机选择
低电平有效,用于选择从机或外围器件对SPI总线的使用权。
对于没有SPI接口的89C51来说,可以使用软件的方法模拟SPI的操作,包括串行时钟、数据输入和输出。软件模拟的方法有两种:一种是用一般I/O线模拟SPI操作;另一种是利用89C51串行口模拟SPI操作。
(二)利用一般I/O口线模拟SPI操作
不同的串行接口外围芯片,其时钟时序是不同的。对于在SCK上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应取图6-15中的串行时钟输出P1.1的初始状态为1;在允许接口芯片后,置P1.1为0。相当于MCU输出1位SCK时钟下降沿,使接口芯片串行左移并输出一位数据至89C51的P1.3(模拟MCU的MISO线);再置P1.1为1,相当于输出一个SCK上升沿,使89C51从P1.0输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入/输出完成。以后再置P1.1为0,模拟下一位数据的输入/输出。依次循环8次,即可完成1字节数据的传输操作。相反,对于在SCK的下降沿输入数据和在上升沿输出数据的串行外围芯片,则应取串行时钟输出的初始状态为0,在允许接口芯片后,置P1.1为1。
图6-15为89C51(MCU)与X25F008(E2PROM)的硬件连接图。图中,P1.0模拟SPI的数据输入端,P1.1模拟SPI的时钟线SCK,P1.2模拟SPI的从机选择端P1.3模拟SPI的数据输出线。以下介绍用MCS-51汇编语言模拟SPI串行输入、串行输出和串行输入/输出的子程序。
图6-15 SPI总线接口原理图
1.MCU串行输入子程序
从X25F008的SPISO线上接收1字节数据并存入寄存器R0中。
2.MCU串行输出子程序
将89C51中寄存器R0的内容传送到X25F008的SPISI线上。
SPIOUT:SETB SCK ;使P1.1(时钟)输出为1
3.MCU串行输入/输出子程序
将MCS-51单片机R0寄存器的内容传送到X25F008的SPI SI中,同时从X25F008的SPI SO接收8位数据:
(三)利用89C51串行口实现SPI操作
单片机应用系统中,最常用的功能是开关量I/O、A/D、D/A、时钟、显示及打印功能,等等。下面介绍利用单片机串口与多个串行I/O接口芯片的SPI操作。
1.串行时钟芯片
在有些需要绝对时间的场合,例如打印记录、电话计费、监控系统中的运行及故障时间统计等,都需要以年、月、日、时、分、秒等表示的绝对时间。虽然单片机内部的定时器可以通过软件进位计数产生绝对时钟,但由于掉电之后数据丢失,修改麻烦等原因,这样产生的绝对时钟总使设计者感到不满意。因此,在对绝对时钟要求较高的场合,通常使用外部时钟芯片来实现掉电保护功能,串行时钟芯片HT1380就是一个典型的器件。
HT1380是一个8脚的日历时钟芯片,它可以通过串行口与单片机交换信息,如图6-16所示。在该_芯片中,X1、X2接晶振,SCLK为时钟输入端,I/O端为串行数据输入、输出端口,是复位引脚。由于该芯片只有当
为高时才能对时钟芯片进行读/写操作,因此可以利用单片机的I/O口线对它进行控制(类似于片选信号)。当
为低时,I/O引脚对外是高阻状态,因此它允许多个串行芯片同时挂在串行端口上。单片机对它的输入/输出操作可以按串行方式0(即扩展I/O方式)进行。
图6-16 HT1380与单片机接口电路
2.串行LED显示接口MAX7219
MAX7219是美国MAXIM(美信)公司推出的多位LED显示驱动器,采用3线串行接口传送数据,可直接与单片机接口,用户能方便修改其内部参数。它内含硬件动态扫描显示控制,可驱动8个LED数码管,也可直接驱动64段LED条形图显示器。当多片MAX7219级联时,可控制更多的LED。当然,也可以将MAX7219的一部分用于条形图显示;另一部分用于其他显示(如数字和字母等)。
MAX7219有DIP和SO两种封装。其主要引脚如图6-17所示。其功能说明如下。
(1)DIN:串行数据输入端。在CLK的上升沿,数据被装入到内部的16位移位寄存器中。
(2)DIG7~DIG0:8位位选信号输出线。
(3)LOAD:装载数据控制端。在LOAD的上升沿,最后送入的16位串行数据被锁存到数据或控制寄存器中。
(4)Seg A~SegG:LED七段显示器字选信号输出线。
(5)VDD:+5V电源端。
图6-17 MAX7219与单片机接口电路
(6)CLK:串行时钟输入端。最高输入频率为10MHz。
89C51单片机与MAX7219的接口如图6-17所示。单片机通过串行口以方式0与MAX7219交换信息,单片机的TXD端作为SPI总线的移位时钟,与MAX7219的CLK端相连;RXD端作为单片机串行数据输出端口,与MAX7219的DIN端口相连;单片机的P1.1引脚与MAX7219芯片的LOAD相连,用于片选。当LOAD位于低电平时,对它进行读/写操作,当LOAD为高电平时,DIN处于高阻状态。
3.利用串行口扩展SPI接口的一般规律
(1)都需要通过单片机的开关量I/O口线进行芯片选择。
(2)当芯片未选中时,数据端口均处于高阻状态。
(3)均要求单片机串行口以方式0与单片机交换信息。
(4)传输数据时的帧格式均要求先传送命令/地址,再传送数据。