文档库 最新最全的文档下载
当前位置:文档库 › SPINRF905接收程序

SPINRF905接收程序



#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
//配置口定义//





sfr AUXR = 0x8e; //Auxiliary register
sfr SPSTAT = 0xcd; //SPI status register
#define SPIF 0x80 //SPSTAT.7
#define WCOL 0x40 //SPSTAT.6
sfr SPCTL = 0xce; //SPI control register
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define DORD 0x20 //SPCTL.5
#define MSTR 0x10 //SPCTL.4
#define CPOL 0x08 //SPCTL.3
#define CPHA 0x04 //SPCTL.2
#define SPDHH 0x00 //CPU_CLK/4
#define SPDH 0x01 //CPU_CLK/16
#define SPDL 0x02 //CPU_CLK/64
#define SPDLL 0x03 //CPU_CLK/128
sfr SPDAT = 0xcf; //SPI data register
sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P1.4) pin


sbit TXEN = P2^7;
sbit TRX_CE = P2^6;
sbit PWR = P2^5;
//SPI 口定义//
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit SCK = P1^7;
sbit CSN=P1^4;
//状态输出口//
sbit DR = P2^4;
sbit LCD = P3^2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//RF 寄存器配置//


void InitSPI()
{
SPDAT = 0; //initial SPI data
SPSTAT = SPIF | WCOL; //clear SPI status

SPCTL = SPEN | MSTR|SSIG; //master mode

}

void SpiWrite(unsigned char b)
{


SPDAT =b; //trigger SPI send
while (!(SPSTAT & SPIF)); //wait send complete
SPSTAT = SPIF | WCOL ; //clear SPI status

}

unsigned char SpiRead(void)
{
unsigned char ddata=0;


SPDAT =ddata; //trigger SPI send
while (!(SPSTAT & SPIF)); //wait send complete
SPSTAT = SPIF | WCOL; //clear SPI status
ddata= SPDAT ;
return ddata;
}

unsigned char idata RFConf[11]=
{
10, //配置命令//
0x4C, //CH_NO,配置

频段在433.2MHZ
0x0c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4 字节
0x03,0x03, //接收发送有效数据长度为3 字节
0xcc,0xcc,0xcc,0xcc, //接收地址
0x58, //CRC 充许,16 位CRC 校验,外部时钟信号使能,16M 晶振
}
;
uchar TxRxBuffer[5];
bit lcdbit;
///////////延时/////////////////
void Delay(uint x)
{
uint i;
for(i=0;i_nop_();
}
}
////////////用SPI 口写数据至NRF905内//////////

///////////////接收数据包/////////////////
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer[i] = SpiRead();
i++;
}
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{PWR=1;
TRX_CE=0;
TXEN=1;
CSN=0;
SpiWrite(0x22); //写发送地址,后面跟4 字节地址//
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
Delay(1000);
CSN=1;
Delay(1000);
CSN=0;
SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
SpiWrite(0x01);
SpiWrite(0x02);
SpiWrite(0x03);
Delay(1000);
CSN=1;
_nop_();_nop_();
TRX_CE=1; //使能发射模式//
Delay(50); //等带发送完成//
while(!DR);
TRX_CE=0;
}
////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{PWR=1;
TRX_CE=1;
TXEN=0;
Delay(1000);
while(1)
{
if(DR)
{
TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI 口操作
CSN=0;
SpiWrite(0x24);
RxPacket();
CSN=1;
temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
if(temp==0x06){
lcdbit=!lcdbit;
LCD=lcdbit; //如果接收的数据正确
}
break;
}
}
}

////////////初始化配置寄存器////////////////
void Ini_System(void)
{
uchar i;
LCD=0;
Delay(100);
LCD=1;
lcdbit=1;
SCK=0;
PWR=1;
TRX_CE=0;
TXEN=0;
_nop_();
CSN=0;
for(i=0;i<11;i++){
SpiWrite(RFConf[i]);
}
Delay(1000);
CSN=1;
}

void main(void)
{
uchar j=5;

InitSPI() ;
Ini_System();


while(1)
{// TxPacket();
//for(i=0;i<2;i++)
//Delay(65530);
Wait_Rec_Packet(); //等待接收完成
P1=0xf2;
j=TxRxBuffer[1];
P0=table[j];
Delay(1000);


}
}


相关文档