标题:
CPHA与MISO,MOSI,SCLK限流电阻问题导致STC12C5A60S2的SPI通讯收到的值不对
[打印本页]
作者:
Steven159
时间:
2018-1-27 09:01
标题:
CPHA与MISO,MOSI,SCLK限流电阻问题导致STC12C5A60S2的SPI通讯收到的值不对
最近在学习SPI通讯使用,用的是STC12C5A60S2单片机,使用的过程中遇到些问题求指导,下面的程序是参考一些范例写的,主机和从机都是用的STC12C5A60S2单片机最小系统(P1口没有用上拉电阻,不知道有没有影响),但通讯收到的值不对,希望大家指导一下,怎么修改?若有该款单片机使用且功能OK的范例希望可以分享下,谢谢啦!
主机程序
#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 ini()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
AUXR1=0X00;
SPCTL=0XF0;
TR1=1;
EA=1;
ES=1;
flag=0;
spijs=0x12;
kg=1;
}
void main()
{
P0=0X00;
P1=0X00;
ini();
while(1);
}
void chuankou()interrupt 4
{
if(RI)
{
while(RI==0);
cksj=SBUF;
RI=0;
spifs=cksj;
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 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 ini()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
AUXR1=0X00;
SPCTL=0X60;
IE2=0X02;
TR1=1;
EA=1;
flag=0;
}
void main()
{
P0=0X00;
P1=0X00;
ini();
awhile(1)
{
if(flag==1)
{
flag=0;
spifs=spijs;
SPDAT=spifs;
}
}
}
void Spi()interrupt 9
{
spijs=SPDAT;
SPSTAT=0xc0;
flag=1;
}
作者:
Steven159
时间:
2018-1-29 17:04
自己又摸索了两天算是有点结果了,首先miso,mosi,sclk在做SPI用时是强推挽输出需要传一个电阻限流在与另一个单片机相连,又将SPCTL寄存器里的CPHA设置成1(我用的是STC12C5A60S2,我看别人的案例中设置成0也可以,但他用的是15系列单片机,我在STC手册里看到在SSIG为1的情况下CPHA=0操作未定义,所以我设置成了1 )
作者:
Steven159
时间:
2018-1-29 17:17
经过两天摸索,总算有了点结果,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;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1