我在用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;
}
}
}
}
} |