找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1709|回复: 4
打印 上一主题 下一主题
收起左侧

关于CC1101遥控距离程序调试问题 附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:421668 发表于 2022-3-23 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我用了两个CC1101模块做收发遥控,然后发射功率我设置到了最大,可是空旷距离很不理想。我看手册上说怎么也得200米,可是我的只有二三十米的样子,论坛的友友们,帮忙指点一下我的程序看看是不是哪里还是设置的不对啊。CC1101我买的现成模块,硬件电路应该没有问题。我也怀疑问题出在我的程序里面。
单片机程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define                INT8U                unsigned char
  4. #define                uchar                unsigned char

  5. #define                INT16U                unsigned int
  6. #define                uint                unsigned int

  7. sfr P3M1=0xb1;
  8. sfr P3M0=0xb2;


  9. sfr P2M1=0x95;
  10. sfr P2M0=0x96;

  11. sfr P1M1=0x91;
  12. sfr P1M0=0x92;

  13. #define ID_ADDR_ROM 0x1ff9
  14. #define ID_ADDR_RAM 0xf1

  15. #define BAUD 0XFD00   //9600bps @11.0592Mhz

  16. sfr IAP_DATA=0xc2;
  17. sfr IAP_ADDRH=0xc3;
  18. sfr IAP_ADDRL=0xc4;
  19. sfr IAP_CMD=0xc5;
  20. sfr IAP_TRIG=0xc6;
  21. sfr IAP_CONTR=0xc7;

  22. #define ENABLE_IAP                         0x82
  23. #define IAP_ADDRESS                         0x0000//前512字节
  24. #define IAP_ADDRESS2                         0x0200//后512字节

  25. #define CMD_IDLE                                 0
  26. #define CMD_READ                                1
  27. #define CMD_PROGRAM                 2
  28. #define CMD_ERASE                         3

  29. INT8U id[7]={0},flag_study=0;

  30. #define HEAD_LEN                         6


  31. #define         WRITE_BURST             0x40                                                //连续写入
  32. #define         READ_SINGLE             0x80                                                //读
  33. #define         READ_BURST              0xC0                                                //连续读
  34. #define         BYTES_IN_RXFIFO     0x7F                                                  //接收缓冲区的有效字节数
  35. #define         CRC_OK              0x80                                                 //CRC校验通过位标志

  36. //*****************************************************************************************

  37. //sbit         GDO0        =P3^3;
  38. //sbit         GDO2        =P3^2;
  39. //sbit        MISO        =P1^4;
  40. //sbit        MOSI        =P1^3;
  41. //sbit        SCK                =P1^5;
  42. //sbit        CSN                =P2^6;
  43. sbit         GDO0        =P2^7;
  44. sbit         GDO2        =P3^2;
  45. sbit        MISO        =P1^4;
  46. sbit        MOSI        =P1^3;
  47. sbit        SCK                =P1^5;
  48. sbit        CSN                =P1^0;
  49. sbit        CSN2                =P1^0;

  50. //*****************************************************************************************
  51. //sbit    KEY_start    =P2^2;         //对应KEY2 启动按键
  52. //sbit    KEY_stop    =P2^0;//对应KEY0 停止按键
  53. //sbit    KEY_up    =P2^1;  //对应KEY1 上升按键
  54. //sbit    KEY_down    =P2^3;//对应KEY3 下降按键

  55. //sbit    KEY_left    =P3^6;//对应KEY6 按键  外部中断2
  56. //sbit    KEY_right    =P3^7;//对应KEY5 按键  外部中断3
  57. //sbit    key4      =        P2^4;
  58. //sbit    key5      =        P3^7;
  59. //sbit    key6      =        P3^6;
  60. //sbit    key7      =        P3^5;


  61. sbit    KEY0    =P2^0;//停止
  62. sbit    KEY1    =P2^1;//上升
  63. sbit    KEY2    =P2^2;//启动
  64. sbit    KEY3    =P2^3;//下降



  65. //*****************************************************************************************
  66. sbit        led1=P2^5;           //指示灯LED1,低电平时亮,高电平时暗  红灯
  67. sbit        led2=P2^4;           //指示灯LED1,低电平时亮,高电平时暗 绿灯
  68. unsigned char key_up=1,key_down;
  69. unsigned char num;
  70. //***************更多功率参数设置可详细参考DATACC1100英文文档中第48-49页的参数表************
  71. //INT8U PaTabel[8] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04};  //-30dBm   功率最小
  72. //INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};  //0dBm
  73. INT8U PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};   //10dBm     功率最大
  74. //INT8U PaTabel[8] = {0xC0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00};   //10dBm     功率最大
  75. //*****************************************************************************************
  76. void SpiInit(void);
  77. void CpuInit(void);
  78. void RESET_CC1100(void);
  79. void POWER_UP_RESET_CC1100(void);
  80. void halSpiWriteReg(INT8U addr, INT8U value);
  81. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  82. void halSpiStrobe(INT8U strobe);
  83. INT8U halSpiReadReg(INT8U addr);
  84. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  85. INT8U halSpiReadStatus(INT8U addr);
  86. void halRfWriteRfSettings(void);
  87. void halRfSendPacket(INT8U *txBuffer, INT8U size);
  88. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length);  
  89. //*****************************************************************************************
  90. // CC1100 STROBE, CONTROL AND STATUS REGSITER
  91. #define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
  92. #define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
  93. #define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
  94. #define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
  95. #define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
  96. #define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
  97. #define CCxxx0_PKTLEN       0x06        // Packet length
  98. #define CCxxx0_PKTCTRL1     0x07        // Packet automation control
  99. #define CCxxx0_PKTCTRL0     0x08        // Packet automation control
  100. #define CCxxx0_ADDR         0x09        // Device address
  101. #define CCxxx0_CHANNR       0x0A        // Channel number
  102. #define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
  103. #define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
  104. #define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
  105. #define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
  106. #define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
  107. #define CCxxx0_MDMCFG4      0x10        // Modem configuration
  108. #define CCxxx0_MDMCFG3      0x11        // Modem configuration
  109. #define CCxxx0_MDMCFG2      0x12        // Modem configuration
  110. #define CCxxx0_MDMCFG1      0x13        // Modem configuration
  111. #define CCxxx0_MDMCFG0      0x14        // Modem configuration
  112. #define CCxxx0_DEVIATN      0x15        // Modem deviation setting
  113. #define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
  114. #define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
  115. #define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
  116. #define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
  117. #define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
  118. #define CCxxx0_AGCCTRL2     0x1B        // AGC control
  119. #define CCxxx0_AGCCTRL1     0x1C        // AGC control
  120. #define CCxxx0_AGCCTRL0     0x1D        // AGC control
  121. #define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
  122. #define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
  123. #define CCxxx0_WORCTRL      0x20        // Wake On Radio control
  124. #define CCxxx0_FREND1       0x21        // Front end RX configuration
  125. #define CCxxx0_FREND0       0x22        // Front end TX configuration
  126. #define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
  127. #define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
  128. #define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
  129. #define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
  130. #define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
  131. #define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
  132. #define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
  133. #define CCxxx0_PTEST        0x2A        // Production test
  134. #define CCxxx0_AGCTEST      0x2B        // AGC test
  135. #define CCxxx0_TEST2        0x2C        // Various test settings
  136. #define CCxxx0_TEST1        0x2D        // Various test settings
  137. #define CCxxx0_TEST0        0x2E        // Various test settings

  138. // Strobe commands
  139. #define CCxxx0_SRES         0x30        // Reset chip.
  140. #define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  141.                                         // If in RX/TX: Go to a wait state where only the synthesizer is
  142.                                         // running (for quick RX / TX turnaround).
  143. #define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
  144. #define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
  145.                                         // (enables quick start).
  146. #define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
  147.                                         // MCSM0.FS_AUTOCAL=1.
  148. #define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
  149.                                         // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
  150.                                         // Only go to TX if channel is clear.
  151. #define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
  152.                                         // Wake-On-Radio mode if applicable.
  153. #define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
  154. #define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
  155. #define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
  156. #define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
  157. #define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
  158. #define CCxxx0_SWORRST      0x3C        // Reset real time clock.
  159. #define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
  160.                                         // INT8Us for simpler software.

  161. #define CCxxx0_PARTNUM      0x30
  162. #define CCxxx0_VERSION      0x31
  163. #define CCxxx0_FREQEST      0x32
  164. #define CCxxx0_LQI          0x33
  165. #define CCxxx0_RSSI         0x34
  166. #define CCxxx0_MARCSTATE    0x35
  167. #define CCxxx0_WORTIME1     0x36
  168. #define CCxxx0_WORTIME0     0x37
  169. #define CCxxx0_PKTSTATUS    0x38
  170. #define CCxxx0_VCO_VC_DAC   0x39
  171. #define CCxxx0_TXBYTES      0x3A
  172. #define CCxxx0_RXBYTES      0x3B

  173. #define CCxxx0_PATABLE      0x3E
  174. #define CCxxx0_TXFIFO       0x3F
  175. #define CCxxx0_RXFIFO       0x3F

  176. // RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
  177. typedef struct S_RF_SETTINGS
  178. {
  179.         INT8U FSCTRL2;                //自已加的
  180.     INT8U FSCTRL1;   // Frequency synthesizer control.
  181.     INT8U FSCTRL0;   // Frequency synthesizer control.
  182.     INT8U FREQ2;     // Frequency control word, high INT8U.
  183.     INT8U FREQ1;     // Frequency control word, middle INT8U.
  184.     INT8U FREQ0;     // Frequency control word, low INT8U.
  185.     INT8U MDMCFG4;   // Modem configuration.
  186.     INT8U MDMCFG3;   // Modem configuration.
  187.     INT8U MDMCFG2;   // Modem configuration.
  188.     INT8U MDMCFG1;   // Modem configuration.
  189.     INT8U MDMCFG0;   // Modem configuration.
  190.     INT8U CHANNR;    // Channel number.
  191.     INT8U DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
  192.     INT8U FREND1;    // Front end RX configuration.
  193.     INT8U FREND0;    // Front end RX configuration.
  194.     INT8U MCSM0;     // Main Radio Control State Machine configuration.
  195.     INT8U FOCCFG;    // Frequency Offset Compensation Configuration.
  196.     INT8U BSCFG;     // Bit synchronization Configuration.
  197.     INT8U AGCCTRL2;  // AGC control.
  198.         INT8U AGCCTRL1;  // AGC control.
  199.     INT8U AGCCTRL0;  // AGC control.
  200.     INT8U FSCAL3;    // Frequency synthesizer calibration.
  201.     INT8U FSCAL2;    // Frequency synthesizer calibration.
  202.         INT8U FSCAL1;    // Frequency synthesizer calibration.
  203.     INT8U FSCAL0;    // Frequency synthesizer calibration.
  204.     INT8U FSTEST;    // Frequency synthesizer calibration control
  205.     INT8U TEST2;     // Various test settings.
  206.     INT8U TEST1;     // Various test settings.
  207.     INT8U TEST0;     // Various test settings.
  208.     INT8U IOCFG2;    // GDO2 output pin configuration
  209.     INT8U IOCFG0;    // GDO0 output pin configuration
  210.     INT8U PKTCTRL1;  // Packet automation control.
  211.     INT8U PKTCTRL0;  // Packet automation control.
  212.     INT8U ADDR;      // Device address.
  213.     INT8U PKTLEN;    // Packet length.
  214. } RF_SETTINGS;

  215. /////////////////////////////////////////////////////////////////
  216. const RF_SETTINGS rfSettings =
  217. {
  218.         0x00,
  219.     0x08,   // FSCTRL1   Frequency synthesizer control.
  220.     0x00,   // FSCTRL0   Frequency synthesizer control.
  221.     0x10,   // FREQ2     Frequency control word, high byte.
  222.     0xA7,   // FREQ1     Frequency control word, middle byte.
  223.     0x62,   // FREQ0     Frequency control word, low byte.
  224. //    0x5B,   // MDMCFG4   Modem configuration.
  225. //    0xF8,   // MDMCFG3   Modem configuration.
  226.           0x5B,   // MDMCFG4   
  227.     0xE4,   // MDMCFG3   
  228.     0x03,   // MDMCFG2   Modem configuration.
  229.     0x22,   // MDMCFG1   Modem configuration.
  230.     0xF8,   // MDMCFG0   Modem configuration.

  231.     0x00,   // CHANNR    Channel number.
  232.     0x47,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
  233.     0xB6,   // FREND1    Front end RX configuration.
  234.     0x10,   // FREND0    Front end RX configuration.
  235.     0x18,   // MCSM0     Main Radio Control State Machine configuration.
  236.     0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
  237.     0x1C,   // BSCFG     Bit synchronization Configuration.
  238.     0xC7,   // AGCCTRL2  AGC control.
  239.     0x00,   // AGCCTRL1  AGC control.
  240.     0xB2,   // AGCCTRL0  AGC control.

  241.     0xEA,   // FSCAL3    Frequency synthesizer calibration.
  242.     0x2A,   // FSCAL2    Frequency synthesizer calibration.
  243.     0x00,   // FSCAL1    Frequency synthesizer calibration.
  244.     0x11,   // FSCAL0    Frequency synthesizer calibration.
  245.     0x59,   // FSTEST    Frequency synthesizer calibration.
  246.     0x81,   // TEST2     Various test settings.
  247.     0x35,   // TEST1     Various test settings.
  248.     0x09,   // TEST0     Various test settings.
  249.     0x0B,   // IOCFG2    GDO2 output pin configuration.
  250.     0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

  251.     0x04,   // PKTCTRL1  Packet automation control.
  252.     0x05,   // PKTCTRL0  Packet automation control.
  253.     0x00,   // ADDR      Device address.
  254.     0x0c    // PKTLEN    Packet length.
  255. };
  256. //*****************************************************************************************
  257. //函数名:delay(unsigned int s)
  258. //输入:时间
  259. //输出:无
  260. //功能描述:普通廷时,内部用
  261. //*****************************************************************************************               
  262. static void delay(unsigned int s)
  263. {
  264.         unsigned int i;
  265.         for(i=0; i<s; i++);
  266.         for(i=0; i<s; i++);
  267. }


  268. void delay1ms(int t)//误差0.434028 us
  269. {
  270.   unsigned char i=0,j=0,m=0;
  271.   for(m=t;m>0;m--)
  272.   for(i=55;i>0;i--)
  273.     for(j=53;j>0;j--);
  274. }
  275. void delay1s(uchar t)//误差1.000000 us
  276. {//6倍速
  277.   unsigned char i=0,j=0,k=0,m=0;
  278.   for(m=t;m>0;m--)
  279.   for(i=66;i>0;i--)
  280.     for(j=218;j>0;j--)
  281.     for(k=207;k>0;k--);
  282. }
  283. void delay12us()//误差0.234375 us
  284. {
  285.   unsigned char i=0;
  286.   for(i=33;i>0;i--);
  287. }


  288. void IapIdle()
  289. {
  290.         IAP_CONTR=0;//关闭IAP功能
  291.         IAP_CMD=0;//清除命令寄存器
  292.         IAP_TRIG=0;//清除触发寄存器
  293.         IAP_ADDRH=0x80;//将地址设置到非IAP区域
  294.         IAP_ADDRL=0;
  295. }

  296. uchar IapReadByte(uint addr)
  297. {
  298.         uchar dat;
  299.         IAP_CONTR=ENABLE_IAP;//使能IAP
  300.         IAP_CMD=CMD_READ;//设置IAP命令
  301.         IAP_ADDRL=addr;//设置IAP低地址
  302.         IAP_ADDRH=addr>>8;//设置IAP高地址
  303.         IAP_TRIG=0x5a;//写触发命令
  304.         IAP_TRIG=0xa5;
  305.         _nop_();//等待操作完成
  306.         dat=IAP_DATA;//读数据
  307.         IapIdle();
  308.         return dat;
  309. }

  310. void IapProgramByte(uint addr,uchar dat)
  311. {
  312.         IAP_CONTR=ENABLE_IAP;//使能IAP
  313.         IAP_CMD=CMD_PROGRAM;//设置IAP命令
  314.         IAP_ADDRL=addr;//设置IAP低地址
  315.         IAP_ADDRH=addr>>8;//设置IAP高地址
  316.         IAP_DATA=dat;//写IAP数据
  317.         IAP_TRIG=0x5a;//写触发命令
  318.         IAP_TRIG=0xa5;
  319.         _nop_();//等待操作完成
  320.         IapIdle();
  321. }

  322. void IapEraseSector(uint addr)
  323. {
  324.         IAP_CONTR=ENABLE_IAP;//使能IAP
  325.         IAP_CMD=CMD_ERASE;//设置IAP命令
  326.         IAP_ADDRL=addr;//设置低地址
  327.         IAP_ADDRH=addr>>8;//设置高地址
  328.         IAP_TRIG=0x5a;//写触发命令
  329.         IAP_TRIG=0xa5;

  330.         _nop_();//等待操作完成
  331.         IapIdle();
  332. }


  333. void SaveData(uchar *dat,uchar len)
  334. {
  335.         uchar i=0;
  336.         IapEraseSector(IAP_ADDRESS);
  337.         for(i=0;i<len;i++)
  338.         {
  339.                 IapProgramByte(IAP_ADDRESS+i,dat[i]);
  340.                 delay1ms(1);
  341.         }
  342. }


  343. void halWait(INT16U timeout) {
  344.     do {
  345.         _nop_();
  346.                 _nop_();
  347.                 _nop_();
  348.                 _nop_();
  349.                 _nop_();
  350.                 _nop_();
  351.                 _nop_();
  352.                 _nop_();
  353.                 _nop_();
  354.                 _nop_();
  355.                 _nop_();
  356.                 _nop_();
  357.                 _nop_();
  358.                 _nop_();
  359.                 _nop_();
  360.     } while (--timeout);
  361. }


  362. void SpiInit(void)
  363. {
  364.         CSN=0;
  365.         SCK=0;
  366.         CSN=1;
  367. }

  368. /*****************************************************************************************
  369. //函数名:CpuInit()
  370. //输入:无
  371. //输出:无
  372. //功能描述:SPI初始化程序
  373. /*****************************************************************************************/
  374. void CpuInit(void)
  375. {
  376.         SpiInit();
  377.         delay(5000);
  378. }
  379.         

  380. //*****************************************************************************************
  381. //函数名:SpisendByte(INT8U dat)
  382. //输入:发送的数据
  383. //输出:无
  384. //功能描述:SPI发送一个字节
  385. //*****************************************************************************************
  386. INT8U SpiTxRxByte(INT8U dat)
  387. {
  388.         INT8U i,temp;
  389.         temp = 0;
  390.         
  391.         SCK = 0;
  392.         for(i=0; i<8; i++)
  393.         {
  394.                 if(dat & 0x80)
  395.                 {
  396.                         MOSI = 1;
  397.                 }
  398.                 else MOSI = 0;
  399.                 dat <<= 1;

  400.                 SCK = 1;
  401.                 _nop_();
  402.                 _nop_();

  403.                 temp <<= 1;
  404.                 if(MISO)temp++;
  405.                 SCK = 0;
  406.                 _nop_();
  407.                 _nop_();        
  408.         }
  409.         return temp;
  410. }

  411. //*****************************************************************************************
  412. //函数名:void RESET_CC1100(void)
  413. //输入:无
  414. //输出:无
  415. //功能描述:复位CC1100
  416. //*****************************************************************************************
  417. void RESET_CC1100(void)
  418. {
  419.         CSN = 0;
  420.         while (MISO);
  421.     SpiTxRxByte(CCxxx0_SRES);                 //写入复位命令
  422.         while (MISO);
  423.     CSN = 1;
  424. }

  425. //*****************************************************************************************
  426. //函数名:void POWER_UP_RESET_CC1100(void)
  427. //输入:无
  428. //输出:无
  429. //功能描述:上电复位CC1100
  430. //*****************************************************************************************
  431. void POWER_UP_RESET_CC1100(void)
  432. {
  433.         CSN = 1;
  434.         halWait(1);
  435.         CSN = 0;
  436.         halWait(1);
  437.         CSN = 1;
  438.         halWait(41);
  439.         RESET_CC1100();                   //复位CC1100
  440. }

  441. //*****************************************************************************************
  442. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  443. //输入:地址和配置字
  444. //输出:无
  445. //功能描述:SPI写寄存器
  446. //*****************************************************************************************
  447. void halSpiWriteReg(INT8U addr, INT8U value)
  448. {
  449.     CSN = 0;
  450.     while (MISO);
  451.     SpiTxRxByte(addr);                //写地址
  452.     SpiTxRxByte(value);                //写入配置
  453.     CSN = 1;
  454. }

  455. //*****************************************************************************************
  456. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  457. //输入:地址,写入缓冲区,写入个数
  458. //输出:无
  459. //功能描述:SPI连续写配置寄存器
  460. //*****************************************************************************************
  461. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  462. {
  463.     INT8U i, temp;
  464.         temp = addr | WRITE_BURST;
  465.     CSN = 0;
  466.     while (MISO);
  467.     SpiTxRxByte(temp);
  468.     for (i = 0; i < count; i++)
  469.          {
  470.         SpiTxRxByte(buffer[i]);
  471.     }
  472.     CSN = 1;
  473. }

  474. //*****************************************************************************************
  475. //函数名:void halSpiStrobe(INT8U strobe)
  476. //输入:命令
  477. //输出:无
  478. //功能描述:SPI写命令
  479. //*****************************************************************************************
  480. void halSpiStrobe(INT8U strobe)
  481. {
  482.     CSN = 0;
  483.     while (MISO);
  484.     SpiTxRxByte(strobe);                //写入命令
  485.     CSN = 1;
  486. }





  487. //*****************************************************************************************
  488. //函数名:INT8U halSpiReadReg(INT8U addr)
  489. //输入:地址
  490. //输出:该寄存器的配置字
  491. //功能描述:SPI读寄存器
  492. //*****************************************************************************************
  493. INT8U halSpiReadReg(INT8U addr)
  494. {
  495.         INT8U temp, value;
  496.     temp = addr|READ_SINGLE;//读寄存器命令
  497.         CSN = 0;
  498.         while (MISO);
  499.         SpiTxRxByte(temp);
  500.         value = SpiTxRxByte(0);
  501.         CSN = 1;
  502.         return value;
  503. }


  504. //*****************************************************************************************
  505. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  506. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  507. //输出:无
  508. //功能描述:SPI连续写配置寄存器
  509. //*****************************************************************************************
  510. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  511. {
  512.     INT8U i,temp;
  513.         temp = addr | READ_BURST;                //写入要读的配置寄存器地址和读命令
  514.     CSN = 0;
  515.     while (MISO);
  516.         SpiTxRxByte(temp);   
  517.     for (i = 0; i < count; i++)
  518.         {
  519.         buffer[i] = SpiTxRxByte(0);
  520.     }
  521.     CSN = 1;
  522. }


  523. //*****************************************************************************************
  524. //函数名:INT8U halSpiReadReg(INT8U addr)
  525. //输入:地址
  526. //输出:该状态寄存器当前值
  527. //功能描述:SPI读状态寄存器
  528. //*****************************************************************************************
  529. INT8U halSpiReadStatus(INT8U addr)
  530. {
  531.     INT8U value,temp;
  532.         temp = addr | READ_BURST;                //写入要读的状态寄存器的地址同时写入读命令
  533.     CSN = 0;
  534.     while (MISO);
  535.     SpiTxRxByte(temp);
  536.         value = SpiTxRxByte(0);
  537.         CSN = 1;
  538.         return value;
  539. }
  540. //*****************************************************************************************
  541. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  542. //输入:无
  543. //输出:无
  544. //功能描述:配置CC1100的寄存器
  545. //*****************************************************************************************
  546. void halRfWriteRfSettings(void)
  547. {

  548.         halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);//自已加的
  549.     // Write register settings
  550.     halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
  551.     halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
  552.     halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
  553.     halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
  554.     halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
  555.     halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
  556.     halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
  557.     halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
  558.     halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
  559.     halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
  560.     halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
  561.     halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
  562.     halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
  563.     halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
  564.     halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
  565.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
  566.     halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
  567.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  568.         halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  569.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  570.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
  571.         halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
  572.         halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
  573.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
  574.     halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
  575.     halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
  576.     halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
  577.     halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
  578.     halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
  579.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);   
  580.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  581.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  582.     halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
  583.     halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
  584. }

  585. //*****************************************************************************************
  586. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  587. //输入:发送的缓冲区,发送数据个数
  588. //输出:无
  589. //功能描述:CC1100发送一组数据
  590. //*****************************************************************************************

  591. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  592. {
  593.         halSpiWriteReg(CCxxx0_TXFIFO, size);
  594.         
  595.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);        //写入要发送的数据
  596.         
  597.     halSpiStrobe(CCxxx0_STX);                //进入发送模式发送数据

  598.     // Wait for GDO0 to be set -> sync transmitted
  599.     while (!GDO0);
  600.     // Wait for GDO0 to be cleared -> end of packet

  601.     while (GDO0);
  602. //                 led1=1;
  603.         halSpiStrobe(CCxxx0_SFTX);
  604.         
  605. }


  606. void setRxMode(void)
  607. {
  608.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  609. }

  610. /*
  611. // Bit masks corresponding to STATE[2:0] in the status byte returned on MISO
  612. #define CCxx00_STATE_BM                 0x70
  613. #define CCxx00_FIFO_BYTES_AVAILABLE_BM  0x0F
  614. #define CCxx00_STATE_TX_BM              0x20
  615. #define CCxx00_STATE_TX_UNDERFLOW_BM    0x70
  616. #define CCxx00_STATE_RX_BM              0x10
  617. #define CCxx00_STATE_RX_OVERFLOW_BM     0x60
  618. #define CCxx00_STATE_IDLE_BM            0x00

  619. static INT8U RfGetRxStatus(void)
  620. {
  621.         INT8U temp, spiRxStatus1,spiRxStatus2;
  622.         INT8U i=4;// 循环测试次数
  623.     temp = CCxxx0_SNOP|READ_SINGLE;//读寄存器命令
  624.         CSN = 0;
  625.         while (MISO);
  626.         SpiTxRxByte(temp);
  627.         spiRxStatus1 = SpiTxRxByte(0);
  628.         do
  629.         {
  630.                 SpiTxRxByte(temp);
  631.                 spiRxStatus2 = SpiTxRxByte(0);
  632.                 if(spiRxStatus1 == spiRxStatus2)
  633.                 {
  634.                         if( (spiRxStatus1 & CCxx00_STATE_BM) == CCxx00_STATE_RX_OVERFLOW_BM)
  635.                         {
  636.                halSpiStrobe(CCxxx0_SFRX);
  637.                            return 0;
  638.                         }
  639.                     return 1;
  640.                 }
  641.                  spiRxStatus1=spiRxStatus2;
  642.         }
  643.         while(i--);
  644.         CSN = 1;
  645.     return 0;        
  646. }
  647. */
  648. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
  649. {
  650.     INT8U status[2];
  651.     INT8U packetLength;
  652.         INT8U i=(*length)*4;  // 具体多少要根据datarate和length来决定

  653.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  654.         //delay(5);
  655.     //while (!GDO1);
  656.     //while (GDO1);
  657.         delay(2);
  658.         while (GDO0)
  659.         {
  660.                 delay(2);
  661.                 --i;
  662.                 if(i<1)
  663.                    return 0;            
  664.         }         
  665.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  666.         {
  667.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  668.         if (packetLength <= *length)                 //如果所要的有效数据长度小于等于接收到的数据包的长度
  669.                 {
  670.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  671.             *length = packetLength;                                //把接收数据长度的修改为当前数据的长度

  672.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  673.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
  674.                         halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  675.             return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
  676.         }
  677.                  else
  678.                 {
  679.             *length = packetLength;
  680.             halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  681.             return 0;
  682.         }
  683.     }
  684.         else
  685.          return 0;
  686. }
  687. /*
  688. void Delay(unsigned int s)
  689. {
  690.         unsigned int i;
  691.         for(i=0; i<s; i++);
  692.         for(i=0; i<s; i++);
  693. }

  694. */
  695. //uchar key_scan()
  696. //{
  697. //        //上升、下降
  698. // if((KEY1==0))   //第一次 key_up=1 此时如果有操作按键按下则执行下面的程序||key3==0key_up&&
  699. // {
  700. //  delay1ms(10);         //延时小豆
  701. //  if((KEY1==0))   //||key3==0key_up&&
  702. //  {
  703. ////   key_up=0;  //松手标志位0 那么下次检测, if 结果就为0 则就不会执行这里的语句
  704. ////
  705. ////   key_down=1;  //按键被按下标志  最后如果按键松手,那么还应该发送一个数据出去执行关闭
  706. //
  707. ////   if(KEY1==0)  //
  708. //    return 1;
  709. ////   if(key3==0)
  710. ////    return 3;
  711. //  }  
  712. // }
  713. // else
  714. //// if(KEY1!=0)   //上升下降  按键都没有被按下&&key3==1
  715. // {
  716. ////  key_up=1;  //必须所有按键都没有被按下    松手标志初始化
  717. ////     if(key_down==1)   //这里判断按键是否按下过,按下过就发送一个数据过去关闭之前的输出
  718. ////  {
  719. ////   key_down=0;   //初始化
  720. //   return 99;    //返回值
  721. ////  }
  722. // }
  723. //
  724. //}
  725. void main(void)
  726. {
  727. //  P2M1=0x0f;
  728. //  P2M0=0x00;
  729.         INT8U leng =8,i=0,mode=0,cont=0,offset=0,flag1=0,key_num,tf1=0,key_down1=0,key_down=0;
  730.         INT8U tf =0;
  731. //        INT8U DS_UP=0;DS_STOP=0;DS_DOWN=0;
  732.         INT8U TxBuf[8]={0};         // 8字节, 如果需要更长的数据包,请正确设置
  733.         INT8U RxBuf[8]={0};        
  734.         INT8U code *cptr;
  735.         INT8U idata *iptr;
  736.         cptr=ID_ADDR_ROM;
  737.         iptr=ID_ADDR_RAM;
  738.         for(i=0;i<7;i++)
  739.                 id[i]=cptr[i];
  740.         //id[6]=3;

  741.         P1M1=0x00;
  742.         P1M0=0x01;
  743.         //P2M1=0x40;
  744.         //P2M0=0x40;

  745.         CpuInit();
  746.         POWER_UP_RESET_CC1100();
  747.         halRfWriteRfSettings();
  748.         halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
  749.         TxBuf[1]=1;TxBuf[2]=0;led1=1;//;led5=0
  750.         //halRfSendPacket(TxBuf,8);        // Transmit Tx buffer data
  751.     INT1=1;
  752.         IT1=1;
  753.         EX1=1;  //开启外部中断1
  754.     EA=1;  
  755.     TL1 = BAUD;
  756.     TH1 = BAUD >> 8;
  757.         
  758.         
  759.         
  760.         
  761.     TR1 = 1;
  762.     ET1 = 1;
  763.     PT1 = 1;
  764. //        EX0=1;        //开启外部中断0
  765.         
  766.     TMOD=0x01;        //T0方式为1   16位
  767.         TH0=(65536-50000)/256;
  768.         TL0=(65536-50000)%256;           //50000*12*(1/12M)=50ms

  769.         TR0=1;           //启动定时器T0
  770.         ET0=1; //使能定时器T0中断
  771. //  key_up=0;
  772.         delay1s(3);
  773. //  P2M1=0x0f;
  774. //  P2M0=0x00;
  775.         
  776.         if(KEY0==0)
  777.         {
  778.                 delay1ms(10);
  779.                 if(KEY0==0)
  780.                         mode=1;//学习模式
  781.      led1=0;//亮        
  782.                 delay1ms(10);
  783.                  led1=1;//亮        
  784.         }

  785.         offset=0;
  786.         TxBuf[offset++]=0xaa;//普通数据
  787.         TxBuf[offset++]=0xbb;
  788.         TxBuf[offset++]=id[3];
  789.         TxBuf[offset++]=id[4];
  790.         TxBuf[offset++]=id[5];
  791.         TxBuf[offset++]=id[6];


  792.         //输入模式
  793. //        P2M0 = 0x00;
  794. //        P2M1 = 0x0F;   
  795.         while(1)
  796.         {
  797.                 //接收端
  798.                    /*if(halRfReceivePacket(RxBuf,&leng))
  799.                 {
  800.                
  801.                    }*/

  802.                 //发送端
  803.                
  804.                 if(mode==1)
  805.                 {//
  806.                         if((KEY0==0)&&(KEY3==0))
  807.                         {
  808.                                 delay1ms(10);
  809.                                 if((KEY0==0)&&(KEY3==0))
  810.                                 {
  811.                                         if(cont<4)
  812.                                         {
  813.                                                 cont++;
  814.                                         }
  815.                                 }
  816. //                                while((KEY0==0)&&(KEY3==0));
  817.                         }
  818.                         if(cont==4)
  819.                         {
  820.                                 led1=0;//亮        
  821.                                 offset=0;
  822.                                 TxBuf[offset++]=0xff;//识别码标志
  823.                                 TxBuf[offset++]=0xff;
  824.                                 TxBuf[offset++]=id[3];
  825.                                 TxBuf[offset++]=id[4];
  826.                                 TxBuf[offset++]=id[5];
  827.                                 TxBuf[offset++]=id[6];
  828.                                 halRfSendPacket(TxBuf,8);
  829.                                 delay1ms(200);
  830.                                 led1=1;//熄灭
  831.                                 delay1ms(200);
  832. //                                mode=0;
  833.                         }
  834.                 }
  835.                 else
  836.                 {//正常模式 发送按键数据
  837. //                        if(key_up&&KEY1==0)//第一次key_up==1;那么如果其他按键有按下,则为真,执行下面程序
  838.                         if(((KEY1==1)&&(KEY3==1))&&(KEY2!=0))//点动上升
  839.                         {
  840.                                 delay1ms(50);
  841.                                         if(((KEY1==1)&&(KEY3==1))&&(KEY2!=0))
  842.                                         {               
  843.           TxBuf[1]=0xa1;
  844.                                                 tf1=1;        
  845.             key_down=0;               
  846.             key_down1=0;
  847.                                                 ET0=1;
  848.                                                 
  849.                                  }
  850.       }        
  851.                         else if((KEY1==0)&&(key_down1==0))
  852.                                 {
  853.                                         delay1ms(50);
  854.                                         if(KEY1==0)
  855.                                         {                                
  856.                   TxBuf[1]=0xb1;
  857.                                                 tf1=1;
  858.                                                 key_down=1;
  859.                                                 ET0=0;
  860.                                                  led2=0;//亮        
  861.                                                 delay1ms(30);
  862.                                                  led2=1;//亮        
  863.           }                                
  864.          }
  865.                                 
  866. //                                if(KEY3==1)//点动下降
  867. //                        {
  868. //                                delay1ms(50);
  869. //                                        if(KEY3==1)
  870. //                                        {               
  871. //            TxBuf[1]=0xa2;
  872. //                                                tf1=1;        
  873. //            key_down1=0;                                                
  874. //                                 }
  875. //      }        
  876.                         else if((KEY3==0)&&(key_down==0))
  877.                                 {
  878.                                         delay1ms(50);
  879.                                         if(KEY3==0)
  880.                                         {                                
  881.                   TxBuf[1]=0xb2;
  882.                                                 tf1=1;
  883.                                                 key_down1=1;
  884.                                                 ET0=0;
  885.                                                  led2=0;//亮        
  886.                                                 delay1ms(30);
  887.                                                  led2=1;//亮        
  888.           }                                
  889.          }
  890.                         if(KEY0==0)//停止
  891.                         {
  892.                         delay1ms(50);
  893.                         if(KEY0==0)
  894.                         {
  895.                    TxBuf[1]=0xcc;
  896.                          tf1=1;               
  897.                                 ET0=1;
  898.                                 led2=0;//亮        
  899.                         delay1ms(30);
  900.                          led2=1;//亮        
  901.                         }
  902.                         }
  903.                         if(KEY2==0)//启动
  904.                         {
  905.                         delay1ms(50);
  906.                         if(KEY2==0)
  907.                         {
  908.                    TxBuf[1]=0xc5;
  909.                          tf1=1;               
  910.        ET0=1;
  911.                                                                                  led2=0;//亮        
  912.                                                 delay1ms(30);
  913.                                                  led2=1;//亮        
  914.                         }
  915.                         }
  916.                                  
  917.                                  if (tf1==1)
  918.                                  {
  919.                                   TxBuf[HEAD_LEN]=2;
  920.                                         halRfSendPacket(TxBuf,8);        
  921.                                          tf1=0;
  922.                         
  923.          }
  924.                                  
  925.         }
  926.            if(num>=80)
  927.            {
  928.                 halSpiStrobe(CCxxx0_SIDLE);        //进入空闲模式
  929.                 halSpiStrobe(CCxxx0_SXOFF);        
  930.                 halSpiStrobe(CCxxx0_SPWD);    //关闭无线模块
  931.                         _nop_();
  932.                         _nop_();
  933.                         _nop_();
  934.            num=0;
  935. //           led2=0;
  936.             ET0=0;
  937.                 delay(500);
  938. //                led1=0;

  939.                 PCON=0X02; //PD=1,进入掉电模式        //PCON=0X01;//IDL=1,进入空闲模式
  940.                 _nop_();
  941.                 _nop_();
  942.                 _nop_();           
  943.            }
  944.                  
  945. }
  946. }

  947. void exint1()  interrupt 2
  948. {
  949.          PCON=0;        
  950. //        led1=1;
  951. }

  952. void timer0()  interrupt 1
  953. {
  954.         TH0=(65536-50000)/256;
  955.         TL0=(65536-50000)%256;           //50000*12*(1/12M)=50ms

  956.     num++;//每50ms加1


  957. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:385830 发表于 2022-3-23 11:51 | 只看该作者
你应该把手册也发上来,你这样还得让人自己下载浪费时间啊。
回复

使用道具 举报

板凳
ID:584814 发表于 2022-3-23 12:00 | 只看该作者
接发不正常,多是软件问题;
接发功率不够,多是硬件问题。
回复

使用道具 举报

地板
ID:45879 发表于 2022-3-23 14:42 | 只看该作者
C1101模块卖家应该有调试好的程序,试试他的程序;
要是测距离,程序把功率开到最大,做个一直发的主机,从机一直接收,收到对应的数据后灯闪烁。(发送的数据包不要太大)
你天线如何处理的?上个图
回复

使用道具 举报

5#
ID:421668 发表于 2022-3-23 16:30 | 只看该作者
yueguang3048 发表于 2022-3-23 14:42
C1101模块卖家应该有调试好的程序,试试他的程序;
要是测距离,程序把功率开到最大,做个一直发的主机, ...

用了他们给的程序测试了也是距离不够。我也怀疑过是不是电线设置不对。我的电线就是买的模块带的弹簧电线。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表