经过两天摸索,总算有了点结果,MISO,MOSI,SCLK三个角需要串限流电阻,因为用作SPI时是强推挽模式,其次我将CPHA设置成了1(我用的是STC12C5A60S2,我看别人的例程里设置成0也行,他用的15系列,我看看手册里写的是SSIG=1时,CPHA=0操作未定义,所有我设置成了1),但现在还有一个问题就是,接收到的数据有时候正确,有时候错误(我怀疑是不是我采用杜邦线串电阻的方式连接主机和从机导致的,如果有大神知道可以指导下),等新买的单片机到手打算在进一步验证下(现在手上就2个STC12C5A60S2最小系统)。
remark:下面是我改过之后的程序,现在验证收到数据有时正确,有时错误,如果有大神知道原因,希望可以指导下
主机
#include "STC12C5A60S2.H"
sbit led=P0^1;
sbit kg=P0^2;
char cksj;
char spifs,spijs;
char flag;
void Delays(int xms) /*1ms*/
{
int i,j;
for(i=xms;i>0;i--)
for(j=125;j>0;j--);
}
void send(int SS)
{
TI=0;
SBUF=SS;
while(!TI);
TI=0;
}
void pkou()
{
P0M0=0X00;
P0M1=0X00;
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
P3M0=0X00;
P3M1=0X00;
}
void ini()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
TR1=1;
flag=0;
spijs=0x12;
kg=1;
EA=0;
}
void inispi()
{
SPDAT=0;
SPSTAT=0XC0;
SPCTL=0XFC;
}
void main()
{
pkou();
ini();
inispi();
while(1)
{
if(RI)
{
while(RI==0);
spifs=SBUF;
RI=0;
kg=0;
SPDAT=spifs;
flag=0;
while(flag==0)
{
flag=SPSTAT;
flag=flag&0x80;
}
SPSTAT=0xc0;
spijs=SPDAT;
kg=1;
send(spijs);
send(0x11);
Delays(10);
}
}
}
从机
#include "STC12C5A60S2.H"
sbit led=P0^1;
char cksj;
char spifs,spijs;
char flag;
void pkou()
{
P0M0=0X00;
P0M1=0X00;
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
P3M0=0X00;
P3M1=0X00;
}
void ini()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
IE2=0X02;
TR1=1;
EA=1;
flag=0;
}
void inispi()
{
SPDAT=0;
SPSTAT=0XC0;
SPCTL=0X6C;
}
void main()
{
pkou();
ini();
inispi();
while(1);
}
void Spi()interrupt 9
{
SPSTAT=0xc0;
spijs=SPDAT;
SPDAT=spijs;
}
|