📄 radiocontrol.lst
字号:
165:radiocontrol.c **** csVal1 = 0x180;
301 .LM39:
302 00e0 80E8 ldi r24,lo8(384)
303 00e2 91E0 ldi r25,hi8(384)
304 00e4 9093 0000 sts (csVal1)+1,r25
305 00e8 8093 0000 sts csVal1,r24
166:radiocontrol.c **** return SUCCESS;
307 .LM40:
308 00ec 81E0 ldi r24,lo8(1)
309 00ee 90E0 ldi r25,hi8(1)
167:radiocontrol.c ****
168:radiocontrol.c ****
169:radiocontrol.c **** }
311 .LM41:
312 00f0 0895 ret
313 /* epilogue: frame size=0 */
314 00f2 0895 ret
315 /* epilogue end (size=1) */
316 /* function RadiocontrolCarrierSenseStart size 47 (46) */
320 .global RadiocontrolRSSIADCDataReady
322 RadiocontrolRSSIADCDataReady:
170:radiocontrol.c ****
171:radiocontrol.c **** /*************************************************************************
172:radiocontrol.c **** *功能描述:ADC中断调用,表明RSSI数据到达,判断信道空闲与否
173:radiocontrol.c **** *参数说明:ADC采集到的数据
174:radiocontrol.c **** *返回值: 成功
175:radiocontrol.c **** **************************************************************************/
176:radiocontrol.c **** result_t RadiocontrolRSSIADCDataReady(uint16_t data) // 判断信道是否空闲
177:radiocontrol.c **** {
324 .LM42:
325 /* prologue: frame size=0 */
326 /* prologue end (size=0) */
327 00f4 9C01 movw r18,r24
178:radiocontrol.c **** if (state == IDLE && carrSenTime > 0) {
329 .LM43:
330 00f6 8091 0000 lds r24,state
331 00fa 8230 cpi r24,lo8(2)
332 00fc 09F0 breq .+2
333 00fe 3EC0 rjmp .L13
335 .LM44:
336 0100 8091 0000 lds r24,carrSenTime
337 0104 9091 0000 lds r25,(carrSenTime)+1
338 0108 892B or r24,r25
339 010a C1F1 breq .L13
179:radiocontrol.c **** csValAve = (csVal1 + data) >> 1; // 相邻两次监听的平均值;
341 .LM45:
342 010c 8091 0000 lds r24,csVal1
343 0110 9091 0000 lds r25,(csVal1)+1
344 0114 820F add r24,r18
345 0116 931F adc r25,r19
346 0118 9695 lsr r25
347 011a 8795 ror r24
348 011c 9093 0000 sts (csValAve)+1,r25
349 0120 8093 0000 sts csValAve,r24
180:radiocontrol.c **** if (csValAve < BUSY_THRESHOLD) { // 因为CC1000提供的是反电压值,所以值越小,信号越强;
351 .LM46:
352 0124 8F3E cpi r24,239
353 0126 9105 cpc r25,__zero_reg__
354 0128 78F4 brsh .L14
181:radiocontrol.c **** idlecount = 0;
356 .LM47:
357 012a 1092 0000 sts idlecount,__zero_reg__
182:radiocontrol.c **** if (backofftime <= 1) {
359 .LM48:
360 012e 8091 0000 lds r24,backofftime
361 0132 9091 0000 lds r25,(backofftime)+1
362 0136 0297 sbiw r24,2
363 0138 08F5 brsh .L13
183:radiocontrol.c **** carrSenTime = 0 ;
365 .LM49:
366 013a 1092 0000 sts (carrSenTime)+1,__zero_reg__
367 013e 1092 0000 sts carrSenTime,__zero_reg__
184:radiocontrol.c **** MACChannelBusy();
369 .LM50:
370 0142 0E94 0000 call MACChannelBusy
371 0146 1AC0 rjmp .L13
372 .L14:
185:radiocontrol.c **** //监听信道的状态
186:radiocontrol.c **** }
187:radiocontrol.c **** } else {
188:radiocontrol.c **** idlecount = idlecount + 1;
374 .LM51:
375 0148 8091 0000 lds r24,idlecount
376 014c 8F5F subi r24,lo8(-(1))
377 014e 8093 0000 sts idlecount,r24
189:radiocontrol.c **** if ( idlecount >= (DIFS*LISTEN_RATE>>3)){
379 .LM52:
380 0152 8831 cpi r24,lo8(24)
381 0154 98F0 brlo .L13
190:radiocontrol.c **** backofftime = backofftime - 1;
383 .LM53:
384 0156 8091 0000 lds r24,backofftime
385 015a 9091 0000 lds r25,(backofftime)+1
386 015e 0197 sbiw r24,1
387 0160 9093 0000 sts (backofftime)+1,r25
388 0164 8093 0000 sts backofftime,r24
191:radiocontrol.c **** if( backofftime <=1){
390 .LM54:
391 0168 0297 sbiw r24,2
392 016a 40F4 brsh .L13
192:radiocontrol.c **** carrSenTime = 0 ;
394 .LM55:
395 016c 1092 0000 sts (carrSenTime)+1,__zero_reg__
396 0170 1092 0000 sts carrSenTime,__zero_reg__
193:radiocontrol.c **** idlecount = 0;
398 .LM56:
399 0174 1092 0000 sts idlecount,__zero_reg__
194:radiocontrol.c **** MACChannelIdle();
401 .LM57:
402 0178 0E94 0000 call MACChannelIdle
403 .L13:
195:radiocontrol.c **** }
196:radiocontrol.c ****
197:radiocontrol.c **** }
198:radiocontrol.c **** }
199:radiocontrol.c **** }
200:radiocontrol.c **** return SUCCESS;
201:radiocontrol.c **** }
405 .LM58:
406 017c 81E0 ldi r24,lo8(1)
407 017e 90E0 ldi r25,hi8(1)
408 /* epilogue: frame size=0 */
409 0180 0895 ret
410 /* epilogue end (size=1) */
411 /* function RadiocontrolRSSIADCDataReady size 73 (72) */
414 .global RadiocontrolStartTx
416 RadiocontrolStartTx:
202:radiocontrol.c ****
203:radiocontrol.c **** /*************************************************************************
204:radiocontrol.c **** *功能描述:启动发送数据包的流程,并准备要发送的导频字节,CC1000、SPI进入发送态
205:radiocontrol.c **** *参数说明:无
206:radiocontrol.c **** *返回值: 成功
207:radiocontrol.c **** **************************************************************************/
208:radiocontrol.c **** result_t RadiocontrolStartTx()
209:radiocontrol.c **** {
418 .LM59:
419 /* prologue: frame size=0 */
420 /* prologue end (size=0) */
210:radiocontrol.c **** char temp;
211:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0x00; // 关SPI中断
422 .LM60:
423 0182 1DB8 out 45-0x20,__zero_reg__
212:radiocontrol.c **** if (state == SLEEP) { // 如果睡眠则唤醒
425 .LM61:
426 0184 8091 0000 lds r24,state
427 0188 8130 cpi r24,lo8(1)
428 018a 11F4 brne .L20
213:radiocontrol.c **** CC1000ControlStdControlStart();
430 .LM62:
431 018c 0E94 0000 call CC1000ControlStdControlStart
432 .L20:
214:radiocontrol.c **** }
215:radiocontrol.c **** nextByte = 0xaa; // 缓存下一个要发送的字节
434 .LM63:
435 0190 9AEA ldi r25,lo8(-86)
436 0192 9093 0000 sts nextByte,r25
216:radiocontrol.c **** txCount = 2;
438 .LM64:
439 0196 82E0 ldi r24,lo8(2)
440 0198 8093 0000 sts txCount,r24
217:radiocontrol.c **** temp = * (volatile unsigned char *)(0x0E + 0x20); // 清空SPSR寄存器
442 .LM65:
443 019c 8EB1 in r24,46-0x20
218:radiocontrol.c **** * (volatile unsigned char *)(0x0F + 0x20) = 0xaa;; //将要发送的第一个字节写入SPDR
445 .LM66:
446 019e 9FB9 out 47-0x20,r25
219:radiocontrol.c ****
220:radiocontrol.c **** //进入发送模式
221:radiocontrol.c **** CC1000ControlTxMode();
448 .LM67:
449 01a0 0E94 0000 call CC1000ControlTxMode
222:radiocontrol.c **** OSH_MAKE_MISO_OUTPUT();
451 .LM68:
452 01a4 0E94 0000 call OSH_MAKE_MISO_OUTPUT
223:radiocontrol.c **** OSH_MAKE_MOSI_OUTPUT();
454 .LM69:
455 01a8 0E94 0000 call OSH_MAKE_MOSI_OUTPUT
224:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0xc0; // 开SPI中断
457 .LM70:
458 01ac 80EC ldi r24,lo8(-64)
459 01ae 8DB9 out 45-0x20,r24
225:radiocontrol.c ****
226:radiocontrol.c **** state = TRANSMIT;
461 .LM71:
462 01b0 85E0 ldi r24,lo8(5)
463 01b2 8093 0000 sts state,r24
227:radiocontrol.c **** return SUCCESS;
228:radiocontrol.c **** }
465 .LM72:
466 01b6 81E0 ldi r24,lo8(1)
467 01b8 90E0 ldi r25,hi8(1)
468 /* epilogue: frame size=0 */
469 01ba 0895 ret
470 /* epilogue end (size=1) */
471 /* function RadiocontrolStartTx size 29 (28) */
476 .global RadiocontrolTxNextByte
478 RadiocontrolTxNextByte:
229:radiocontrol.c ****
230:radiocontrol.c **** /*************************************************************************
231:radiocontrol.c **** *功能描述:供上层调用,把下一个要发送的字节存入发送缓冲
232:radiocontrol.c **** *参数说明:要发送的字节
233:radiocontrol.c **** *返回值: 成功
234:radiocontrol.c **** **************************************************************************/
235:radiocontrol.c **** result_t RadiocontrolTxNextByte(char data) // 准备下一个要发送的字节
236:radiocontrol.c **** {
480 .LM73:
481 /* prologue: frame size=0 */
482 /* prologue end (size=0) */
237:radiocontrol.c **** nextByte = data;
484 .LM74:
485 01bc 8093 0000 sts nextByte,r24
238:radiocontrol.c **** return SUCCESS;
239:radiocontrol.c **** }
487 .LM75:
488 01c0 81E0 ldi r24,lo8(1)
489 01c2 90E0 ldi r25,hi8(1)
490 /* epilogue: frame size=0 */
491 01c4 0895 ret
492 /* epilogue end (size=1) */
493 /* function RadiocontrolTxNextByte size 5 (4) */
496 .global __vector_17
498 __vector_17:
240:radiocontrol.c ****
241:radiocontrol.c **** /*************************************************************************
242:radiocontrol.c **** *功能描述:SPI中断服务程序,由CC1000的时钟信号引发,与CC1000同步,即数据率相同
243:radiocontrol.c **** * 根据本地状态进行相应的处理,为上层提供服务
244:radiocontrol.c **** *参数说明:无
245:radiocontrol.c **** *返回值: 成功
246:radiocontrol.c **** **************************************************************************/
247:radiocontrol.c **** void __attribute((signal)) __vector_17(void)
248:radiocontrol.c **** {
500 .LM76:
501 /* prologue: frame size=0 */
502 01c6 1F92 push __zero_reg__
503 01c8 0F92 push __tmp_reg__
504 01ca 0FB6 in __tmp_reg__,__SREG__
505 01cc 0F92 push __tmp_reg__
506 01ce 1124 clr __zero_reg__
507 01d0 2F93 push r18
508 01d2 3F93 push r19
509 01d4 4F93 push r20
510 01d6 5F93 push r21
511 01d8 6F93 push r22
512 01da 7F93 push r23
513 01dc 8F93 push r24
514 01de 9F93 push r25
515 01e0 AF93 push r26
516 01e2 BF93 push r27
517 01e4 EF93 push r30
518 01e6 FF93 push r31
519 /* prologue end (size=17) */
249:radiocontrol.c **** uint8_t data;
250:radiocontrol.c **** data = * (volatile unsigned char *)(0x0F + 0x20); // 从SPDR读入字节
521 .LM77:
522 01e8 2FB1 in r18,47-0x20
251:radiocontrol.c **** if (bInvertRxData) data = ~data;
524 .LM78:
525 01ea 8091 0000 lds r24,bInvertRxData
526 01ee 8111 cpse r24,__zero_reg__
528 .LM79:
529 01f0 2095 com r18
530 .L23:
252:radiocontrol.c ****
253:radiocontrol.c **** if (state == TRANSMIT) { // 发送状态
532 .LM80:
533 01f2 8091 0000 lds r24,state
534 01f6 8530 cpi r24,lo8(5)
535 01f8 C9F4 brne .L24
254:radiocontrol.c **** * (volatile unsigned char *)(0x0F + 0x20) = nextByte;// 发送缓存中的字节
537 .LM81:
538 01fa 8091 0000 lds r24,nextByte
539 01fe 8FB9 out 47-0x20,r24
255:radiocontrol.c **** if (txCount < PREAMBLE_LEN) { // 继续发送导频
541 .LM82:
542 0200 9091 0000 lds r25,txCount
543 0204 9231 cpi r25,lo8(18)
544 0206 10F4 brsh .L25
256:radiocontrol.c **** nextByte = 0xaa;
546 .LM83:
547 0208 8AEA ldi r24,lo8(-86)
548 020a 07C0 rjmp .L59
549 .L25:
257:radiocontrol.c **** txCount++;
258:radiocontrol.c **** } else if (txCount < PREAMBLE_LEN + sizeof(start)) {// 导频发送完毕
551 .LM84:
552 020c 9431 cpi r25,lo8(20)
553 020e 58F4 brsh .L27
259:radiocontrol.c **** nextByte = start[txCount - PREAMBLE_LEN]; // 发两个同步字节;
555 .LM85:
556 0210 E92F mov r30,r25
557 0212 FF27 clr r31
558 0214 E050 subi r30,lo8(-(start-18))
559 0216 F040 sbci r31,hi8(-(start-18))
560 0218 8081 ld r24,Z
561 .L59:
562 021a 8093 0000 sts nextByte,r24
260:radiocontrol.c **** txCount++;
564 .LM86:
565 021e 9F5F subi r25,lo8(-(1))
566 0220 9093 0000 sts txCount,r25
567 0224 A6C0 rjmp .L22
568 .L27:
261:radiocontrol.c **** } else {
262:radiocontrol.c **** PhysicalTxByteReady();
570 .LM87:
571 0226 0E94 0000 call PhysicalTxByteReady
572 022a A3C0 rjmp .L22
573 .L24:
263:radiocontrol.c **** //加入对上层函数的调用 // 通知上层发送数据包;
264:radiocontrol.c **** }
265:radiocontrol.c **** } else if (state == IDLE) { // 空闲
575 .LM88:
576 022c 8230 cpi r24,lo8(2)
577 022e 11F5 brne .L30
266:radiocontrol.c **** bManchesterBad = * (volatile unsigned char *)(0x1A + 0x20) & 0x40;// CHP_OUT位
579 .LM89:
580 0230 8AB3 in r24,58-0x20
581 0232 8074 andi r24,lo8(64)
582 0234 8093 0000 sts bManchesterBad,r24
267:radiocontrol.c **** if ((!bManchesterBad) && (data == 0xaa || data == 0x55)) {
584 .LM90:
585 0238 8823 tst r24
586 023a 79F4 brne .L31
587 023c 2A3A cpi r18,lo8(-86)
588 023e 11F0 breq .L32
589 0240 2535 cpi r18,lo8(85)
590 0242 59F4 brne .L31
591 .L32:
268:radiocontrol.c **** PreambleCount++;
593 .LM91:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -