欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
CPHA與MISO,MOSI,SCLK限流電阻問題導致STC12C5A60S2的SPI通訊收到的值不對
[打印本頁]
作者:
Steven159
時間:
2018-1-27 09:01
標題:
CPHA與MISO,MOSI,SCLK限流電阻問題導致STC12C5A60S2的SPI通訊收到的值不對
最近在學習SPI通訊使用,用的是STC12C5A60S2單片機,使用的過程中遇到些問題求指導,下面的程序是參考一些范例寫的,主機和從機都是用的STC12C5A60S2單片機最小系統(tǒng)(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
經(jīng)過兩天摸索,總算有了點結果,MISO,MOSI,SCLK三個角需要串限流電阻,因為用作SPI時是強推挽模式,其次我將CPHA設置成了1(我用的是STC12C5A60S2,我看別人的例程里設置成0也行,他用的15系列,我看看手冊里寫的是SSIG=1時,CPHA=0操作未定義,所有我設置成了1),但現(xiàn)在還有一個問題就是,接收到的數(shù)據(jù)有時候正確,有時候錯誤(我懷疑是不是我采用杜邦線串電阻的方式連接主機和從機導致的,如果有大神知道可以指導下),等新買的單片機到手打算在進一步驗證下(現(xiàn)在手上就2個STC12C5A60S2最小系統(tǒng))。
remark:下面是我改過之后的程序,現(xiàn)在驗證收到數(shù)據(jù)有時正確,有時錯誤,如果有大神知道原因,希望可以指導下
主機
#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.raoushi.com/bbs/)
Powered by Discuz! X3.1