完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文我们拟使用两个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 #include #define uchar unsigned char #define uint unsigned int ***it SCK = P1^0;//位定义时钟 ***it SDI = P1^2;//位定义Input ***it 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;//启动定时器1 TMOD= 0X20;//定时器1,工作模式2 8位自动重装 TH1 =0XFD;//设置波特率9600 代入公式计算 TL1 =0XFD;//设置波特率9600 且TL1先加满溢出 } 单片机连接方式:用杜邦线进行连接,两者共地,且两者的数据线即P1.2和P1.3相互对接。两块开发板都连接上电源,烧录好程序,即可开始实验。 |
|
|
|
只有小组成员才能发言,加入小组>>
2313 浏览 0 评论
837浏览 2评论
480浏览 1评论
1356浏览 0评论
242浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-21 12:11 , Processed in 1.154552 second(s), Total 50, Slave 42 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号