当前位置:文档之家› 利用51单片机实现SPI总线通信

利用51单片机实现SPI总线通信

2
接口包括以下四种信号: (1)MOSI – 主器件数据输出,从器件数据输入; (2)MISO – 主器件数据输入,从器件数据输出; (3)SCLK – 时钟信号,由主器件产生; (4)SS –从器件使能信号,由主器件控制,有的 IC 会标注为 CS(Chip select)。 在点对点的通信中,SPI 接口不需要进行寻址操作,且为全双工通信,显得 简单高效。 3:电路设计 设计的电路,利用两片 AT89C52 芯片,一片做为发送模块,一片做为接收 模块。分别编写发送和接收程序,实现数据的发送和接受。通过 LED 显示接收 到的数据。通过示波器观察输出的波形。 4:编写程序 根据设计好的电路及题目要求分别编写数据发送程序和数据接收程序。 ①:数据发送程序 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //--------------------------#include <REG52.H> #include<STDIO.H> //--------------------------sbit SPICLK = P1^0; //时钟信号 sbit MOSI = P1^1; //主器件数据输出,从器件数据输入 sbit MISO = P1^2; //主器件数据输入,从器件数据输出 sbit SS = P1^3; //从器件使能信号 void Dat_Transmit(uchar dat) //发送数据程序
利用 SPI 总线可在软件的控制下构成各种系统。如 1 个主 MCU 和几个从 MCU、几个从 MCU 相互连接构成多主机系统(分布式系统)、1 个主 MCU 和 1 个或几个从 I/O 设备所构成的各种系统等。在大多数应用场合,可使用 1 个 MCU 作为主控机来控制数据,并向 1 个或几个从外围器件传送该数据。从器件 只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB) 在前,低位(LSB)在后。
利用 51 单片机实现 SPI 总线通信
一:题目及要求
1:基本内容 1.1:理解 51 单片机和 SPI 总线通信的特性和工作原理; 1.2:以 51 单片机为核心分别设计 SPI 总线通信发送及接收电路; 1.3:熟练应用 C 语言或汇编语言编写程序; 1.4:应用 Protues 软件完成仿真,仿真结果需包括示波器波形,通过一定的 方式(如 LED 灯、LED 显示器等)显示发送和接受数据结果; 1.5:下载程序到开发板,实现串口通信功能(选做); 1.6:提交设计报告。
当一个主控机通过 SPI 与几种不同的串行 I/O 芯片相连时,必须使用每片 的允许控制端,这可通过 MCU 的 I/O 端口输出线来实现。但应特别注意这些 串行 I/O 芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控 制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加 三态门。否则 MCU 的 MISO 端只能连接1个输入芯片。其次是输出芯片的串行 数据输入是否有允许控制端。因为只有在此芯片允许时,SCK 脉冲才把串行数 据移入该芯片;在禁止时,SCK 对芯片无影响。若没有允许控制端,则应在外 围用门电路对 SCK 进行控制,然后再加到芯片的时钟输入端;当然,也可以只 在 SPI 总线上连接1个芯片,而不再连接其它输入或输出芯片。
{ ;
} void Delay(uchar t)
{ while(t--){;}
}
uchar Data_Receive(void) //数据接收程序
{
uchar i,dat=0,temp;
bit bt;
SPICLK=1;
MISO=1;
SS=0;
//选中器件
Nop();
Nop();
for(i=0;i<8;i++)
0x7F,0x6F}; P2=0; while(1)
{ exdat=Data_Receive(); P0=table[exdat]; for(i=0;i<200;i++)
6
Delay(200); } } 5:电路仿真 将数据发送程序生成的 HEX 文件载入到发送数据的模块,将数据接收程序生成的 HEX 文件载入到接收数据的模块。在输出端口连接 LED 灯等到输出信息,利用示 波器观察输出波形。
7
2:基本要求 本设计采用三线式 SPI 总线,一条时钟线 SCK,一条数据输入线 MOSI,一
条数据输出线 MISO。时钟极性 CPOL=0,时钟相位 CPHA=0。
二:设计思路
1:掌握 51 单片机和 SPI 总线通信的工作原理; 2:利用 1 中的原理设计 SPI 总线通信发送和接受电路; 3:编程模拟 SPI 时序,包括串行时钟、数据输入和输出; 4:利用 Protues 软件仿真,观察结果; 5:顺利仿真后,下载到开发板实现串行通信功能。
在越来越多的芯片集成了这种通信协议。其工作模式有两种:主模式和从模式。 SPI 是一种允许一个主设备启动一个从设备的同步通讯的协议,从而完成数据的 交换。也就是 SPI 是一种规定好的通讯方式。这种通信方式的优点是占用端口较 少,一般 4 根就够基本通讯了(不算电源线)。同时传输速度也很高。一般来说 要求主设备要有 SPI 控制器(也可用模拟方式),就可以与基于 SPI 的芯片通讯 了。
SPI 接口是在 CPU 和外围低速器件之间进行同步串行数据传输,在主器件 的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输 速度总体来说比 I2C 总线要快,速度可达到几 Mbps。
2:SPI 总线工作原理 SPI 总线系统是一种同步串行外设接口,它可以使 MCU 与各种外围设备以 串行方式进行通信以交换信息。SPI 有三个寄存器分别为:控制寄存器 SPCR, 状态寄存器 SPSR,数据寄存器。外围设备、网络控制器、LCD 显示驱动器、A/D 转换器和 MCU 等。
三:设计过程及内容
1:SPI 总线简介 SPI ( Serial Peripheral Interface ——串行外设接口) 总线是 Motorola 公司推出 的一种同步串行接口技术。SPI 总线系统是一种同步串行外设接口,允许 MCU(微 控制器)与各种外围设备以串行方式进行通信、数据交换。外围设备包括 FLASHRAM、A/ D 转换器、网络控制器、MCU 等。SPI,是一种高速的,全 双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚, 同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现
} } void main(void) {
uchar i; while(1)
{ for(i=0;iБайду номын сангаас10;i++) { Dat_Transmit(i); }
} } ②:数据接收程序 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //--------------------------#include <REG52.H>
{
SPICLK=1;
Nop();
5
Nop(); Nop(); SPICLK=0; Nop(); Nop(); bt=MISO; if(bt)
temp=0x01; else temp=0x00; dat=(dat<<1); dat=(dat|temp); } SS=1; SPICLK=1; return dat; } void main(void) { uchar exdat; uchar i=0; uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
4
#include<STDIO.H> //--------------------------sbit SPICLK = P1^0; //时钟信号 sbit MOSI = P1^1; //主器件数据输出,从器件数据输入 sbit MISO = P1^2; //主器件数据输入,从器件数据输出 sbit SS = P1^3; //从器件使能信号 //--------------------------void Nop(void)
{ uchar i,datbuf; datbuf=dat;
3
SS=1; while(SS){;} for(i=0;i<8;i++)
{ while(SPICLK){;} if(datbuf&0x80) MISO=1; else MISO=0; datbuf=(datbuf<<1); while(~SPICLK){;}
相关主题