“双核”示波器的硬件描述与程序设计

作者 魏坤 来源 《无线电》杂志 2009.01
发布时间 2010-12-24

下面将介绍SPI的几个特殊寄存器:

(1) SPI的控制寄存器—SPCR(见图6)

“双核”示波器的硬件描述与程序设计

SPIE为SPI中断使能,置位后,只要SPSR寄存器的SPIF和SREG寄存器的全局中断使能位置位,就会引发SPI中断。SPE置位将使能SPI,DORD置位时数据的LSB首先发送;否则数据的MSB 首先发送。MSTR置位时选择主机模式,否则为从机。CPOL置位表示空闲时SCK为高电平;否则空闲时SCK为低电平。CPHA决定数据是在SCK的起始沿采样还是在SCK的结束沿采样。通过对SPR1、SPR0进行设计,确定主机的SCK速率。

(2)SPI的状态寄存器—SPSR(见图 7)SPIF为中断标志位,串行发送结束后,SPIF置位。若此时寄存器 SPCR的SPIE和全局中断使能位置位,SPI中断即产生。进入中断例程后 SPIF将自动清零。在发送当中对SPI数据寄存器SPDR写数据将置位WCOL,SPI2X置位后SPI的速度加倍。

(3)SPI的数据寄存器—SPDR(见图8)SPDR数据寄存器为读/写寄存器,用来在寄存器文件SPI移位寄存器之间传输数据。写寄存器将启动数据传输,读寄存器将读取寄存器的接收缓冲器。SPI系统的发送方向只有一个缓冲器,而在接收方向有两个缓冲器。也就是说,在发送数据时一定要等到移位过程全部结束后才能对SPI数据寄存器执行写操作。而在接收数据时,需要在下一个字符移位过程结束之前通过访问SPI数据寄存器读取当前接收到的字符。否则第一个字节将丢失。

本示波器中只用MCU1控制MCU2,所以MCU1只用于发送控制数据,而MCU2只用于接收控制数据,所以将 MCU1配制成SPI主机,将MCU2配制成SPI从机即可。在实际的程序设计中由于MCU1启动SPI通信是在中断服务程序中完成,所以在执行完后相应寄存器会被清零,导致数据错误,所以MCU1并没有使用其中的SPI控制器,而是使用一个子程序模拟SPI通信,解决了控制寄存器被清零的问题。MCU2 则使用了本身的SPI控制器进行数据接收。具体程序见以下程序段 : MCU1模拟SPI主机程序段spi_out()为SPI发送子程序,带有参数j,即j为要发送的数据,发送数据时先拉低ss,让从机开始接收数据,然后用for()循环将数据按由左至右的顺序(即高位先发送)发送给从机,具体方法是将j与0b10000000相与,屏蔽低7位,是1则将dat拉高,否则置低,然后拉高clk,延时1us再置低clk,模拟时钟信号,再将j左移一位,再与0b10000000相与,然后判断发送……直到8位数据发送完毕,拉高ss告诉从机数据发送完毕进行数据存储。发送数据时约定数据格式,即两个单片机之间的通信协议:每次发送9个字节,前4个字节是测得的频率数据,且高位在前;第5个字节为垂置灵敏度数据;第6个字节为触发控制数据;第7个字节为同步控制数据;第8个字节为水平扫速数据;第9个字节为功能复用键的当前功能标志。从机再接收到数据后按照这样的顺序对数据进行处理,实现相应的功能。spi_out()这个子程序还可以用于其他需要SPI控制的芯片,只需在调用前对I/O口进行定义即可。

“双核”示波器的硬件描述与程序设计
“双核”示波器的硬件描述与程序设计
“双核”示波器的硬件描述与程序设计
“双核”示波器的硬件描述与程序设计
“双核”示波器的硬件描述与程序设计

(2)MCU2从机SPI程序段
init_spi() 函数是将MCU2配制成SPI从机,每接收一个字节的数据中断一次,中断服务程序中将接收到的数据存入数组,并将数组地址加1,然后判断9个字节是否接收完毕,若没接收完则继续等待接收,接收完后则将数据按约定格式处理显示。大家可以根据自己的需求改变这些格式为其增加新的功能。

上一页123456
标签: 示波器, 程序
电子爱好者 DIANZIAIHAOZHE.COM