📄 nrf905_send.c
字号:
#include <reg51.h>
#include <stdio.h>
#include<stdlib.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有效数据命令
sbit LED_905_WORK=P3^4;
//unsigned char j;
/*905配置寄存器初始化*/
unsigned char NRF905_Config[10]=
{
0x7B, //配置905工作频率为434.7
0x0C, //输出功率配置为+10dbm
0x44, //发射和接受地址宽度均为4字节
0x01, //接收数据为1字节
0x08, //发射数据个数为8字节
0xE7, //接收地址
0xE7,
0xE7,
0xE7,
0xDB //晶振频率为16MHZ,禁止外部时钟
};
/*接收方地址*/
unsigned char NRF905_SendAdd[4]={0xE7,0xE7,0xE7,0xE8};
typedef unsigned long int u4;
/* rounds and subkeys */
typedef struct{
u4 *xk;
unsigned char nr;
}rc5;
#define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
/*Function prototypes */
//u4 ROTL32(u4,int);
void rc5_init(rc5 *,unsigned char);
void rc5_key(rc5 *,unsigned char *,unsigned char);
void rc5_encrypt(rc5 *,u4 *,unsigned char);
/*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;
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
void SPI_SendByte(unsigned char dat)
{
SPDAT=dat;
while(!(SPSTAT&0x80));
// temp=SPDAT;
SPSTAT=0xC0;
}
void NRF905_Init()
{
unsigned char i;
PWR_UP=1;
TX_EN=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_ReadConfig()
{
unsigned char i;
unsigned char config_dat[10];
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_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_LoadDat(unsigned char *dat)
{
unsigned char i;
PWR_UP=1;
TX_EN=1;
TRX_CE=0;
for(i=0;i<8;i++)
SPI_SendByte(dat[i]);
}
void NRF905_SendDat()
{
PWR_UP=1;
TX_EN=1;
TRX_CE=1;
while(DR==0);
TRX_CE=0;
TX_EN=0;
}
void rc5_init(rc5 *c,unsigned char rounds)
{
c->nr=rounds;
init_mempool (c->xk, 0x0100);
c->xk=(u4 *) malloc(4*(rounds*2+2));
}
void rc5_key(rc5 *c,unsigned char *key,unsigned char keylen)
{
u4 *pk,A,B; /* padded key */
unsigned char xk_len,pk_len,i,num_steps,rc;
unsigned char *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=(unsigned char*)pk;
for(i=0;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 rc5_encrypt(rc5 *c,u4 *dt,unsigned char blocks)
{
u4 *d,*sk;
unsigned char h,i,rc;
d=dt;
sk=(c->xk)+2;
for(h=0;h<blocks;h++)
{ d[0]+=c->xk[0];
d[1]+=c->xk[1];
for(i=0;i<c->nr*2;i+=2)
{
d[0]^=d[1];
rc=d[1]&31;
d[0]=ROTL32(d[0],rc);
d[0]+=sk[i];
d[1]^=d[0];
rc=d[0]&31;
d[1]=ROTL32(d[1],rc);
d[1]+=sk[i+1];
}
d+=2;
}
}
void main()
{
unsigned int n;
unsigned char m;
unsigned char dat[8]={0};
unsigned char key[16] ="0nfjbopa2niuerjf";
rc5 c;
unsigned char *pk;
u4 dt[2]={0x03040506,0x0708090A};
for(n=50000;n>0;n--);
LED_905_WORK=0;
UART_Init();
SPI_Init();
NRF905_Init();
NRF905_WritAdd();
rc5_init(&c,12);
rc5_key(&c,key,16);
rc5_encrypt(&c,dt,1);
pk=(unsigned char*)dt;
while(1)
{
for(n=50000;n>0;n--);
CSN=0;
SPI_SendByte(0x20);
NRF905_LoadDat(pk);
CSN=1;
NRF905_SendDat();
CSN=0;
SPI_SendByte(0x21);
for(m=0;m<8;m++)
{
SPI_SendByte(0x55);
SBUF=SPDAT;
while(!TI);
TI=0;
}
CSN=1;
LED_905_WORK=!LED_905_WORK;
/* temp_reg=NRF905_ReceiveDat();
SBUF=temp_reg;
while(!TI);
TI=0;
*/
for(n=50000;n>0;n--);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -