
测试方法:通过PC机给主机(左)发送数据,主机通过SPI接口将数据传给从机(右),并将数据显示在P0口上。
主机程序如下
//**********主机程序*****************//
#include"STC12C5A.h"
/***********免断电,复位按键下载***********/
void resetdownload()
{
if(XBYTE[0x03ff]==0x80)
{
XBYTE[0x03ff]=0x00;
IAP_CONTR|=0x60; //免断电下载
}
XBYTE[0x03ff]=0x80; //写明标志,可以下载程序
}
/****************子函数完*********************/
void Init_SPI()
{
SPCTL=0XFD; //忽略SS,设置为主机模式
SPSTAT=0XC0; //清除状态寄存器
SPDAT=0; //初始化数据寄存器
}
void SPI_SendByte(unsigned char SPI_SendData)
{
SPDAT=SPI_SendData;
while((SPSTAT&0x80==0));
SPSTAT=0XC0;
}
/***************串口波特率设置***************/
void uartinitial(long fosc,long uartf)//参数为晶振频率和波特率
{
AUXR|=0x04; //波特率发生器工作在1T模式
SCON=0x50; //设置串口工作方式
AUXR|=0x01; //选择波特率发生器作为串口1的波特率
BRT=256-fosc/(16*uartf);//设置波特率发生器的溢出率
PCON=0x80; //波特率加倍
AUXR|=0x10; //波特率发生器开始工作
EA=1; //总中断打开
ES=1; // 串口接收中断打开
}
/****************子函数完*********************/
void main()
{
resetdownload();
Init_SPI();
uartinitial(22118400,115200);
while(1)
{
;
}
}
/*****************串口中断处理函数********************/
void UART() interrupt 4
{
if(RI==1)
{
SPI_SendByte(SBUF);
RI=0;
}
else
{
TI=0;
}
}
从机程序如下:
#include"STC12C5A.h"
unsigned char SPI_Buffer=0xff;
/***********免断电,复位按键下载***********/
void resetdownload()
{
if(XBYTE[0x03ff]==0x80)
{
XBYTE[0x03ff]=0x00;
IAP_CONTR|=0x60; //免断电下载
}
XBYTE[0x03ff]=0x80; //写明标志,可以下载程序
}
/**************SPI从机模式初始化***********************/
void Init_SPI()
{
SPCTL=0XED;//忽略SS,设置为从机模式
SPSTAT=0XC0; //清除状态寄存器
SPDAT=0; //初始化数据寄存器
IE2=0X02; //打开SPI中断
EA=1;
}
void main()
{
resetdownload();
Init_SPI();
while(1)
{
;
}
}
void SPI_Rec() interrupt 9
{
SPI_Buffer=SPDAT;
P0=SPI_Buffer; //接收结果在P0口上显示
SPSTAT=0XC0; //清除标志位
}
