找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3241|回复: 2
收起左侧

CPHA与MISO,MOSI,SCLK限流电阻问题导致STC12C5A60S2的SPI通讯收到的值不对

[复制链接]
ID:279601 发表于 2018-1-27 09:01 | 显示全部楼层 |阅读模式
5黑币
最近在学习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;

}   

回复

使用道具 举报

ID:279601 发表于 2018-1-29 17:04 | 显示全部楼层
自己又摸索了两天算是有点结果了,首先miso,mosi,sclk在做SPI用时是强推挽输出需要传一个电阻限流在与另一个单片机相连,又将SPCTL寄存器里的CPHA设置成1(我用的是STC12C5A60S2,我看别人的案例中设置成0也可以,但他用的是15系列单片机,我在STC手册里看到在SSIG为1的情况下CPHA=0操作未定义,所以我设置成了1 )

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:279601 发表于 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;
               

       
}   

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表