📄 nrf905_receive.lst
字号:
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE NRF905_RECEIVE
OBJECT MODULE PLACED IN NRF905_RECEIVE.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE NRF905_RECEIVE.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <intrins.h>
5
6 /*SPI特殊功能寄存器声明*/
7 sfr SPCTL=0x85;
8 sfr SPSTAT=0x84;
9 sfr SPDAT=0x86;
10
11 /*SPI通信数据线*/
12 sbit SPCLK=P1^7;
13 sbit MISO=P1^6;
14 sbit MOSI=P1^5;
15 sbit CSN=P1^4;
16
17 /*905控制引脚*/
18 sbit TRX_CE=P1^3;
19 sbit TX_EN=P1^2;
20 sbit PWR_UP=P1^1;
21 sbit DR=P1^0;
22
23 /*905命令名称*/
24 unsigned char W_CONFIG=0x00; //写配置寄存器命令
25 unsigned char R_CONFIG=0x10; //读配置寄存器命令
26 unsigned char W_TX_PAYLOAD=0x20; //写TX有效数据命令
27 unsigned char R_TX_PAYLOAD=0x21; //读TX有效数据命令
28 unsigned char W_TX_ADDRESS=0x22; //写TX地址命令
29 unsigned char R_TX_ADDDRESS=0x23; //读TX地址命令
30 unsigned char R_RX_PAYLOAD=0x24; //读RX有效数据命令
31
32 unsigned char temp; //存放905收到的数据
33
34 sbit LED_905_WORK=P3^4;
35
36 /*905配置寄存器初始化*/
37 unsigned char NRF905_Config[10]=
38 {
39 0x7B, //配置905工作频率为434.7
40 0x0C, //输出功率配置为+10dbm
41 0x44, //发射和接受地址宽度均为4字节
42 0x08, //接收数据为5字节
43 0x01, //发射数据个数为1字节
44 0xE7, //接收地址
45 0xE7,
46 0xE7,
47 0xE8,
48 0xDB //晶振频率为16MHZ,禁止外部时钟
49 };
50 /*接收方地址*/
51 unsigned char NRF905_SendAdd[4]={0xE7,0xE7,0xE7,0xE7};
52
53 /*SPI初始化*/
54 void SPI_Init()
55 {
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 2
56 1 SPCTL=0xD0; //SSIG=1,SPEN=1,DORD=0,MSTR=1,CP0L=0,CPHA=0,SPR1=0,SPR0=0.
57 1 SPSTAT=0xC0; //SPIF=1(清零),WCOL=1(清零)
58 1 }
59 void UART_Init()
60 {
61 1 TMOD=0x20;
62 1 SCON=0x50;
63 1 PCON=0x00;
64 1 TH1=0xFD;
65 1 TL1=0xFD;
66 1 TR1=1;
67 1 }
68 void SPI_SendByte(unsigned char dat)
69 {
70 1 SPDAT=dat;
71 1 while(!(SPSTAT&0x80));
72 1 SPSTAT=0xC0;
73 1 }
74 void NRF905_Init()
75 {
76 1 unsigned char i;
77 1 PWR_UP=1;
78 1 TRX_CE=0;
79 1 CSN=0;
80 1 SPI_SendByte(W_CONFIG);
81 1 for(i=0;i<10;i++)
82 1 {
83 2 SPI_SendByte(NRF905_Config[i]);
84 2 }
85 1 CSN=1;
86 1 }
87
88 /*void NRF905_WritAdd()
89 {
90 unsigned char i;
91 PWR_UP=1;
92 TX_EN=1;
93 TRX_CE=0;
94 CSN=0;
95 SPI_SendByte(W_TX_ADDRESS);
96 for(i=0;i<4;i++)
97 {
98 SPI_SendByte(NRF905_SendAdd[i]);
99 }
100 CSN=1;
101 }*/
102
103 /*void NRF905_ReadConfig()
104 {
105 unsigned char i;
106 unsigned char config_dat[10];
107 PWR_UP=1;
108 TRX_CE=0;
109 CSN=0;
110 SPI_SendByte(R_CONFIG);
111 for(i=0;i<10;i++)
112 {
113 SPI_SendByte(0x55);
114 config_dat[i]=SPDAT;
115 }
116 CSN=1;
117 for(i=0;i<10;i++)
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 3
118 {
119 SBUF=config_dat[i];
120 while(!TI);
121 TI=0;
122 }
123 }
124 */
125 /*void NRF905_LoadDat(unsigned char dat)
126 {
127 PWR_UP=1;
128 TX_EN=1;
129 TRX_CE=0;
130 CSN=0;
131 SPI_SendByte(W_TX_PAYLOAD);
132 SPI_SendByte(dat);
133 CSN=1;
134 }*/
135
136 /*void NRF905_SendDat()
137 {
138 PWR_UP=1;
139 TX_EN=1;
140 TRX_CE=1;
141 while(DR==0);
142 TRX_CE=0;
143 TX_EN=0;
144 }*/
145
146 void NRF905_ReceiveDat()
147 {
148 1 unsigned int count;
149 1 unsigned char flag=1;
150 1 PWR_UP=1;
151 1 TX_EN=0;
152 1 TRX_CE=1;
153 1 do{
154 2 count++;
155 2 if(count>50000)
156 2 {
157 3 count=0;
158 3 flag=0;
159 3 break;
160 3 }
161 2 }
162 1 while(DR==0);
163 1 if(flag==1)
164 1 {
165 2 TRX_CE=0;
166 2 TX_EN=0;
167 2 /* CSN=0;
168 2 SPI_SendByte(R_RX_PAYLOAD);
169 2 SPI_SendByte(0xAA);
170 2 temp=SPDAT;
171 2 CSN=1;
172 2 */
173 2
174 2 }
175 1 // return(temp);
176 1 }
177
178 typedef unsigned long int u4;
179 typedef unsigned char u1;
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 4
180 #define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
181 #define ROTR32(x,c) (((x)>>(c))|((x)<<(32-c)));
182 /* rounds and subkeys */
183 typedef struct{
184 u4 *xk;
185 unsigned char nr;
186 } rc5;
187 void rc5_init(rc5 *,unsigned char);
188 void rc5_key(rc5 *,u1 *,unsigned char);
189 void rc5_decrypt(rc5 *,u4 *,unsigned char);
190 void rc5_init(rc5 *c,unsigned char rounds)
191 {
192 1 c->nr=rounds;
193 1 init_mempool (c->xk, 0x1000);
194 1 c->xk=(u4 *) malloc(4*(rounds*2+2));
195 1 }
196 void rc5_decrypt(rc5 *c, u4 *dt,unsigned char blocks)
197 {
198 1 u4 *d,*sk;
199 1 unsigned char h1,rc;
200 1 int i;
201 1 d=dt;
202 1 sk=(c->xk)+2;
203 1 for(h1=0;h1<blocks;h1++)
204 1 {
205 2 for(i=c->nr*2-2;i>=0;i-=2)
206 2 {
207 3 d[1]-=sk[i+1];
208 3 rc=d[0]&31;
209 3 d[1]=ROTR32(d[1],rc);
210 3 d[1]^=d[0];
211 3
212 3 d[0]-=sk[i];
213 3 rc=d[1]&31;
214 3 d[0]=ROTR32(d[0],rc);
215 3 d[0]^=d[1];
216 3 }
217 2 d[0]-=c->xk[0];
218 2 d[1]-=c->xk[1];
219 2 d+=2;
220 2 }
221 1 }
222 void rc5_key(rc5 *c,u1 *key,unsigned char keylen)
223 {
224 1 u4 *pk,A,B; /* padded key */
225 1 unsigned char xk_len,pk_len,i,num_steps,rc;
226 1 u1 *cp;
227 1
228 1 xk_len=c->nr*2+2;
229 1 pk_len=keylen/4;
230 1 if(keylen%4!=0)
231 1 pk_len+=1;
232 1 pk=(u4 *)malloc(pk_len*4);
233 1 /* Initialize pk */
234 1 for(i=0;i<pk_len;i++)
235 1 pk[i]=0;
236 1 cp=(u1 *)pk;
237 1 for(i=1;i<keylen;i++)
238 1 cp[i]=key[i];
239 1 /* Initialize xk */
240 1 c->xk[0]=0xb7e15163;/* p32 */
241 1 for(i=1;i<xk_len;i++)
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 5
242 1 c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
243 1
244 1 /* Expand key into xk. */
245 1 if(pk_len>xk_len)
246 1 num_steps=3*pk_len;
247 1 else
248 1 num_steps=3*xk_len;
249 1
250 1 A=B=0;
251 1 for(i=0;i<num_steps;i++)
252 1 {
253 2 A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
254 2 rc=(A+B)&31;
255 2 B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
256 2 }
257 1 /* Clobber sensitive data */
258 1 for(i=0;i<pk_len;i++)
259 1 pk[i]=0;
260 1 free(pk);
261 1 }
262 void main()
263 {
264 1
265 1 unsigned int n;
266 1 unsigned char m;
267 1 unsigned char temp_reg=0;
268 1 rc5 c;
269 1 u1 * dat;
270 1 u4 *pk;
271 1 unsigned char key[16] ="0nfjbopa2niuerjf";
272 1 unsigned char NRF905_Receive[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
273 1 for(n=50000;n>0;n--);
274 1 LED_905_WORK=0;
275 1 UART_Init();
276 1 SPI_Init();
277 1 NRF905_Init();
278 1 while(1)
279 1 {
280 2 NRF905_ReceiveDat();
281 2 CSN=0;
282 2 SPI_SendByte(R_RX_PAYLOAD);
283 2 for(m=0;m<8;m++)
284 2 {
285 3 SPI_SendByte(0xAA);
286 3 NRF905_Receive[m]=SPDAT;
287 3
288 3
289 3 }
290 2 CSN=1;
291 2 pk=(u4*)NRF905_Receive;
292 2
293 2 rc5_init(&c,12);
294 2 rc5_key(&c,key,16);
295 2 rc5_decrypt(&c,pk,1);
296 2 dat=(u1*)pk;
297 2
298 2
299 2 /*for(m=0;m<8;m++)
300 2 { SBUF=NRF905_Receive[m];
301 2 while(!TI);
302 2 TI=0;
303 2 }*/
C51 COMPILER V7.08 NRF905_RECEIVE 07/04/2007 07:33:34 PAGE 6
304 2
305 2
306 2 LED_905_WORK=!LED_905_WORK;
307 2 for(m=0;m<8;m++)
308 2 {
309 3 SBUF=dat[m];
310 3 while(!TI);
311 3 TI=0;
312 3 }
313 2 /* if(NRF905_Receive[7]==0x08)
314 2 {
315 2 NRF905_WritAdd();
316 2 NRF905_LoadDat(0x5A);
317 2 NRF905_SendDat();
318 2 }*/
319 2
320 2 for(n=50000;n>0;n--);
321 2 }
322 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1854 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 87
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -