打印

请大家帮忙!!

[复制链接]
1394|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单飞的菜鸟|  楼主 | 2010-5-16 18:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, WRITE, ck, se, sd
我在用C8051F330单片机 驱动RF12B射频模块   发射这边已经调试好了,数据发送也都正确,现在调接收却出现问题了:接收信号能进来,但数据读出是错误的,读出都是0.  令人郁闷的是发射和接收电路的连接是一样的,为何会出现这种情况? 我是名初学者,哪为前辈能帮我分析分析吗?
以下是我的接收程序, 哪位前辈用过此单片机的话能否看下我的单片机设置是否正确。
#include"c8051f330.h"
#include  <INTRINS.H>
#include <absacc.h>
#define uchar unsigned char
#define uint  unsigned int

sbit SDI=P1^3;  
sbit SDO=P1^6;   
sbit SCK=P1^4;   
sbit nSEL=P1^5;  
sbit nIRQ=P1^7;        
sbit LED=P1^2;
sbit LED1=P1^0;
void Init_RF12RECV(void);
void Write0(void);
void Write1(void);
void WriteCMD(uint CMD);
uchar RF12_RDFIFO(void);
void DelayUs(uint us);
void WriteFSKbyte(uchar DATA);
void Init_RF12OUT(void);
void send(void);
void DelayMs(uint ms);
void recv(void);

uchar RF_RXBUF[19];
void Init_RF12RECV(void)  // 模块的初始化配置
{
nSEL=1;
SDI=1;
  SCK=0;
SDO=0;
WriteCMD(0x80E8);
WriteCMD(0x82D8);
WriteCMD(0xA6A4);
WriteCMD(0xC647);
WriteCMD(0x94A0);
WriteCMD(0xC2AC);
WriteCMD(0xCA80);
WriteCMD(0xCED4);
WriteCMD(0xCA83);
WriteCMD(0xC49B);
WriteCMD(0x9850);
WriteCMD(0xCC77);
WriteCMD(0xE000);
WriteCMD(0xC800);
WriteCMD(0xC000);
}

void WriteFSKbyte(uchar DATA)  
{
    uchar RGIT=0;
    uint temp=0xB800;
    temp|=DATA;
    Loop:SCK=0;      
    nSEL=0;     
    SDI=0;      
    SCK=1;      
    if(SDO)
    {
        RGIT=1;
    }
    else
    {
        RGIT=0;
    }
      
    SCK=0;      
    SDI=1;      
    nSEL=1;
    if(RGIT==0)
    {
        goto Loop;
    }
    else
    {
        RGIT=0;
        WriteCMD(temp);
    }
}

void Write0(void)    //写0
{
SDI=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
_nop_();
}
void Write1(void)     //写1
{
SDI=1;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
_nop_();


}
void WriteCMD(uint CMD)     //
{
uchar n=16;
SCK=0;
nSEL=0;
while(n--)
{
  if(CMD&0x8000)
  Write1();
  else
  Write0();
  CMD=CMD<<1;
}
SCK=0;
nSEL=1;
}
uchar RF12_RDFIFO(void)    ///////////////////////////读数据,问题就出在这个函数,
{
uchar i;
uchar Result=0;
  _nop_();
  _nop_();
SCK=0;
  _nop_();
  _nop_();
SDI=0;
  _nop_();
  _nop_();
nSEL=0;
  _nop_();
  _nop_();
for(i=0;i<16;i++)  
{
  SCK=1;
  _nop_();
  _nop_();
  _nop_();


  SCK=0;
  _nop_();
  _nop_();
  _nop_();

}
for(i=0;i<8;i++)
{
  Result=Result<<1;
  if(SDO)                      /////////////////////////这个IF进不去,SDO始终是低电平
  {
   Result|=1;      
  }
  SCK=1;
_nop_();
  _nop_();
  _nop_();

  SCK=0;
  _nop_();
  _nop_();
  _nop_();
  }
nSEL=1;
return Result;
}


void DelayUs(uint us) //延时10US左右
{
uint i;
while(us--)
{
  i=2;
  while(i--)
  {
   _nop_();
  }
}
}

void DelayMs(uint ms)  //延时1MS左右
{
uchar i;
while(ms--)
{
  i=14;
  while(i--)
  {
   DelayUs(9);
  }
}
}



void main()
{
uchar i=0,j=0,k=0;
   
   LED=0;
   LED1=0;
PCA0MD&=~0x40;
PCA0MD    = 0x00;//  禁止看门狗定时器

CLKSEL=0x00;
OSCICL=45;
OSCICN=0xc1;//时钟配置,内部高频,20MHZ 4分频

   P1MDIN = 0xff;
    P1MDOUT = 0x3d;
    P1SKIP = 0xFF;
    XBR1 = 0x40; // IO端口配置

Init_RF12RECV();
_nop_();
DelayMs(100);
    LED1=1;
DelayMs(500);
LED1=0;

while(1)
{

  while(!nIRQ)
  {
   RF_RXBUF[i++]=RF12_RDFIFO();
   if(i==1)
   {
    i=0;
    WriteCMD(0xCA80);
    _nop_();
    _nop_();
    WriteCMD(0xCA83);
    _nop_();
    _nop_();
      
     LED=1;
     DelayMs(100);
     LED=0;   //////////////////////////////////////这里的灯能亮
    if(RF_RXBUF[0]==0x01)
    {
         LED1=1;
         DelayMs(800);
         LED1=0;
     

    }

    }
  }
}

}

c8051f330c8051f331中文资料.pdf

1.23 MB

RF12B-1.pdf

1.81 MB

RF12B_code_cn.pdf

374.24 KB

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