单片机在跳频系统数字信号处理中的应用
4.2 SPI的程序设计
在该FH信号处理模块中,单片机通过SPI与FPGA交换数据。FPGA选用Xinlix公司的XCV100。下面具体介绍几个主要的子程序:
(1)SPI的初始化
程序在复位时,通常都要对SPI口进行初始化。单片机设置若为主机。SPI的数据顺序为LSB?低位?在前。SCK时钟空闲时为低电平,在SCK的下降沿采样数据;时钟为系统时钟的1/128。那么,具体的初始化程序如下:
reset:ldi rx,$0
out spsr,rx ?;清SPI中断标志,写冲突标志
ldi rx,$0f7;
out spcr, rx ?;设置SPI的传输参数
(2) SPI的发送程序
单片机每次需要把10byte的相关码送给FPGA,因此应将SRAM区的$09c2-$09df段设定为SPI的数据缓冲区,然后由SPI从该缓冲区中取数据直到发送完毕。SPI的发送函数如下:
spi_send:ldi xh,$9
ldi xl,$0c2;
sts spififoo,xl ;将SPI缓冲区的输出地址设为$c2
ldi ry, 10 ?;将10byte相关码存入$9c2开始的地址
s67_2: ld rx, y+ ?;y为相关码存放的地址
st x+, rx
s67_3: dec ry
brne s67_2
sts spififoi,xl ;将SPI缓冲区的输入地址存入spififoi
ldi rx,$0aa ?;将发相关码的标志$aa通过SPI
out spdr,rx ?;送给FPGA
sei ?;开中断
ret
(3) SPI的中断程序
每次SPI发送完一字节,都要产生一个中断,以使程序跳转到SPI的中断程序。由于SPI主从机的移位寄存器可以看成是一个分布式的16 位循环移位寄存器,而且在当数据从主机移向从机的同时,数据也从从机移向主机,故在中断程序中,应首先判断SPDR中的数据是否是需要接收的数据(相关值),然后判断SPI缓冲区中的数据(相关码)是否发完,如没有,则继续发送,直到发完为止。具体程序如下:
spi_int:push xl ?;保存寄存器的值
push xh
in xl,sreg
push xl
lds xl, rcormark ?;判断是否为有效数据,“0”为有效
brne spi_2 ?不等于0,跳
in xl, spdr
sts incorbuf, xl ?;将相关值存入incorbuf
spi_2: lds xl, spififoo ;比较缓冲区的输入,输出指针
lds sprx, spififoi
cp xl. sprx ?;
breq spiend ?;相等,则数据发完,跳
ldi xh,$9 ?;不等,则取下一个字节送入spdr
ld sprx, x+
out spdr, sprx
cpi xl, $0e0 ?;调整spififoo指针
brlo spi_0 ?;未超过缓冲区范围,跳
ldi xl, $0c2 ?;超过,将缓冲区开始地
址给spififoo
spi_0: sts spififoo,xl;
spiend:pop xl
out sreg,xl
pop xh
pop xl
reti
5 结束语
本设计方案已通过软硬件调试,结果表明:AT-mega103单片机较89C5X系列单片机在资源和功能上都有很大的提高,不但控制更加简单、灵活,而且能够节省不少外围电路,因此具有成本和体积上的优势,可完全满足跳频信号处理模块的功能要求。
评论