📄 nrf905_receive.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
/*SPI特殊功能寄存器声明*/
sfr SPCTL=0x85;
sfr SPSTAT=0x84;
sfr SPDAT=0x86;
/*SPI通信数据线*/
sbit SPCLK=P1^7;
sbit MISO=P1^6;
sbit MOSI=P1^5;
sbit CSN=P1^4;
/*905控制引脚*/
sbit TRX_CE=P1^3;
sbit TX_EN=P1^2;
sbit PWR_UP=P1^1;
sbit DR=P1^0;
/*905命令名称*/
unsigned char W_CONFIG=0x00; //写配置寄存器命令
unsigned char R_CONFIG=0x10; //读配置寄存器命令
unsigned char W_TX_PAYLOAD=0x20; //写TX有效数据命令
unsigned char R_TX_PAYLOAD=0x21; //读TX有效数据命令
unsigned char W_TX_ADDRESS=0x22; //写TX地址命令
unsigned char R_TX_ADDDRESS=0x23; //读TX地址命令
unsigned char R_RX_PAYLOAD=0x24; //读RX有效数据命令
unsigned char temp; //存放905收到的数据
sbit LED_905_WORK=P3^4;
/*905配置寄存器初始化*/
unsigned char NRF905_Config[10]=
{
0x7B, //配置905工作频率为434.7
0x0C, //输出功率配置为+10dbm
0x44, //发射和接受地址宽度均为4字节
0x08, //接收数据为5字节
0x01, //发射数据个数为1字节
0xE7, //接收地址
0xE7,
0xE7,
0xE8,
0xDB //晶振频率为16MHZ,禁止外部时钟
};
/*接收方地址*/
unsigned char NRF905_SendAdd[4]={0xE7,0xE7,0xE7,0xE7};
/*SPI初始化*/
void SPI_Init()
{
SPCTL=0xD0; //SSIG=1,SPEN=1,DORD=0,MSTR=1,CP0L=0,CPHA=0,SPR1=0,SPR0=0.
SPSTAT=0xC0; //SPIF=1(清零),WCOL=1(清零)
}
void UART_Init()
{
TMOD=0x20;
SCON=0x50;
PCON=0x00;
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
void SPI_SendByte(unsigned char dat)
{
SPDAT=dat;
while(!(SPSTAT&0x80));
SPSTAT=0xC0;
}
void NRF905_Init()
{
unsigned char i;
PWR_UP=1;
TRX_CE=0;
CSN=0;
SPI_SendByte(W_CONFIG);
for(i=0;i<10;i++)
{
SPI_SendByte(NRF905_Config[i]);
}
CSN=1;
}
/*void NRF905_WritAdd()
{
unsigned char i;
PWR_UP=1;
TX_EN=1;
TRX_CE=0;
CSN=0;
SPI_SendByte(W_TX_ADDRESS);
for(i=0;i<4;i++)
{
SPI_SendByte(NRF905_SendAdd[i]);
}
CSN=1;
}*/
/*void NRF905_ReadConfig()
{
unsigned char i;
unsigned char config_dat[10];
PWR_UP=1;
TRX_CE=0;
CSN=0;
SPI_SendByte(R_CONFIG);
for(i=0;i<10;i++)
{
SPI_SendByte(0x55);
config_dat[i]=SPDAT;
}
CSN=1;
for(i=0;i<10;i++)
{
SBUF=config_dat[i];
while(!TI);
TI=0;
}
}
*/
/*void NRF905_LoadDat(unsigned char dat)
{
PWR_UP=1;
TX_EN=1;
TRX_CE=0;
CSN=0;
SPI_SendByte(W_TX_PAYLOAD);
SPI_SendByte(dat);
CSN=1;
}*/
/*void NRF905_SendDat()
{
PWR_UP=1;
TX_EN=1;
TRX_CE=1;
while(DR==0);
TRX_CE=0;
TX_EN=0;
}*/
void NRF905_ReceiveDat()
{
unsigned int count;
unsigned char flag=1;
PWR_UP=1;
TX_EN=0;
TRX_CE=1;
do{
count++;
if(count>50000)
{
count=0;
flag=0;
break;
}
}
while(DR==0);
if(flag==1)
{
TRX_CE=0;
TX_EN=0;
/* CSN=0;
SPI_SendByte(R_RX_PAYLOAD);
SPI_SendByte(0xAA);
temp=SPDAT;
CSN=1;
*/
}
// return(temp);
}
typedef unsigned long int u4;
typedef unsigned char u1;
#define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
#define ROTR32(x,c) (((x)>>(c))|((x)<<(32-c)));
/* rounds and subkeys */
typedef struct{
u4 *xk;
unsigned char nr;
} rc5;
void rc5_init(rc5 *,unsigned char);
void rc5_key(rc5 *,u1 *,unsigned char);
void rc5_decrypt(rc5 *,u4 *,unsigned char);
void rc5_init(rc5 *c,unsigned char rounds)
{
c->nr=rounds;
init_mempool (c->xk, 0x1000);
c->xk=(u4 *) malloc(4*(rounds*2+2));
}
void rc5_decrypt(rc5 *c, u4 *dt,unsigned char blocks)
{
u4 *d,*sk;
unsigned char h1,rc;
int i;
d=dt;
sk=(c->xk)+2;
for(h1=0;h1<blocks;h1++)
{
for(i=c->nr*2-2;i>=0;i-=2)
{
d[1]-=sk[i+1];
rc=d[0]&31;
d[1]=ROTR32(d[1],rc);
d[1]^=d[0];
d[0]-=sk[i];
rc=d[1]&31;
d[0]=ROTR32(d[0],rc);
d[0]^=d[1];
}
d[0]-=c->xk[0];
d[1]-=c->xk[1];
d+=2;
}
}
void rc5_key(rc5 *c,u1 *key,unsigned char keylen)
{
u4 *pk,A,B; /* padded key */
unsigned char xk_len,pk_len,i,num_steps,rc;
u1 *cp;
xk_len=c->nr*2+2;
pk_len=keylen/4;
if(keylen%4!=0)
pk_len+=1;
pk=(u4 *)malloc(pk_len*4);
/* Initialize pk */
for(i=0;i<pk_len;i++)
pk[i]=0;
cp=(u1 *)pk;
for(i=1;i<keylen;i++)
cp[i]=key[i];
/* Initialize xk */
c->xk[0]=0xb7e15163;/* p32 */
for(i=1;i<xk_len;i++)
c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
/* Expand key into xk. */
if(pk_len>xk_len)
num_steps=3*pk_len;
else
num_steps=3*xk_len;
A=B=0;
for(i=0;i<num_steps;i++)
{
A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
rc=(A+B)&31;
B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
}
/* Clobber sensitive data */
for(i=0;i<pk_len;i++)
pk[i]=0;
free(pk);
}
void main()
{
unsigned int n;
unsigned char m;
unsigned char temp_reg=0;
rc5 c;
u1 * dat;
u4 *pk;
unsigned char key[16] ="0nfjbopa2niuerjf";
unsigned char NRF905_Receive[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
for(n=50000;n>0;n--);
LED_905_WORK=0;
UART_Init();
SPI_Init();
NRF905_Init();
while(1)
{
NRF905_ReceiveDat();
CSN=0;
SPI_SendByte(R_RX_PAYLOAD);
for(m=0;m<8;m++)
{
SPI_SendByte(0xAA);
NRF905_Receive[m]=SPDAT;
}
CSN=1;
pk=(u4*)NRF905_Receive;
rc5_init(&c,12);
rc5_key(&c,key,16);
rc5_decrypt(&c,pk,1);
dat=(u1*)pk;
/*for(m=0;m<8;m++)
{ SBUF=NRF905_Receive[m];
while(!TI);
TI=0;
}*/
LED_905_WORK=!LED_905_WORK;
for(m=0;m<8;m++)
{
SBUF=dat[m];
while(!TI);
TI=0;
}
/* if(NRF905_Receive[7]==0x08)
{
NRF905_WritAdd();
NRF905_LoadDat(0x5A);
NRF905_SendDat();
}*/
for(n=50000;n>0;n--);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -