本文我们拟使用两个51单片机软件模拟实现SPI完成通信,相互接收和发送数据。即在A电脑上发送字符,B电脑上接收到字符,反之相同。
MODE1:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
MODE2:
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
MODE3:
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
MODE4:
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
这里我们所用的是模式3:第一个跳变沿即上升沿发送数据,第二个跳变沿即下降沿接收数据,空闲状态为高电平。
SPI通信时序图:
SPI内部的工作机制:
#include <reg52.h>//头文件
#include <intrins.h>//头文件#define uchar unsigned char
#define uint unsigned intsbit SCK = P1^0;//位定义时钟
sbit SDI = P1^2;//位定义Input
sbit SDO = P1^3;//位定义Output//定义延时函数
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}/* 函数声明 */
void Spisend(uchar dat1);//数据发送函数
uchar Spireceive(); //数据接收函数
void UARTInit(); //中断处理函数
uchar i; //定义全局变量i//SPI模式2:第一个跳变沿即上升沿发送,第二个跳变沿即下降沿接收,空闲状态为高电平/*----主函数-----*/
void main()
{ UARTInit(); //中断处理while(1) //大循环{SBUF = SpiReceive();// 循环接收数据}
}/*-----SPI发送函数----*/
/*-----上升沿发送-----*/
/*----- 高位先发 -----*/
void Spisend(uchar dat1)
{for (i=0; i<8; ++i)//8bit,一位一位发送{SCK = 0; //先把电平降下来,才会有上升沿if (dat1 & 0x80)//逻辑与,判断当前最高位为1还是0,0x80为10000000{SDO = 1; //待将数据1发送出去 }else{SDO = 0; //待将数据0发送出去}SCK = 1; //上升沿发送数据,一位一位的发,共8次dat1 <<= 1; //左移1位,下一位进行发送delay(5); //延时5毫秒 }
}/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar Spireceive()
{uchar dat0;dat0 = 0x00; //dat0初始化 for (i=0; i<8; ++i) //8bit,一位一位读{dat0 <<= 1;//高位先接受,将接收到的数据逐位移到高位 while(SCK == 1); while(SCK == 0)//等待下降沿,下降沿读取数据 dat0 = SDI; //读取数据 }return (dat0); //返回接收到的dat0
}/*-----------串口中断服务函数-----------*/
void UART() interrupt 4//串口中断入口为4
{if (RI == 1)//判断是否接收完成{RI = 0;//软件清零接收位Spisend(SBUF); //转发出接收到暂时保存在接收SBUF的数据}if (TI == 1)//判断是否发送完成{TI = 0;//软件清零}
}/*串口(中断)初始化函数*/
void UARTInit()
{EA = 1;//开启总中断ES = 1;//打开串口中断SM0 = 0;SM1 = 1;//串口工作方式1,8位UART波特率可变REN = 1;//串口允许接收TR1 = 1;//启动定时器1TMOD= 0X20;//定时器1,工作模式2 8位自动重装TH1 =0XFD;//设置波特率9600 代入公式计算TL1 =0XFD;//设置波特率9600 且TL1先加满溢出
}
单片机连接方式:用杜邦线进行连接,两者共地,且两者的数据线即P1.2和P1.3相互对接。两块开发板都连接上电源,烧录好程序,即可开始实验。
本文发布于:2024-02-05 04:29:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170724168663045.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |