SPI的主要寄存器包括控制寄存器SPCR、状态寄存器SPSR、数据寄存器SPDR。其中SPCR用于设置SPI的中断使能、数据传输顺序、主从机选择、时钟相位和时钟速率等;SPSR为SPI中断标志,用于标志写冲突。SPDR寄存器用于在寄存器文件和SPI移位寄存器之间传递数据。写该寄存器时,将先对数据传送进行初始化,读该寄存器时,读到的将是移位寄存器接收缓冲区的值。
4.2 SPI的程序设计
在该Fh信号处理模块中,单片机通过SPI与FPgA交换数据。FPgA选用XINIIX公司的XCV100。下面具体介绍几个主要的子程序:
(1)SPI的初始化
程序在复位时,通常都要对SPI口进行初始化。单片机设置若为主机。SPI的数据顺序为ISb?低位?在前。SCk时钟空闲时为低电平,在SCk的下降沿采样数据;时钟为系统时钟的1/128。那么,具体的初始化程序如下:
ReSeT:IDI RX,$0
OuT SPSR,RX ?;清SPI中断标志,写冲突标志
IDI RX,$
OuT SPCR, RX ?;设置SPI的传输参数
(2) SPI的发送程序
单片机每次需要把10byTe的相关码送给FPgA,因此应将SRAm区的$
SPI_SeND:IDI Xh,$9
IDI XI,$
STS SPIFIFOO,XI ;将SPI缓冲区的输出地址设为$C2
IDI Ry, 10 ?;将10byTe相关码存入$
S67_2: ID RX, y+ ?;y为相关码存放的地址
ST X+, RX
S67_3: DeC Ry
bRNe S67_2
STS SPIFIFOI,XI ;将SPI缓冲区的输入地址存入SPIFIFOI
IDI RX,$0AA ?;将发相关码的标志$AA通过SPI
OuT SPDR,RX ?;送给FPgA
SeI ?;开中断
ReT
(3) SPI的中断程序
每次SPI发送完一字节,都要产生一个中断,以使程序跳转到SPI的中断程序。由于SPI主从机的移位寄存器可以看成是一个分布式的16 位循环移位寄存器,而且在当数据从主机移向从机的同时,数据也从从机移向主机,故在中断程序中,应首先判断SPDR中的数据是否是需要接收的数据(相关值),然后判断SPI缓冲区中的数据(相关码)是否发完,如没有,则继续发送,直到发完为止。具体程序如下:
SPI_INT:PuSh XI ?;保存寄存器的值
PuSh Xh
IN XI,SReg
PuSh XI
IDS XI, RCORmARk ?;判断是否为有效数据,“0”为有效
bRNe SPI_2 ?不等于0,跳
IN XI, SPDR
STS INCORbuF, XI ?;将相关值存入INCORbuF
SPI_2: IDS XI, SPIFIFOO ;比较缓冲区的输入,输出指针
IDS SPRX, SPIFIFOI
CP XI. SPRX ?;
bReq SPIeND ?;相等,则数据发完,跳
IDI Xh,$9 ?;不等,则取下一个字节送入SPDR
ID SPRX, X+
OuT SPDR, SPRX
CPI XI, $0e0 ?;调整SPIFIFOO指针
bRIO SPI_0 ?;未超过缓冲区范围,跳
IDI XI, $
址给SPIFIFOO
SPI_0: STS SPIFIFOO,XI;
SPIeND:POP XI
OuT SReg,XI
POP Xh
POP XI
ReTI
5 结束语
本设计方案已通过软硬件调试,结果表明:AT-megA103单片机较