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