版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE10第12章STC15F2K60S2单片机的SPI接口例题例12.1计算机通过RS232串口向主单片机发送一串数据,主单片机的串口每收到一个字节就立刻将收到的字节通过SPI口发送到从单片机中;同时,主单片机收到从单片机发回的一个字节,并把收到的这个字节通过串口发送到计算机。可以使用串口助手观察结果。从单片机的SPI口收到数据后,把收到的数据放到自己的SPDAT寄存器中,当下一次主单片机发送一个字节时把数据发回到主单片机。单片机时钟频率为18.432MHz,计算机RS232串口波特率设置为57600bps。硬件连接如图12.9所示。图12.9单主机-单从机通信实验电路图解:当CPU时钟不分频,波特率倍增位SMOD取0,波特率为57600bps时的重装时间常数为F6H。在主机程序中,使用查询方法查询UART是否接收到数据,采用查询方式接收SPI数据。(1)汇编语言参考程序如下:$INCLUDE(STC15F2K60S2.INC)#defineMASTER;定义SPI控制位SPIF EQU080H;SPSTAT.7WCOL EQU040H;SPSTAT.6SSIG EQU080H;SPCTL.7SPEN EQU040H;SPCTL.6DORD EQU020H;SPCTL.5MSTR EQU010H;SPCTL.4CPOL EQU008H;SPCTL.3CPHA EQU004H;SPCTL.2SPDHH EQU000H;fSYS/4SPDH EQU001H;fSYS/16SPDL EQU002H;fSYS/64SPDLL EQU003H;fSYS/128SPISS BITP1.6;SPI从机选择控制引脚ORG 0000HLJMP STARTORG 0100HSTART:LCALLINIT_UART ;UART初始化LCALLINIT_SPI ;SPI初始化MAIN:#ifdefMASTER //若是SPI主机,按如下操作LCALLRECV_UART ;接收串口数据LCALLSPI_SWAP;发送给从机LCALLSEND_UART;从从机接收到的数据回传给串口#else //若是从机,接收主机发送数据,LCALLSPI_SWAP ;;并发送前一个SPI数据给主机#endifSJMPMAININIT_UART:MOVSCON,#5AH ;串行口1为方式1MOVTMOD,#20H T1为方式2定时MOVAUXR,#40H ;T1为串行口1波特率发生器MOVTL1,#0FBH;设置为115200bps的初始值MOVTH1,#0FBH;(256-18432000/32/115200)SETBTR1RETINIT_SPI:MOVSPDAT,#0 ;清“0”MOVSPSTAT,#SPIF|WCOL;清“0”#ifdefMASTERMOVSPCTL,#SPEN|MSTR;SPI主机模式#elseMOVSPCTL,#SPEN ;SPI从机模式#endifRETSEND_UART:JNBTI,$ ;等待前一次发送结束CLRTI ;清“0”MOVSBUF,A ;启动当前数据的发送RETRECV_UART:JNBRI,$ ;等待接收数据CLRRI ;清“0”MOVA,SBUF ;取串行接收数据RETRETSPI_SWAP:#ifdefMASTERCLRSPISS ;拉低从机/SS#endifMOVSPDAT,A ;触发SPI发送WAIT:MOVA,SPSTATJNBACC.7,WAIT ;等待发送结束MOVSPSTAT,#SPIF|WCOL;清“0”#ifdefMASTERSETBSPISS ;拉高从机/SS#endifMOVA,SPDAT ;取从机返回的数据RETEND(2)C语言参考程序#include"stc15f2k60s2.h"#defineMASTER#defineFOSC18432000L#defineBAUD(256-FOSC/32/115200)typedefunsignedcharBYTE;typedefunsignedintWORD;typedefunsignedlongDWORD;/*定义SPI控制位*/#defineSPIF 0x80//SPSTAT.7#defineWCOL 0x40//SPSTAT.6#defineSSIG 0x80//SPCTL.7#defineSPEN 0x40//SPCTL.6#defineDORD 0x20//SPCTL.5#defineMSTR 0x10//SPCTL.4#defineCPOL 0x08//SPCTL.3#defineCPHA 0x04//SPCTL.2#defineSPDHH 0x00//fSYS/4#defineSPDH 0x01//fSYS/16#defineSPDL 0x02//fSYS/64#defineSPDLL 0x03//fSYS/128sbitSPISS=P1^6;//SPI从机选择控制引脚voidInitUart();//UART初始化voidInitSPI();//SPI初始化voidSendUart(BYTEdat);//串行口发送子函数BYTERecvUart();//串行口接收子函数BYTESPISwap(BYTEdat);//SPI主机与从机间的数据交换voidmain(){ InitUart(); InitSPI(); while(1){#ifdefMASTER//若是主机,从串行口接收数据,发给从机,从机回转的数据发给串口 SendUart(SPISwap(RecvUart()));#else//若是从机,接收主机数据,并将前一个数据发回主机 ACC=SPISwap(ACC);#endif }}voidInitUart()//串口初始化{ SCON=0x5a; TMOD=0x20; AUXR=0x40; TH1=TL1=BAUD; TR1=1;}voidInitSPI()//SPI接口初始化{ SPDAT=0; SPSTAT=SPIF|WCOL;#ifdefMASTER SPCTL=SPEN|MSTR;//主机模式#else SPCTL=SPEN;//从机模式#endif}voidSendUart(BYTEdat)//串口发送{ while(!TI); TI=0; SBUF=dat;}BYTERecvUart()//串口接收{ while(!RI); RI=0; returnSBUF;}BYTESPISwap(BYTEdat)//SPI主机与SPI从机数据交换{#ifdefMASTER SPISS=0;//pulllowslaveSS#endif SPDAT=dat;//triggerSPIsend while(!(SPSTAT&SPIF));//waitsendcomplete SPSTAT=SPIF|WCOL;//clearSPIstatus#ifdefMASTER SPISS=1;//pushhighslaveSS#endif returnSPDAT;//returnreceivedSPIdata}例12.2甲机与乙机互为主从,甲机与乙机通过串口与PC机相接,那个单片机接收到PC机发来的数据,就设置为主机,并选择对方为从机,并发送数据给从机,从机回转的数据发回PC机。单片机时钟频率为18.432MHz,计算机RS232串口波特率设置为57600bps。解:甲机与乙机的MISO、MOSI、SCLK对应相接,甲机的P1.6与乙机的/SS端相接,乙机的P1.6与甲机的/SS相接。单片机时钟频率与计算机RS232串口采用的波特率与例12.1相同,因此,T1波特率发生器的重装时间常数也是为F6H。(1)汇编语言参考程序$INCLUDE(STC15F2K60S2.INC);定义SPI控制位SPIF EQU080H;SPSTAT.7WCOL EQU040H;SPSTAT.6SSIG EQU080H;SPCTL.7SPEN EQU040H;SPCTL.6DORD EQU020H;SPCTL.5MSTR EQU010H;SPCTL.4CPOL EQU008H;SPCTL.3CPHA EQU004H;SPCTL.2SPDHH EQU000H;fSYS/4SPDH EQU001H;fSYS/16SPDL EQU002H;fSYS/64SPDLL EQU003H;fSYS/128SPISS BITP1.6;SPI从机选择控制引脚ESPI EQU02HMSSEL BIT20H.0;SPI主、从机标志位,“1”为主机模式,“0ORG 0000HLJMP TARTORG 004BHLJMP SPI_ISRORG 0100HSTART:MOVSP,#3FHLCALLINIT_UART ;UART初始化LCALLINIT_SPI ;SPI初始化ORLIE2,#ESPISETBEAMAIN:JNBRI,$;若接收到串行口数据,转入主机模式MOVSPCTL,#SPEN|MSTR;设置为主机模式SETBMSSELLCALLRECV_UART ;接收来自PC的串行口数据CLRSPISS;拉低从机的/SSMOVSPDATL,A;触发SPI发送数据SJMPMAININIT_UART:;串行口初始化MOVSCON,#5AH MOVTMOD,#20H MOVAUXR,#40H MOVTL1,#0FBHMOVTH1,#0FBHSETBTR1RETINIT_SPI:;SPI初始化MOVSPDAT,#0 MOVSPSTAT,#SPIF|WCOLMOVSPCTL,#SPEN ;从机模式RETSEND_UART:;串行口发送数据JNBTI,$ CLRTI MOVSBUF,A RETRECV_UART:;串行口接收数据JNBRI,$ CLRRI MOVA,SBUF RETRETSPI_ISR:;SPI中断PUSHACCPUSHPSWMOVSPSTAT,#SPIF|WCOLJBCMSSEL,MASTER_SENDSLAVE_RECV:MOVSPDAT,SPDATSJMPSPI_EXITMASTER_SEND:SETBSPISS MOVSPCTL,#SPENMOVA,SPDATLCALLSEND_UARTSPI_EXIT:POPPSWPOPACCRETI END(2)C语言参考程序#include"stc15f2k60s2.h"#defineFOSC18432000#defineBAUD0xfb//(256-FOSC/32/115200)typedefunsignedcharBYTE;typedefunsignedintWORD;typedefunsignedlongDWORD;/*定义SPI控制位*/#defineSPIF 0x80//SPSTAT.7#defineWCOL 0x40//SPSTAT.6#defineSSIG 0x80//SPCTL.7#defineSPEN 0x40//SPCTL.6#defineDORD 0x20//SPCTL.5#defineMSTR 0x10//SPCTL.4#defineCPOL 0x08//SPCTL.3#defineCPHA 0x04//SPCTL.2#defineSPDHH 0x00//fSYS/4#defineSPDH 0x01//fSYS/16#defineSPDL 0x02//fSYS/64#defineSPDLL 0x03//fSYS/128sbitSPISS=P1^6;//SPI从机选择控制引脚#defineESPI 0x02voidInitUart();//UART初始化voidInitSPI();//SPI初始化voidSendUart(BYTEdat);//串行口发送子函数BYTERecvUart();//串行口接收子函数bitMSSEL//SPI主、从机标志位,“1”为主机,“0voidmain(){ InitUart(); InitSPI();IE2|=ESPI;EA=1; while(1) { if(RI)//若是从串行口接收数据,即设为主机 { SPCTL=SPEN|MSTR//设为主机MSSEL=1;//设主机标志ACC=RecvUart();//接收串行数据SPISS=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婴幼儿亲子互动游戏
- 海外展会展位预订付款确认函7篇
- 尿道结石手术患者的膀胱功能训练
- 人教版英语七年级下册Unit 5教学设计
- 2026年文化场馆编制配备题库
- 人教A版必修2高一数学§2.1.1 平面【教案】
- 通信数据安全个人承诺书(6篇)
- 跨部门协作效率提升实战手册
- 传承文化薪火共筑未来梦想:小学主题班会课件
- 免疫调节药与用药护理教学设计中职专业课-药物学基础-医学类-医药卫生大类
- GB/T 19515-2023道路车辆可再利用率和可回收利用率要求及计算方法
- GB/T 15587-2023能源管理体系分阶段实施指南
- ICD-9-CM3编码与手术分级目录
- 数据库原理及应用-课件
- 探究物联网的技术特征-说课
- GB/T 18804-2022运输工具类型代码
- LY/T 1726-2008自然保护区有效管理评价技术规范
- GA/T 951-2011紫外观察照相系统数码拍照规则
- 《内部控制》第四章-风险评估课件
- 经典倒虹吸水力计算程序
- 2022年上海商业会计学校教师招聘笔试题库及答案解析
评论
0/150
提交评论