第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题

上传人:w****i 文档编号:108596219 上传时间:2019-10-25 格式:PDF 页数:10 大小:211.04KB
返回 下载 相关 举报
第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题_第1页
第1页 / 共10页
第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题_第2页
第2页 / 共10页
第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题_第3页
第3页 / 共10页
第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题_第4页
第4页 / 共10页
第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题》由会员分享,可在线阅读,更多相关《第12章 spi接口12 stc15f2k60s2系列单片机的spi接口 例题(10页珍藏版)》请在金锄头文库上搜索。

1、1 第 12 章STC15F2K60S2 单片机的 SPI 接口 例题 例 12.1计算机通过 RS232 串口向主单片机发送一串数据,主单片机的串口每收到一个 字节就立刻将收到的字节通过 SPI 口发送到从单片机中;同时,主单片机收到从单片机发回 的一个字节,并把收到的这个字节通过串口发送到计算机。可以使用串口助手观察结果。 从单片机的 SPI 口收到数据后,把收到的数据放到自己的 SPDAT 寄存器中,当下一次主 单片机发送一个字节时把数据发回到主单片机。 单片机时钟频率为 18.432 MHz,计算机 RS232 串口波特率设置为 57600 bps。硬件连接 如图 12.9 所示。 图

2、 12.9单主机单从机通信实验电路图 解:当 CPU 时钟不分频,波特率倍增位 SMOD 取 0,波特率为 57600bps 时的重装时间 常数为 F6H。在主机程序中,使用查询方法查询 UART 是否接收到数据,采用查询方式接收 SPI 数据。 (1)汇编语言参考程序如下: $INCLUDE (STC15F2K60S2.INC) #define MASTER ;定义 SPI 控制位 SPIFEQU080H;SPSTAT.7 WCOLEQU040H;SPSTAT.6 SSIGEQU080H;SPCTL.7 SPENEQU040H;SPCTL.6 DORDEQU020H;SPCTL.5 MSTR

3、EQU010H;SPCTL.4 2 CPOLEQU008H;SPCTL.3 CPHAEQU004H;SPCTL.2 SPDHHEQU000H; fSYS/4 SPDHEQU001H;fSYS/16 SPDLEQU002H;fSYS/64 SPDLLEQU003H;fSYS/128 SPISSBITP1.6;SPI 从机选择控制引脚 ORG0000H LJMPSTART ORG0100H START: LCALLINIT_UART; UART 初始化 LCALLINIT_SPI;SPI 初始化 MAIN: #ifdef MASTER/若是 SPI 主机,按如下操作 LCALLRECV_UART;

4、 接收串口数据 LCALLSPI_SWAP;发送给从机 LCALLSEND_UART;从从机接收到的数据回传给串口 #else/若是从机 ,接收主机发送数据, LCALLSPI_SWAP;;并发送前一个 SPI 数据给主机 #endif SJMPMAIN INIT_UART: MOVSCON,#5AH;串行口 1 为方式 1 MOVTMOD,#20HT1 为方式 2 定时 MOVAUXR,#40H;T1 为串行口 1 波特率发生器 MOVTL1,#0FBH;设置为 115200 bps 的初始值 MOVTH1,#0FBH;(256 - 18432000 / 32 / 115200) SETBT

5、R1 RET INIT_SPI: MOVSPDAT,#0;清“0”SPI 数据寄存器 MOVSPSTAT,#SPIF|WCOL;清“0”SPI 状态寄存器 #ifdef MASTER MOVSPCTL,#SPEN|MSTR;SPI 主机模式 #else 3 MOVSPCTL,#SPEN;SPI 从机模式 #endif RET SEND_UART: JNBTI,$;等待前一次发送结束 CLRTI;清“0”TI 标志 MOVSBUF,A;启动当前数据的发送 RET RECV_UART: JNBRI,$;等待接收数据 CLRRI;清“0”RI 标志 MOVA,SBUF;取串行接收数据 RET RET

6、 SPI_SWAP: #ifdef MASTER CLRSPISS;拉低从机/SS #endif MOVSPDAT,A;触发 SPI 发送 WAIT: MOVA,SPSTAT JNBACC.7,WAIT;等待发送结束 MOVSPSTAT,#SPIF|WCOL;清“0” SPI 中断标志与写冲突标志 #ifdefMASTER SETBSPISS;拉高从机/SS #endif MOVA,SPDAT;取从机返回的数据 RET END (2)C 语言参考程序 #include “stc15f2k60s2.h“ #defineMASTER #defineFOSC18432000L #defineBAUD

7、(256 - FOSC / 32 / 115200) typedefunsignedcharBYTE; typedefunsignedintWORD; 4 typedefunsignedlongDWORD; /*-定义 SPI 控制位-*/ #defineSPIF0x80/SPSTAT.7 #defineWCOL0x40/SPSTAT.6 #defineSSIG0x80/SPCTL.7 #defineSPEN0x40/SPCTL.6 #defineDORD0x20/SPCTL.5 #defineMSTR0x10/SPCTL.4 #defineCPOL0x08/SPCTL.3 #defineCP

