CheckTune.c
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:4k
源码类别:

网络

开发平台:

Others

  1. #include <stdio.h>
  2. enum {
  3.   IF = 150000,
  4.   FREQ_MIN = 4194304,
  5.   FREQ_MAX = 16751615
  6. };
  7. const uint32_t FRefTbl[9] = {2457600,
  8.      2106514,
  9.      1843200,
  10.      1638400,
  11.      1474560,
  12.      1340509,
  13.      1228800,
  14.      1134277,
  15.      1053257};
  16. const uint16_t CorTbl[9] = {1213,
  17.     1416,
  18.     1618,
  19.     1820,
  20.     2022,
  21.     2224,
  22.     2427,
  23.     2629,
  24.     2831};
  25. const uint16_t FSepTbl[9] = {0x1AA,
  26.      0x1F1,
  27.      0x238,
  28.      0x280,
  29.      0x2C7,
  30.      0x30E,
  31.      0x355,
  32.      0x39C,
  33.      0x3E3};
  34.   uint32_t cc1000ComputeFreq(uint32_t desiredFreq) {
  35.     uint32_t ActualChannel = 0;
  36.     uint32_t RXFreq = 0, TXFreq = 0;
  37.     int32_t Offset = 0x7fffffff;
  38.     uint16_t FSep = 0;
  39.     uint8_t RefDiv = 0;
  40.     uint8_t i;
  41.     for (i = 0; i < 9; i++) {
  42.       uint32_t NRef = ((desiredFreq + IF));
  43.       uint32_t FRef = FRefTbl[i];
  44.       uint32_t Channel = 0;
  45.       uint32_t RXCalc = 0, TXCalc = 0;
  46.       int32_t  diff;
  47.       NRef = ((desiredFreq + IF) << 2) / FRef;
  48.       if (NRef & 0x1) {
  49.   NRef++;
  50.       }
  51.       if (NRef & 0x2) {
  52. RXCalc = 16384 >> 1;
  53. Channel = FRef >> 1;
  54.       }
  55.       NRef >>= 2;
  56.       RXCalc += (NRef * 16384) - 8192;
  57.       if ((RXCalc < FREQ_MIN) || (RXCalc > FREQ_MAX)) 
  58. continue;
  59.     
  60.       TXCalc = RXCalc - CorTbl[i];
  61.       if ((TXCalc < FREQ_MIN) || (TXCalc > FREQ_MAX)) 
  62. continue;
  63.       Channel += (NRef * FRef);
  64.       Channel -= IF;
  65.       diff = Channel - desiredFreq;
  66.       if (diff < 0)
  67. diff = 0 - diff;
  68.       if (diff < Offset) {
  69. RXFreq = RXCalc;
  70. TXFreq = TXCalc;
  71. ActualChannel = Channel;
  72. FSep = FSepTbl[i];
  73. RefDiv = i + 6;
  74. Offset = diff;
  75.       }
  76.     }
  77.     if (RefDiv != 0) {
  78.       
  79.       printf("DesiredFreq(Hz)tActualFreq(Hz)tOffset(Hz)tFREQAttFREQBttFSEPtREFDIVn");
  80.       printf("%dt",desiredFreq);
  81.       printf("%dt",ActualChannel);
  82.       printf("%dtt",Offset);
  83.       printf("0x%lxt",RXFreq);
  84.       printf("0x%lxt",TXFreq);
  85.       printf("0x%lxt",FSep);
  86.       printf("%dn",RefDiv);
  87. #if 0      
  88.       // FREQA
  89.       gCurrentParameters[0x3] = (uint8_t)((RXFreq) & 0xFF);  // LSB
  90.       gCurrentParameters[0x2] = (uint8_t)((RXFreq >> 8) & 0xFF);
  91.       gCurrentParameters[0x1] = (uint8_t)((RXFreq >> 16) & 0xFF);  // MSB
  92.       // FREQB
  93.       gCurrentParameters[0x6] = (uint8_t)((TXFreq) & 0xFF); // LSB
  94.       gCurrentParameters[0x5] = (uint8_t)((TXFreq >> 8) & 0xFF);
  95.       gCurrentParameters[0x4] = (uint8_t)((TXFreq >> 16) & 0xFF);  // MSB
  96.       // FSEP
  97.       gCurrentParameters[0x8] = (uint8_t)((FSep) & 0xFF);  // LSB
  98.       gCurrentParameters[0x7] = (uint8_t)((FSep >> 8) & 0xFF); //MSB
  99.       if (ActualChannel < 500000000) {
  100. if (ActualChannel < 400000000) {
  101. // CURRENT (RX)
  102.   gCurrentParameters[0x9] = ((8 << CC1K_VCO_CURRENT) | (1 << CC1K_LO_DRIVE));
  103. // CURRENT (TX)
  104.   gCurrentParameters[0x1d] = ((9 << CC1K_VCO_CURRENT) | (1 << CC1K_PA_DRIVE));
  105. }
  106. else {
  107. // CURRENT (RX)
  108.   gCurrentParameters[0x9] = ((4 << CC1K_VCO_CURRENT) | (1 << CC1K_LO_DRIVE));
  109. // CURRENT (TX)
  110.   gCurrentParameters[0x1d] = ((8 << CC1K_VCO_CURRENT) | (1 << CC1K_PA_DRIVE));
  111. }
  112. // FRONT_END
  113. gCurrentParameters[0xa] = (1 << CC1K_IF_RSSI); 
  114. // MATCH
  115. gCurrentParameters[0x12] = (7 << CC1K_RX_MATCH);
  116.       }
  117.       else {
  118. // CURRENT (RX)
  119.   gCurrentParameters[0x9] = ((8 << CC1K_VCO_CURRENT) | (3 << CC1K_LO_DRIVE));
  120. // CURRENT (TX)
  121.   gCurrentParameters[0x1d] = ((15 << CC1K_VCO_CURRENT) | (3 << CC1K_PA_DRIVE));
  122. // FRONT_END
  123. gCurrentParameters[0xa] = ((1<<CC1K_BUF_CURRENT) | (2<<CC1K_LNA_CURRENT) | 
  124.  (1<<CC1K_IF_RSSI));
  125. // MATCH
  126. gCurrentParameters[0x12] = (2 << CC1K_RX_MATCH);
  127.       }
  128.       // PLL
  129.       gCurrentParameters[0xc] = (RefDiv << CC1K_REFDIV);
  130. #endif
  131.     }
  132.     //gCurrentChannel = ActualChannel;
  133.     return ActualChannel;
  134.   }
  135. int main(int argc, char **argv) {
  136.   uint32_t DesiredFreq;
  137.   uint32_t ActualFreq;
  138.   if (argc < 2) {
  139.     printf ("Usage: %s <frequency(Hz)>n",argv[0]);
  140.     return 0;
  141.   }
  142.   DesiredFreq = atoi(argv[1]);
  143.   ActualFreq = cc1000ComputeFreq(DesiredFreq);
  144.   return 0;
  145. }