ADμC812的串行外设接口(SPI)及其应用
摘要:ADμC812是一种新型的集成12位数据采集系统。它的串行外设接口SPI(serial peripheral interface)可进行主机和多片从外围器件的信息传递,即主机对从机的控制及从机向主机提供各种信息等,从而实现系统之间的各种控制和操作。
关键词:ADμC812 串行通信 SPI串行端口
概述
ADμC812是一种全集成的12位数据采集系统。它在单个芯片内包含了高性能的自校准多通道ADC、2个12位DAC以及可编程的8位MCU(与8051兼容)。为便于MCU与各种外围设备进行通信,ADμC812提供了3种串行I/O端口:UART接口、I2C兼容的串行接口和串行外设接口(SPI)。其中,SPI接口是工业标准的同步串行接口,是一种全双工、三线通信的系统。它允许MCU与各种外围设备以串行方式(8位数据同时、同步地被发送和接收)进行通信。在SPI接口中,数据的传输需要1个时钟信号和两条数据线。
SPI可工作在主模式或从模式下。在主模式,每一位数据的发送/接收需要1次时钟作用;而在从模式下,每一位数据都是在接收到时钟信号之后才发送/接收。1个典型的SPI系统包括1个主MCU和1个或几个从外围器件。SPI接口可设置成在发送/接收1个字节的结束时产生1次中断。
主时钟可以通过编程而成为不同的状态,既可编程为4种不同主波特率的任一种,又可对时钟的极性和相位进行编程。
SPI也可用于那些需要比微控制器上的并行I/O端口更多输入或输出端的场合中。SPI提供了一种扩展I/O功能的最简单的办法,只需使用最少的微控制器引脚。
javascript:window.open(this.src);" style="cursor:pointer;"/>
一、工作原理
1.SPI的信号说明
SPI系统使用4条线可与多种标准外围器件直接接口:javascript:window.open(this.src);" style="cursor:pointer;"/>串行时钟线(SCLOCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS。
SCLOCK是主机的时钟线,为MISO数据的发送和接收提供同步时钟信号。每一位数据的传输都需要1次时钟作用,因而发送或接收1个字节的数据需要8个时钟的作用。主机的时钟是通过主机的硬件设置的,并和各个从机的SCLOCK相连。时钟的波特率、极性、相位是由SPICON(SPI控制寄存器)来设置的。
MISO是主机的输入/从机的输出数据线。主机的MISO应与从机的MISO相连进行高位在前的数据交换。
MOSI是SPI接口的SPI主机输出/从机输入数据引脚。这一引脚应当连接主微控制器的数据输出和从微控制器的数据输入端MOSI,进行高位在前数据的交换。
SS只在从方式中用于低电平选中从。SS对应的是P1.5,在初始化时P1口被设置为模拟输入,因而通过清除P1.5可将其设置为数据输入,才可完成主、从机的通信。
2.SPI的寄存器
SPI有2个相关寄存器:SPICON和SPIDAT,其中SPICON包含各种标志位、使能位、方式位及时钟位。各位都是可寻址的,如表1及表2所列。
表1 SPICON寄存器
ISPI | WCOL | SPE | SPIM | CPOL | CPHA | SPR1 | SPR0 |
FFH 0 | FEH 0 | FDH 0 | FCH 0 | FBH 0 | FAH 0 | F9H 0 | F8H 0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
表2 SPICON各位功能
位 | 功 能 |
ISPI | 中断标志位。 当发送和接收1字节数据完毕时自动置全。该位也可以通过软件控制。当于中断时,应当打开中断EA,将IE2.0置位。当执行中断服务程序时,硬件自动清除该位 |
WCOL | 写冲突错误标志位。 当SPI正进行数据交换时,若向SPIDAT中写数据将产生写冲突错误,写入的数据将无效,原有交换继续执行。必须由软件清除 |
SPE | SPI使能位。 SPE=0,I2C串口使能,SPI串口禁止; SPE=1,I2C串口禁止,SPI串口使能 |
SPIM | 主模式选择位。 SPIM=0,SPI工作于从模式; SPIM=1,SPI工作于主模式 |
CPOL | 时钟极性选择位。 CPOL=0,主机时钟有高到低的跳变读取数据,数据字节之间传输时,时钟处于高电平空闲状态; CPOL=1,主机时钟有低到高的跳变读取数据,各数据字节之间传输时时钟处于低电平空闲状态(见图1) |
CPHA | 时钟相位选择位。 CPHA=0,传输数据的高位MSB在SS的降沿出现,在时钟第1个前沿读入;之后下一数据位在时钟后沿出现,在下一个前沿读入;直到8位数据读完。 CPHA=1,数据在时钟前沿出现,在同一时钟周期的后沿读入(见图1)。 读位还可控制从机的同步方式 |
SPR1 SPR0 | SPI波行选择位。 SPR1 SPR0 波特率 0 0 fosc/4 0 1 fosc/8 1 0 fosc/32 1 1 fosc/64 注:从方式下这两位都清零 |
另一个SPI寄存器是SPIDAT。对这一寄存器的写操作会产生从高位开始的一位位的数据发送。如果写操作发生在其他数据正在传递的过程中,那么WCOL将置位。如果写操作进行时没有其他数据在传递,SPIDAT中的数据将自动锁存到移位寄存器中,移位寄存器从高位开始发送数据,发送结束后输入的字节将锁存到SPIDAT中,可进行软件读出。
3.主模式
发送和接收可以同时工作在主模式下。主模式的显著特征是不论是发送还是接收始终有SCLOCK信号,SS信号不是必需的。因为SPI串口只能有一片主机,因而不存在主机的选择问题。
发送操作是由向SPIDAT中写数据而触发的。在主模式下,时钟信号的1次作用对应一位数据的发送(MISO)和另一位数据的接收(MOSI)。如图2所示,在主机中数据从移位寄存器中自左向右发出送到从机(MOSI),同时从机中的数据自右向左发到主机(MISO),经过8位时钟周期完成1个字节的发送。输入字节保留在移位寄存器中,此时ISPI自动置位(如果有中断设置,则产生中断),移位寄存器的数据将被锁存到SPIDAT中,此后对SPIDAT的读操作将把数据读出。
将主机的SS和从机SS的相连的方式没有意义,因为P1.5只可作输入,所以主机的SS不能为从机的SS提供选通信号。为了解决这一问题,可利用主机其他输入/输出口线与从机的SS相连,实现选通控制,可以有多根口线控制多个从机。如果要读取主机SS的状态,需要将主机的SS与主机上另一根输入/输出口线相连,通过对该口线读操作获取主机SS的状态。
4.从模式
发送和接收可以同时工作在从模式下。javascript:window.open(this.src);" style="cursor:pointer;"/>从模式的显著特征是:不论是发送还是接收始终必须在SCLOCK信号作用下进行,并且SS信号必须有效。SS在初始化之后,要设置为数字输入(CLR P1.5),当SS信号无效时,数据的发送无法进行并且输入的数据视为无效。这是因为输入的时钟信号是与SCLOCK的逻辑与操作,而SCLOCK信号是SS的反转。这样当SS为高时,就没有时钟信号输入。
当CPHA=1时,SS始终置地;当CPHA=0时,在从机接收到第1个时钟之前SS必然置低,在接收完毕之后必然置高。数据的发送和接收的过程见图2,与主模式下基本相似,只是移位寄存器的数据移出和输入方向与之相反。从模式下的SS信号也须通过连接其他口线来读取状态。
5.从模式下的时钟同步
通过设置CPHA位可以获得从模式下的两种同步方式。由于SCLOCK信号线可能存在干扰脉冲,如果这些干扰脉冲大到一定程序,从机时就会误认为收到了时钟信号,将导致接收数据错误。这样依靠同步结构的SPI将失去同步的意义。
CPAH=1时,如果有其他脉冲的干扰,ADμC812将无法与主机获得同步。选择这种方式,当SS为低时,时钟计数器才开始工作。每经过8个时钟同周期,ISPI将置位(如果中断设置正确将产生中断),并且移位寄存器的数据锁存到SPIDAT中。SS保持低电平不会使时钟计数器复位。
CPHA=0时,如果有其他脉冲的干扰,ADμC812也可与主机获得同步。在这种方式下,从机通过SS信号获得的,而不是通过时钟信号获得的。当SS信号变低时,时钟计数器复位,数据位在此后的每一个时钟发送和接收;当SS变高时,ISPI位置位(如果中断设置正确,将产生中断),并且移位寄存器的数据锁存到SPIDAT中。ISPI置位与数据的锁存始终与时钟计数值无关,因此当SS的触发在多于或少于8个时钟时,在SS返回高电平瞬间,ADμC812将产生中断,并且收到或发送的数据将不可靠。在这种方式下,SS不可始终置低,如果始终置低,那么从机将始终发送00。
当了与主机获得同步,从机SS的下降沿必然由主机控制。当SS变低时,从机产生外部中断,中断服务中SPE位由软件清除,然后重新置位。SPE位的置位将使时钟计数器复位到零。须注意的一点是这一中断必须有比其他中断更高的优先级,才可使从机在主机第1个时钟到来之间获得同步。主机程序必须为从机中断执行中断服务提供足够的时间,以对SPE进行操作。典型的操作是在清除SS和向SPIDAT中写数据之间用12~15个NOP指令。
javascript:window.open(this.src);" style="cursor:pointer;"/>
二、实际应用
图3所示为1个主机和1个从机典型的电路连接图。注意主、从机要有公共的地。
根据图3的连接情况及前面分析的主、从机工作工程,绘制流程图如图4所示。
主机程序:
SET EA ;打开中断允许
SET IE2.0 ;打开SPI中断
MOV SPICON,#30H ;送SPI控制字
MASTER:CLR P3.5 ;置SS为低
NOP ;等待从机中断执行完毕
NOP
NOP
NOP
MOV SPIDAT,#DATA;向SPIDAT中写数据
LCALL DELAY ;根据选择的分频比算出数据传输的时间,确定DELAY子程序的延时时间(也可用中断方式)
SETB P3.5 ;将SS置高
LJMP MASTER ;送下一个数
从机程序:
ORG 0013H ;外部中断INT0入口
CLR SPE ;SPE位清除
SETB SPE ;与主机时钟获得同步
SETB P3.2 ;撤销中断
RETI
……
SETB EA ;打开中断允许
SETB IE2.0 ;打开SPI中断
SETB EX0 ;打开外部中断
MOV SPICON,#20H ;送SPI控制字
CLR P1.5 ;设置为数字输入
JB P3.1$ ;判断P3.1是否为低
CLR P3.2 ;产生INT0中断
CLALL DELAY ;等待数据传送完毕
MOV A,SPIDAT ;读取数据
javascript:window.open(this.src);" style="cursor:pointer;"/>