📄 a7102.lst
字号:
323 1 Byte_Write(addr);
324 1
325 1 /* 写A7102-参数配置数据 */
326 1 Word_Write(parameter);
327 1
328 1 iSPI_Scs = positive;
329 1 }
330 /***********************************************
331 函 数: A7102_Register_Read()
332 功 能: 读控制数据从A7102内部寄存器
333 输 入: addr
334 输 出: parameter
335 描 述: /
336 ***********************************************/
337 unsigned int A7102_Register_Read(unsigned char addr)
338 {
339 1 unsigned int parameter;
340 1
341 1 iSPI_Sck = negative;
342 1 delay_A7102_us();
343 1 iSPI_Scs = negative;
344 1
345 1 addr &= 0x0f;
346 1 addr |= 0x80;
347 1
348 1 /* 读A7102-参数配置命令 */
349 1 Byte_Write(addr);
350 1
351 1 declare_sdo_input();
352 1
353 1 /* 读A7102-参数配置数据 */
354 1 parameter = Word_Read();
355 1
356 1 declare_sdo_output();
357 1
358 1 iSPI_Scs = positive;
359 1
360 1 /* 返回读取数值 */
361 1 return (parameter);
362 1 }
363 /***********************************************
364 函 数: A7102_Status_Transmit()
C51 COMPILER V8.18 A7102 03/20/2010 16:53:38 PAGE 7
365 功 能: A7102设置为发射状态
366 输 入: /
367 输 出: /
368 描 述: A7102使用12.8M晶体为基准源
369 ***********************************************/
370 void A7102_Status_Transmit(void)
371 {
372 1 #if mode_switch
iSPI_Tre = negative;
iSPI_Trs = positive;
iSPI_Tre = positive;
#else
377 1 #if mode_fifo
378 1 /* standby mode */
379 1 A7102_Register_Write(Reg_ModeControl,0x00d0);
380 1 /* TX frequency */
381 1 A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
382 1 /* 校准值 */
383 1 A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
384 1 /* transimit mode */
385 1 A7102_Register_Write(Reg_ModeControl,0x00d8);
386 1 #else
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x0050);
/* TX frequency */
A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
/* transimit mode */
A7102_Register_Write(Reg_ModeControl,0x0058);
#endif
396 1 #endif
397 1 }
398 /***********************************************
399 函 数: A7102_Receiver_Enable()
400 功 能: A7102接收使能
401 输 入: /
402 输 出: /
403 描 述: A7102使用12.8M晶体为基准源
404 ***********************************************/
405 void A7102_Receiver_Enable(void)
406 {
407 1 #if mode_fifo
408 1 A7102_Register_Write(Reg_ModeControl,0x00c8);
409 1 #else
A7102_Register_Write(Reg_ModeControl,0x0048);
#endif
412 1 }
413 /***********************************************
414 函 数: A7102_Status_Receiver()
415 功 能: A7102设置为接收状态
416 输 入: /
417 输 出: /
418 描 述: A7102使用12.8M晶体为基准源
419 ***********************************************/
420 void A7102_Status_Receiver(void)
421 {
422 1 #if mode_switch
iSPI_Tre = negative;
iSPI_Trs = negative;
iSPI_Tre = positive;
#else
C51 COMPILER V8.18 A7102 03/20/2010 16:53:38 PAGE 8
427 1 #if mode_fifo
428 1 /* standby mode */
429 1 A7102_Register_Write(Reg_ModeControl,0x00c0);
430 1 /* RX frequency */
431 1 A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
432 1 /* 校准值 */
433 1 A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
434 1 /* enable receive mode */
435 1 A7102_Receiver_Enable();
436 1 #else
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x0040);
/* RX frequency */
A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
/* enable receive mode */
A7102_Receiver_Enable();
#endif
446 1 #endif
447 1 }
448 /***********************************************
449 函 数: A7102_Calibration_Frequency()
450 功 能: 频率校准IF和VCO
451 输 入: frequency(PLL II寄存器)
452 输 出: /
453 描 述: A7102使用12.8M晶体为基准源
454 ***********************************************/
455 unsigned int A7102_Calibration_Frequency(unsigned int frequency)
456 {
457 1 unsigned int temp;
458 1
459 1 /* 设置频率 */
460 1 A7102_Register_Write(Reg_PLL_II,frequency);
461 1
462 1 /* 读出校准寄存器内值 */
463 1 temp = A7102_Register_Read(Reg_ModeControl);
464 1
465 1 /* 打开校准功能 */
466 1 temp |= 0x0006;
467 1 A7102_Register_Write(Reg_ModeControl,temp);
468 1
469 1 /* 等待校准完成 */
470 1 do
471 1 {
472 2 temp = A7102_Register_Read(Reg_ModeControl);
473 2 }while(temp&0x0006);
474 1
475 1 /* 获取校准的IF和VCO的补偿值 */
476 1 temp = A7102_Register_Read(Reg_Calibration);
477 1 /* MVBS =1,MIFS = 1,在状态切换时使用手动校准 */
478 1 temp &= 0x00ef;
479 1 temp |= 0x4910;
480 1
481 1 /* 返回校准的IF和VCO的补偿值 */
482 1 return temp;
483 1 }
484 /***********************************************
485 函 数: A7102_Config_Chip()
486 功 能: 配置A7102参数寄存器
487 输 入: /
488 输 出: /
C51 COMPILER V8.18 A7102 03/20/2010 16:53:38 PAGE 9
489 描 述: A7102使用12.8M晶体为基准源
490 ***********************************************/
491 void A7102_Config_Chip(void)
492 {
493 1 uint temp = 0x0000;
494 1
495 1 iSPI_Tre = negative;
496 1 iSPI_Trs = negative;
497 1
498 1 /* rate = 50kbps,IF = 100k,CSC[2:0] = 001,System clock = 64*IF = 6.4M */
499 1 A7102_Register_Write(Reg_SystemClock,0x0079);
500 1
501 1 /* TX = 434MHZ * 2 = (12.8mhz/(RRC[3:0]+1)) * (IP[7:0]+(FP[15:0]/65535)),RRC[3:0] = 0000,IP[7:0] =
- 0100 0011 */
502 1 /* MDIV = 0,IP选择范围32 - 127 */
503 1 A7102_Register_Write(Reg_PLL_I,0x0043);
504 1 /* FP[15:0],默认434Mhz */
505 1 A7102_Register_Write(Reg_PLL_II,0xcfff);
506 1 /* default 0x0000,无调校 */
507 1 A7102_Register_Write(Reg_PLL_III,0x0000);
508 1 /* PDL[2:0] =011,HFB =0(<500mhz),VCS[1:0] =00,CPS =0(normal),CPC[1:0] =01(charge pump 1mA) */
509 1 /* VCS[1:0] = 01,VCO电流控制为1,SDPW = 1 */
510 1 A7102_Register_Write(Reg_PLL_IV,0x066c);
511 1
512 1
513 1 #if mode_modulation
514 1 /* TME =1,发射带调制,GS =0,高斯滤波器关闭,FX = 12.8M,FDP = 101,FD = 0010 0000,
515 1 频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
516 1 = 12800khz * 32 * (2^5) /(2^19)
517 1 = 25khz */
518 1 A7102_Register_Write(Reg_TXI,0x1520);
519 1
520 1 #else
/* TME =0,发射未带调制,GS =0,高斯滤波器关闭,FX = 12.8M,
频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
= 12800khz * 128 * (2^5) /(2^19)
= 100khz */
A7102_Register_Write(Reg_TXI,0x0580);
#endif
527 1
528 1 /* 发射功率设置为最大功率 */
529 1 A7102_Register_Write(Reg_TXII,0x0337);
530 1
531 1 /* MPL[1:0] = 01,SLF[2:0] = 100,ETH[1:0] = 00,无位错误选择,DMOS = 0,DMG[1:0] = 01,增益X3 */
532 1 /* BW[1:0] = 00,50Khz,ULS= 1,下旁波带,HGM =1,高增益 */
533 1 A7102_Register_Write(Reg_RXI,0x1813);
534 1
535 1 /* Amic推荐值 */
536 1 A7102_Register_Write(Reg_RXII,0x500b);
537 1
538 1 /* CDM =1,carrier 打开 */
539 1 A7102_Register_Write(Reg_ADC,0x0000);
540 1
541 1 /* TX fifo <8字节,RX fifo > 56字节时报警, */
542 1 A7102_Register_Write(Reg_FIFO,0x4000|(C_FIFO_Byte-1));
543 1
544 1 /* MCS = 0,Manchester打开,FECS = 0,FEC打开,CRCS =0,CRC打开,IDL =1,id code =4字节,PML[1:0] = 11,前
-导4字节 */
545 1 A7102_Register_Write(Reg_Code,0x150f);
546 1
547 1 #if mode_switch
/* 打开位时钟,管脚控制收发,无载波侦测 */
C51 COMPILER V8.18 A7102 03/20/2010 16:53:38 PAGE 10
A7102_Register_Write(Reg_PinControl,0x0222);
#else
551 1 // 打开位时钟,寄存器控制收发,无载波侦测 */
552 1 A7102_Register_Write(Reg_PinControl,0x0022);
553 1 #endif
554 1
555 1 /* VTL[2:0] = 100,VTH = VDD-0.5V, VTH[2:0] = 100,VTL =0.5V */
556 1 A7102_Register_Write(Reg_Calibration,0x4886);
557 1
558 1 A7102_Register_Write(Reg_ModeControl,0x00e0); //STB2==>syn mode
559 1 //delay 80us
560 1 for(temp = 0;temp < 0xffff;temp++)
561 1 {
562 2 _nop_();
563 2 _nop_();
564 2 }
565 1 }
566 /***********************************************
567 函 数: Initialisation_RF()
568 功 能: 上电初始化A7102
569 输 入: /
570 输 出: /
571 描 述: /
572 ***********************************************/
573 void Initialisation_RF(void)
574 {
575 1 uint i;
576 1
577 1 iSPI_PowerOn = negative;
578 1 /* A7102稳定时间延迟配置 */
579 1 for(i = 0;i < 0xffff;i++)
580 1 {
581 2 _nop_();
582 2 _nop_();
583 2 _nop_();
584 2 _nop_();
585 2 }
586 1 iSPI_PowerOn = positive;
587 1 /* A7102稳定时间延迟配置 */
588 1 for(i = 0;i < 0xffff;i++)
589 1 {
590 2 _nop_();
591 2 _nop_();
592 2 _nop_();
593 2 _nop_();
594 2 }
595 1
596 1 A7102_Reset_Chip();
597 1
598 1 for(i = 0;i < 0xffff;i++)
599 1 {
600 2 _nop_();
601 2 _nop_();
602 2 _nop_();
603 2 _nop_();
604 2 }
605 1
606 1 /* XCC =1(crystal high current),XS =1(crystal on) */
607 1 /* CGS = 0,因为使用标准12.8mhz晶体 */
608 1 A7102_Register_Write(Reg_Crystal,0x0015);
609 1 for(i = 0;i < 0xffff;i++)
610 1 {
C51 COMPILER V8.18 A7102 03/20/2010 16:53:38 PAGE 11
611 2 _nop_();
612 2 _nop_();
613 2 }
614 1 /* FMT =0,normal mode,FMS =1,FIFO mode,CER = 1,RF chip 使能,PLLE = 0,使用12.8Mhz标准晶体,PLL关闭 *
-/
615 1 A7102_Register_Write(Reg_ModeControl,0x00c0); //STB1==>standby mode
616 1 //delay 0.5ms
617 1 for(i = 0;i < 0xffff;i++)
618 1 {
619 2 _nop_();
620 2 _nop_();
621 2 }
622 1 A7102_Id_Write(&id_buff);
623 1 A7102_Id_Read(&rece_buff);
624 1
625 1 A7102_Config_Chip();
626 1
627 1 TX_Freq_Calibration = A7102_Calibration_Frequency(C_Tx_Frequency);
628 1 RX_Freq_Calibration = A7102_Calibration_Frequency(C_Rx_Frequency);
629 1
630 1 /* reset fifo */
631 1 A7102_Reset_FifoRX();
632 1 A7102_Reset_FifoTX();
633 1
634 1 /* 默认接收状态 */
635 1 A7102_Status_Receiver();
636 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 830 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
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 + -