8、HA0x04/SPCTL.2 #defineSPDHH 0x00/fSYS/4 #defineSPDH0x01/fSYS/16 #defineSPDL0x02/fSYS/64 #defineSPDLL0x03/fSYS/128 sbitSPISS = P16;/SPI 从机选择控制引脚 voidInitUart();/UART 初始化 voidInitSPI();/SPI 初始化 voidSendUart(BYTE dat);/串行口发送子函数 BYTERecvUart();/串行口接收子函数 BYTESPISwap(BYTE dat);/SPI 主机与从机间的数据交换 void main()

9、 InitUart(); InitSPI(); while (1) #ifdef MASTER/若是主机,从串行口接收数据,发给从机,从机回转的数据发给串口 SendUart(SPISwap(RecvUart(); #else/若是从机,接收主机数据,并将前一个数据发回主机 ACC = SPISwap(ACC); #endif void InitUart()/串口初始化 SCON = 0x5a; TMOD = 0x20; 5 AUXR = 0x40; TH1 = TL1 = BAUD; TR1 = 1; void InitSPI()/SPI 接口初始化 SPDAT = 0; SPSTAT =

10、SPIF|WCOL; #ifdef MASTER SPCTL = SPEN|MSTR;/主机模式 #else SPCTL = SPEN;/从机模式 #endif void SendUart(BYTE dat)/串口发送 while (!TI); TI = 0; SBUF = dat; BYTE RecvUart()/串口接收 while (!RI); RI = 0; return SBUF; BYTE SPISwap(BYTE dat)/SPI 主机与 SPI 从机数据交换 #ifdefMASTER SPISS = 0;/pull low slave SS #endif SPDAT = dat

11、;/trigger SPI send while (!(SPSTAT /wait send complete SPSTAT = SPIF|WCOL;/clear SPI status #ifdefMASTER 6 SPISS = 1;/push high slave SS #endif return SPDAT;/return received SPI data 例 12.2甲机与乙机互为主从,甲机与乙机通过串口与 PC 机相接,那个单片机接收到 PC 机发来的数据,就设置为主机,并选择对方为从机,并发送数据给从机,从机回转的数据 发回 PC 机。 单片机时钟频率为 18.432 MHz,计算

12、机 RS232 串口波特率设置为 57600 bps。 解:甲机与乙机的 MISO、MOSI、SCLK 对应相接,甲机的 P1.6 与乙机的/SS 端相接, 乙机的 P1.6 与甲机的/SS 相接。 单片机时钟频率与计算机 RS232 串口采用的波特率与例 12.1 相同,因此,T1 波特率发 生器的重装时间常数也是为 F6H。 (1)汇编语言参考程序 $INCLUDE (STC15F2K60S2.INC) ;定义 SPI 控制位 SPIFEQU080H;SPSTAT.7 WCOLEQU040H;SPSTAT.6 SSIGEQU080H;SPCTL.7 SPENEQU040H;SPCTL.6

13、DORDEQU020H;SPCTL.5 MSTREQU010H;SPCTL.4 CPOLEQU008H;SPCTL.3 CPHAEQU004H;SPCTL.2 SPDHH EQU000H; fSYS/4 SPDHEQU001H;fSYS/16 SPDLEQU002H;fSYS/64 SPDLLEQU003H;fSYS/128 SPISSBITP1.6;SPI 从机选择控制引脚 ESPIEQU02H MSSEL BIT20H.0;SPI 主、从机标志位, “1”为主机模式, “0”为从机模式 ORG0000H LJMPTART ORG004BH LJMPSPI_ISR ORG0100H STAR

14、T: 7 MOVSP,#3FH LCALLINIT_UART;UART 初始化 LCALLINIT_SPI; SPI 初始化 ORLIE2,#ESPI SETBEA MAIN: JNBRI,$;若接收到串行口数据,转入主机模式 MOVSPCTL,#SPEN|MSTR;设置为主机模式 SETBMSSEL LCALLRECV_UART;接收来自 PC 的串行口数据 CLRSPISS;拉低从机的/SS MOVSPDATL,A; 触发 SPI 发送数据 SJMPMAIN INIT_UART:;串行口初始化 MOVSCON,#5AH MOVTMOD,#20H MOVAUXR,#40H MOVTL1,#0

15、FBH MOVTH1,#0FBH SETBTR1 RET INIT_SPI:;SPI 初始化 MOVSPDAT,#0 MOVSPSTAT,#SPIF|WCOL MOVSPCTL,#SPEN;从机模式 RET SEND_UART:;串行口发送数据 JNBTI,$ CLRTI MOVSBUF,A RET RECV_UART:;串行口接收数据 JNBRI,$ CLRRI MOVA,SBUF 8 RET RET SPI_ISR:;SPI 中断 PUSHACC PUSHPSW MOVSPSTAT,#SPIF|WCOL JBCMSSEL,MASTER_SEND SLAVE_RECV: MOVSPDAT,S

16、PDAT SJMPSPI_EXIT MASTER_SEND: SETBSPISS MOVSPCTL,#SPEN MOVA,SPDAT LCALLSEND_UART SPI_EXIT: POPPSW POPACC RETI END (2)C 语言参考程序 #include “stc15f2k60s2.h“ #defineFOSC18432000 #defineBAUD0xfb/ (256 - FOSC / 32 / 115200) typedefunsignedcharBYTE; typedefunsignedintWORD; typedefunsignedlongDWORD; /*-定义 SPI 控制位-*/ #defineSPIF0x80/SPSTAT.7 #defineWCOL0x40/SPSTAT.6 #defineSS

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号