圣源电子制作

 找回密码
 立即注册
查看: 5728|回复: 0
打印 上一主题 下一主题

CC1101模块_资料 无线收发模块-无线232-无线PC遥控-无线温度传感器-无线计数器-C程序

[复制链接]
跳转到指定楼层
楼主
发表于 2011-10-25 23:43:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序包含    无线收发模块-无线232-无线PC遥控-无线温度传感器-无线计数器-无线比赛计分牌功能设计   C程序源

应用范围
􀁺 运行于 470/950 MHz ISM/SRD 频带的超低功耗无线应用
􀁺 无线传感网络
􀁺 家庭和楼宇自动化
􀁺 高级抄表架构 (AMI)
􀁺 无线计量
􀁺 无线告警和安全系统
产品描述
CC1100E 是一款 Sub-GHz 高性能射频收发器,设计旨在用于极低功耗 RF
应用。其主要针对工业、科研和医疗 (ISM) 以及 470-510 MHz 和 950-960
MHz 频带的短距离无线通信设备 (SRD)。CC1100E 特别适合于那些针对日本
ARIB STD-T96 标准和中国 470-510 MHz 短距离通信设备的无线应用。
CC1100E 在代码、封装和外引脚方面均与 CC1101[1] 和 CC1100 [2] RF 收发
器兼容。CC1100E、CC1101 以及 CC1100 均支持互补频带,可用于全球最为
常用的开放式低于 1 GHz 频率的 RF 设计:
􀁺 CC1100E:470-510 MHz 和 950-960 MHz
􀁺 CC1101:300-348 MHz,387-464 MHz 和 779-928 MHz
􀁺 CC1100:300-348 MHz,400-464 MHz 和 800-928 MHz
CC1100E RF 收发器与一个高度可配置的基带调制解调器集成在一起。该调制
解调器支持各种调制格式,并且拥有高达 500 kBaud 的可配置数据速率。
CC1100E 可提供对数据包处理、数据缓冲、突发传输、空闲信道评估、链路质
量指示以及无线唤醒的广泛硬件支持。
我们可通过一个 SPI 接口对 CC1100E 的主要运行参数和 64 字节发送/接收
FIFO 进行控制。一个典型的系统中,CC1100E 通常会与一颗微控制器以及少
数附加无源组件一起使用。
在没有事先得到德州仪器 (TI) 书面许可的情况下,不得将该产品用于下列任何产品或系统中:
(1)植入式心律管理系统,包括无限制起搏器、除颤器和心脏再同步设备,
(2)直接与一个或多个植入式医疗设备通信的外部心律管理系统;或
(3)用于监控或治疗心脏功能的其它设备,包括无限制压力传感器、生物化学传感器和神经刺激器。


CC1100E
关键特性
RF 性能
􀁺 高灵敏度(1.2 kBaud、480 MHz、1% 误包率条件下为 –112 dBm)
􀁺 低电流消耗(1.2 kBaud、480 MHz 下 RX 中为 15.5 mA)
􀁺 所有支持频率下高达 +10dBm 的可编程输出功率
􀁺 卓越的接收机选择性和阻断性能
􀁺 1.2 到 500kBaud 的可编程数据速率
􀁺 频带:470-510 MHz 和 950- 960 MHz
模拟特性
􀁺 支持 2-FSK、GFSK、MSK 以及 OOK,灵活的 ASK 波形整形
􀁺 快速的锁定频率合成器以及 90 μs 的建立时间使其适合于许多跳频系统。
􀁺 使用自动频率补偿 (AFC) 将频率合成器调整到实际接收信号中心频率
􀁺 集成的模拟温度传感器
数字特性
􀁺 提供对数据包导向系统的灵活支持;同步字检测、地址校验、灵活的数据包
长度以及自动 CRC 处理的片上支持
􀁺 高效的 SPI 接口;利用一次“突发”数据传输便可对所有寄存器进行编程
􀁺 数字 RSSI 输出
􀁺 可编程信道滤波器带宽
􀁺 可编程载波监听 (CS) 指示器
􀁺 可编程前导质量指示器 (PQI),用于随机噪声伪同步字检测增强保护
􀁺 支持发送前自动空闲信道评估 (CCA)(用于载波监听系统)
􀁺 支持每个数据包的链路质量指示 (LQI)
􀁺 可选数据自动白化和去白 (de-whitening)
低功耗特性
􀁺 400 nA 睡眠模式电流消耗
􀁺 快速启动时间;从睡眠模式转为 RX 或者 TX 模式只需 240 μs(由 EM 参
考设计 [3] 和 [4] 测量得出)
􀁺 自动低功耗 RX 轮询无线唤醒功能
􀁺 单独的 64 字节 RX 和 TX 数据 FIFO(实现了突发模式数据传输)
一般特性
􀁺 少量的外部组件;完全片上频率合成器,无需外部滤波器或 RF 开关
􀁺 绿色封装:符合 RoHS 标准,不含锑或溴
􀁺 小尺寸封装(QFN 4x4 mm 封装,20 引脚)
􀁺 适合于那些针对日本 ARIB STD-T96 标准的系统
􀁺 适合于那些针对中国 470-510 MHz 短距离通信设备规定的系统
􀁺 支持异步和同步串行接收/发送模式,以向后兼容现有无线通信协议。



1100无线温度传感器\无线温度发送
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define                INT8U                unsigned char
  4. #define                INT16U                unsigned int

  5. #define         WRITE_BURST             0x40                                                //连续写入
  6. #define         READ_SINGLE             0x80                                                //读
  7. #define         READ_BURST              0xC0                                                //连续读
  8. #define         BYTES_IN_RXFIFO     0x7F                                                  //接收缓冲区的有效字节数
  9. #define         CRC_OK              0x80                                                 //CRC校验通过位标志
  10. //*****************************************************************************************
  11. sbit         GDO0        =P1^3;
  12. sbit         GDO2        =P3^2;
  13. sbit        MISO        =P1^6;
  14. sbit        MOSI        =P1^5;
  15. sbit        SCK                =P1^7;
  16. sbit        CSN                =P1^2;
  17. //*****************************************************************************************
  18. sbit    LED2    =P3^4;
  19. sbit    LED1    =P3^5;
  20. sbit    KEY1    =P3^6;
  21. sbit    KEY2    =P3^7;
  22. //*****************************************************************************************
  23. sbit        led3=P2^3;
  24. sbit        led2=P2^2;
  25. sbit        led1=P2^1;
  26. sbit        led0=P2^0;
  27. //*****************************************************************************************
  28. sbit st=P2^6;
  29. //*****************************************************************************************
  30. sbit      DQ=P2^5          ;
  31. //*****************************************************************************************
  32. INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};
  33. INT8U seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
  34. INT8U seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  35. INT8U data temp_data[2]={0x00,0x00};
  36. INT8U dispaly[8];
  37. //*****************************************************************************************
  38. void SpiInit(void);
  39. void CpuInit(void);
  40. void RESET_CC1100(void);
  41. void POWER_UP_RESET_CC1100(void);
  42. void halSpiWriteReg(INT8U addr, INT8U value);
  43. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  44. void halSpiStrobe(INT8U strobe);
  45. INT8U halSpiReadReg(INT8U addr);
  46. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  47. INT8U halSpiReadStatus(INT8U addr);
  48. void halRfWriteRfSettings(void);
  49. void halRfSendPacket(INT8U *txBuffer, INT8U size);
  50. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length);  
  51. //*****************************************************************************************
  52. void delay1(INT16U i);
  53. void ds_reset(void);
  54. void write_byte(INT8U value);
  55. INT8U read_byte(void);
  56. void read_temp();
  57. void work_temp();
  58. //*****************************************************************************************
  59. // CC1100 STROBE, CONTROL AND STATUS REGSITER
  60. #define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
  61. #define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
  62. #define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
  63. #define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
  64. #define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
  65. #define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
  66. #define CCxxx0_PKTLEN       0x06        // Packet length
  67. #define CCxxx0_PKTCTRL1     0x07        // Packet automation control
  68. #define CCxxx0_PKTCTRL0     0x08        // Packet automation control
  69. #define CCxxx0_ADDR         0x09        // Device address
  70. #define CCxxx0_CHANNR       0x0A        // Channel number
  71. #define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
  72. #define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
  73. #define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
  74. #define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
  75. #define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
  76. #define CCxxx0_MDMCFG4      0x10        // Modem configuration
  77. #define CCxxx0_MDMCFG3      0x11        // Modem configuration
  78. #define CCxxx0_MDMCFG2      0x12        // Modem configuration
  79. #define CCxxx0_MDMCFG1      0x13        // Modem configuration
  80. #define CCxxx0_MDMCFG0      0x14        // Modem configuration
  81. #define CCxxx0_DEVIATN      0x15        // Modem deviation setting
  82. #define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
  83. #define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
  84. #define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
  85. #define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
  86. #define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
  87. #define CCxxx0_AGCCTRL2     0x1B        // AGC control
  88. #define CCxxx0_AGCCTRL1     0x1C        // AGC control
  89. #define CCxxx0_AGCCTRL0     0x1D        // AGC control
  90. #define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
  91. #define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
  92. #define CCxxx0_WORCTRL      0x20        // Wake On Radio control
  93. #define CCxxx0_FREND1       0x21        // Front end RX configuration
  94. #define CCxxx0_FREND0       0x22        // Front end TX configuration
  95. #define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
  96. #define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
  97. #define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
  98. #define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
  99. #define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
  100. #define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
  101. #define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
  102. #define CCxxx0_PTEST        0x2A        // Production test
  103. #define CCxxx0_AGCTEST      0x2B        // AGC test
  104. #define CCxxx0_TEST2        0x2C        // Various test settings
  105. #define CCxxx0_TEST1        0x2D        // Various test settings
  106. #define CCxxx0_TEST0        0x2E        // Various test settings

  107. // Strobe commands
  108. #define CCxxx0_SRES         0x30        // Reset chip.
  109. #define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  110.                                         // If in RX/TX: Go to a wait state where only the synthesizer is
  111.                                         // running (for quick RX / TX turnaround).
  112. #define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
  113. #define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
  114.                                         // (enables quick start).
  115. #define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
  116.                                         // MCSM0.FS_AUTOCAL=1.
  117. #define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
  118.                                         // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
  119.                                         // Only go to TX if channel is clear.
  120. #define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
  121.                                         // Wake-On-Radio mode if applicable.
  122. #define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
  123. #define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
  124. #define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
  125. #define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
  126. #define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
  127. #define CCxxx0_SWORRST      0x3C        // Reset real time clock.
  128. #define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
  129.                                         // INT8Us for simpler software.

  130. #define CCxxx0_PARTNUM      0x30
  131. #define CCxxx0_VERSION      0x31
  132. #define CCxxx0_FREQEST      0x32
  133. #define CCxxx0_LQI          0x33
  134. #define CCxxx0_RSSI         0x34
  135. #define CCxxx0_MARCSTATE    0x35
  136. #define CCxxx0_WORTIME1     0x36
  137. #define CCxxx0_WORTIME0     0x37
  138. #define CCxxx0_PKTSTATUS    0x38
  139. #define CCxxx0_VCO_VC_DAC   0x39
  140. #define CCxxx0_TXBYTES      0x3A
  141. #define CCxxx0_RXBYTES      0x3B

  142. #define CCxxx0_PATABLE      0x3E
  143. #define CCxxx0_TXFIFO       0x3F
  144. #define CCxxx0_RXFIFO       0x3F

  145. // RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
  146. typedef struct S_RF_SETTINGS
  147. {
  148.         INT8U FSCTRL2;                //自已加的
  149.     INT8U FSCTRL1;   // Frequency synthesizer control.
  150.     INT8U FSCTRL0;   // Frequency synthesizer control.
  151.     INT8U FREQ2;     // Frequency control word, high INT8U.
  152.     INT8U FREQ1;     // Frequency control word, middle INT8U.
  153.     INT8U FREQ0;     // Frequency control word, low INT8U.
  154.     INT8U MDMCFG4;   // Modem configuration.
  155.     INT8U MDMCFG3;   // Modem configuration.
  156.     INT8U MDMCFG2;   // Modem configuration.
  157.     INT8U MDMCFG1;   // Modem configuration.
  158.     INT8U MDMCFG0;   // Modem configuration.
  159.     INT8U CHANNR;    // Channel number.
  160.     INT8U DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
  161.     INT8U FREND1;    // Front end RX configuration.
  162.     INT8U FREND0;    // Front end RX configuration.
  163.     INT8U MCSM0;     // Main Radio Control State Machine configuration.
  164.     INT8U FOCCFG;    // Frequency Offset Compensation Configuration.
  165.     INT8U BSCFG;     // Bit synchronization Configuration.
  166.     INT8U AGCCTRL2;  // AGC control.
  167.         INT8U AGCCTRL1;  // AGC control.
  168.     INT8U AGCCTRL0;  // AGC control.
  169.     INT8U FSCAL3;    // Frequency synthesizer calibration.
  170.     INT8U FSCAL2;    // Frequency synthesizer calibration.
  171.         INT8U FSCAL1;    // Frequency synthesizer calibration.
  172.     INT8U FSCAL0;    // Frequency synthesizer calibration.
  173.     INT8U FSTEST;    // Frequency synthesizer calibration control
  174.     INT8U TEST2;     // Various test settings.
  175.     INT8U TEST1;     // Various test settings.
  176.     INT8U TEST0;     // Various test settings.
  177.     INT8U IOCFG2;    // GDO2 output pin configuration
  178.     INT8U IOCFG0;    // GDO0 output pin configuration
  179.     INT8U PKTCTRL1;  // Packet automation control.
  180.     INT8U PKTCTRL0;  // Packet automation control.
  181.     INT8U ADDR;      // Device address.
  182.     INT8U PKTLEN;    // Packet length.
  183. } RF_SETTINGS;

  184. /////////////////////////////////////////////////////////////////
  185. const RF_SETTINGS rfSettings =
  186. {
  187.         0x00,
  188.     0x08,   // FSCTRL1   Frequency synthesizer control.
  189.     0x00,   // FSCTRL0   Frequency synthesizer control.
  190.     0x10,   // FREQ2     Frequency control word, high byte.
  191.     0xA7,   // FREQ1     Frequency control word, middle byte.
  192.     0x62,   // FREQ0     Frequency control word, low byte.
  193.     0x5B,   // MDMCFG4   Modem configuration.
  194.     0xF8,   // MDMCFG3   Modem configuration.
  195.     0x03,   // MDMCFG2   Modem configuration.
  196.     0x22,   // MDMCFG1   Modem configuration.
  197.     0xF8,   // MDMCFG0   Modem configuration.

  198.     0x00,   // CHANNR    Channel number.
  199.     0x47,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
  200.     0xB6,   // FREND1    Front end RX configuration.
  201.     0x10,   // FREND0    Front end RX configuration.
  202.     0x18,   // MCSM0     Main Radio Control State Machine configuration.
  203.     0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
  204.     0x1C,   // BSCFG     Bit synchronization Configuration.
  205.     0xC7,   // AGCCTRL2  AGC control.
  206.     0x00,   // AGCCTRL1  AGC control.
  207.     0xB2,   // AGCCTRL0  AGC control.

  208.     0xEA,   // FSCAL3    Frequency synthesizer calibration.
  209.     0x2A,   // FSCAL2    Frequency synthesizer calibration.
  210.     0x00,   // FSCAL1    Frequency synthesizer calibration.
  211.     0x11,   // FSCAL0    Frequency synthesizer calibration.
  212.     0x59,   // FSTEST    Frequency synthesizer calibration.
  213.     0x81,   // TEST2     Various test settings.
  214.     0x35,   // TEST1     Various test settings.
  215.     0x09,   // TEST0     Various test settings.
  216.     0x0B,   // IOCFG2    GDO2 output pin configuration.
  217.     0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

  218.     0x04,   // PKTCTRL1  Packet automation control.
  219.     0x05,   // PKTCTRL0  Packet automation control.
  220.     0x00,   // ADDR      Device address.
  221.     0x0c    // PKTLEN    Packet length.
  222. };
  223. //*****************************************************************************************
  224. //函数名:delay(unsigned int s)
  225. //输入:时间
  226. //输出:无
  227. //功能描述:普通廷时,内部用
  228. //*****************************************************************************************               
  229. static void delay(unsigned int s)
  230. {
  231.         unsigned int i;
  232.         for(i=0; i<s; i++);
  233.         for(i=0; i<s; i++);
  234. }


  235. void halWait(INT16U timeout) {
  236.     do {
  237.         _nop_();
  238.                 _nop_();
  239.                 _nop_();
  240.                 _nop_();
  241.                 _nop_();
  242.                 _nop_();
  243.                 _nop_();
  244.                 _nop_();
  245.                 _nop_();
  246.                 _nop_();
  247.                 _nop_();
  248.                 _nop_();
  249.                 _nop_();
  250.                 _nop_();
  251.                 _nop_();
  252.     } while (--timeout);
  253. }


  254. void SpiInit(void)
  255. {
  256.         CSN=0;
  257.         SCK=0;
  258.         CSN=1;
  259. }

  260. /*****************************************************************************************
  261. //函数名:CpuInit()
  262. //输入:无
  263. //输出:无
  264. //功能描述:SPI初始化程序
  265. /*****************************************************************************************/
  266. void CpuInit(void)
  267. {
  268.         SpiInit();
  269.         delay(5000);
  270. }
  271.         

  272. //*****************************************************************************************
  273. //函数名:SpisendByte(INT8U dat)
  274. //输入:发送的数据
  275. //输出:无
  276. //功能描述:SPI发送一个字节
  277. //*****************************************************************************************
  278. INT8U SpiTxRxByte(INT8U dat)
  279. {
  280.         INT8U i,temp;
  281.         temp = 0;
  282.         
  283.         SCK = 0;
  284.         for(i=0; i<8; i++)
  285.         {
  286.                 if(dat & 0x80)
  287.                 {
  288.                         MOSI = 1;
  289.                 }
  290.                 else MOSI = 0;
  291.                 dat <<= 1;

  292.                 SCK = 1;
  293.                 _nop_();
  294.                 _nop_();

  295.                 temp <<= 1;
  296.                 if(MISO)temp++;
  297.                 SCK = 0;
  298.                 _nop_();
  299.                 _nop_();        
  300.         }
  301.         return temp;
  302. }

  303. //*****************************************************************************************
  304. //函数名:void RESET_CC1100(void)
  305. //输入:无
  306. //输出:无
  307. //功能描述:复位CC1100
  308. //*****************************************************************************************
  309. void RESET_CC1100(void)
  310. {
  311.         CSN = 0;
  312.         while (MISO);
  313.     SpiTxRxByte(CCxxx0_SRES);                 //写入复位命令
  314.         while (MISO);
  315.     CSN = 1;
  316. }

  317. //*****************************************************************************************
  318. //函数名:void POWER_UP_RESET_CC1100(void)
  319. //输入:无
  320. //输出:无
  321. //功能描述:上电复位CC1100
  322. //*****************************************************************************************
  323. void POWER_UP_RESET_CC1100(void)
  324. {
  325.         CSN = 1;
  326.         halWait(1);
  327.         CSN = 0;
  328.         halWait(1);
  329.         CSN = 1;
  330.         halWait(41);
  331.         RESET_CC1100();                   //复位CC1100
  332. }

  333. //*****************************************************************************************
  334. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  335. //输入:地址和配置字
  336. //输出:无
  337. //功能描述:SPI写寄存器
  338. //*****************************************************************************************
  339. void halSpiWriteReg(INT8U addr, INT8U value)
  340. {
  341.     CSN = 0;
  342.     while (MISO);
  343.     SpiTxRxByte(addr);                //写地址
  344.     SpiTxRxByte(value);                //写入配置
  345.     CSN = 1;
  346. }

  347. //*****************************************************************************************
  348. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  349. //输入:地址,写入缓冲区,写入个数
  350. //输出:无
  351. //功能描述:SPI连续写配置寄存器
  352. //*****************************************************************************************
  353. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  354. {
  355.     INT8U i, temp;
  356.         temp = addr | WRITE_BURST;
  357.     CSN = 0;
  358.     while (MISO);
  359.     SpiTxRxByte(temp);
  360.     for (i = 0; i < count; i++)
  361.          {
  362.         SpiTxRxByte(buffer[i]);
  363.     }
  364.     CSN = 1;
  365. }

  366. //*****************************************************************************************
  367. //函数名:void halSpiStrobe(INT8U strobe)
  368. //输入:命令
  369. //输出:无
  370. //功能描述:SPI写命令
  371. //*****************************************************************************************
  372. void halSpiStrobe(INT8U strobe)
  373. {
  374.     CSN = 0;
  375.     while (MISO);
  376.     SpiTxRxByte(strobe);                //写入命令
  377.     CSN = 1;
  378. }





  379. //*****************************************************************************************
  380. //函数名:INT8U halSpiReadReg(INT8U addr)
  381. //输入:地址
  382. //输出:该寄存器的配置字
  383. //功能描述:SPI读寄存器
  384. //*****************************************************************************************
  385. INT8U halSpiReadReg(INT8U addr)
  386. {
  387.         INT8U temp, value;
  388.     temp = addr|READ_SINGLE;//读寄存器命令
  389.         CSN = 0;
  390.         while (MISO);
  391.         SpiTxRxByte(temp);
  392.         value = SpiTxRxByte(0);
  393.         CSN = 1;
  394.         return value;
  395. }


  396. //*****************************************************************************************
  397. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  398. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  399. //输出:无
  400. //功能描述:SPI连续写配置寄存器
  401. //*****************************************************************************************
  402. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  403. {
  404.     INT8U i,temp;
  405.         temp = addr | READ_BURST;                //写入要读的配置寄存器地址和读命令
  406.     CSN = 0;
  407.     while (MISO);
  408.         SpiTxRxByte(temp);   
  409.     for (i = 0; i < count; i++)
  410.         {
  411.         buffer[i] = SpiTxRxByte(0);
  412.     }
  413.     CSN = 1;
  414. }


  415. //*****************************************************************************************
  416. //函数名:INT8U halSpiReadReg(INT8U addr)
  417. //输入:地址
  418. //输出:该状态寄存器当前值
  419. //功能描述:SPI读状态寄存器
  420. //*****************************************************************************************
  421. INT8U halSpiReadStatus(INT8U addr)
  422. {
  423.     INT8U value,temp;
  424.         temp = addr | READ_BURST;                //写入要读的状态寄存器的地址同时写入读命令
  425.     CSN = 0;
  426.     while (MISO);
  427.     SpiTxRxByte(temp);
  428.         value = SpiTxRxByte(0);
  429.         CSN = 1;
  430.         return value;
  431. }
  432. //*****************************************************************************************
  433. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  434. //输入:无
  435. //输出:无
  436. //功能描述:配置CC1100的寄存器
  437. //*****************************************************************************************
  438. void halRfWriteRfSettings(void)
  439. {

  440.         halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);//自已加的
  441.     // Write register settings
  442.     halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
  443.     halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
  444.     halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
  445.     halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
  446.     halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
  447.     halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
  448.     halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
  449.     halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
  450.     halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
  451.     halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
  452.     halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
  453.     halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
  454.     halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
  455.     halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
  456.     halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
  457.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
  458.     halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
  459.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  460.         halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  461.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  462.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
  463.         halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
  464.         halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
  465.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
  466.     halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
  467.     halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
  468.     halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
  469.     halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
  470.     halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
  471.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);   
  472.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  473.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  474.     halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
  475.     halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
  476. }

  477. //*****************************************************************************************
  478. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  479. //输入:发送的缓冲区,发送数据个数
  480. //输出:无
  481. //功能描述:CC1100发送一组数据
  482. //*****************************************************************************************

  483. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  484. {
  485.         halSpiWriteReg(CCxxx0_TXFIFO, size);
  486.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);        //写入要发送的数据

  487.     halSpiStrobe(CCxxx0_STX);                //进入发送模式发送数据

  488.     // Wait for GDO0 to be set -> sync transmitted
  489.     while (!GDO0);
  490.     // Wait for GDO0 to be cleared -> end of packet
  491.     while (GDO0);
  492.         halSpiStrobe(CCxxx0_SFTX);
  493. }


  494. void setRxMode(void)
  495. {
  496.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  497. }
  498. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
  499. {
  500.     INT8U status[2];
  501.     INT8U packetLength;
  502.         INT8U i=(*length)*4;  // 具体多少要根据datarate和length来决定

  503.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  504.         delay(2);
  505.         while (GDO0)
  506.         {
  507.                 delay(2);
  508.                 --i;
  509.                 if(i<1)
  510.                    return 0;            
  511.         }         
  512.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  513.         {
  514.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  515.         if (packetLength <= *length)                 //如果所要的有效数据长度小于等于接收到的数据包的长度
  516.                 {
  517.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  518.             *length = packetLength;                                //把接收数据长度的修改为当前数据的长度
  519.         
  520.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  521.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
  522.                         halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  523.             return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
  524.         }
  525.                  else
  526.                 {
  527.             *length = packetLength;
  528.             halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  529.             return 0;
  530.         }
  531.     }
  532.         else
  533.          return 0;
  534. }
  535. //*****************************************************************************************
  536. void ds_reset(void)
  537. {
  538.         char temp=1;
  539.         while(temp)
  540. {
  541. while(temp)
  542. {
  543.     DQ=1;_nop_();_nop_();
  544.         DQ=0;
  545.         delay1(80);
  546.         DQ=1;
  547.         delay1(9);
  548.         temp=DQ;
  549.   }
  550.           delay1(64);
  551.          temp=~DQ;  
  552. }
  553. DQ=1;
  554. }
  555. //*****************************************************************************************
  556. void delay1(        INT16U i)
  557. {
  558.         for(;i>0;i--);   
  559. }
  560. //*****************************************************************************************
  561. void write_byte(INT8U value)
  562. {
  563.         INT8U i;
  564.         for(i=8;i>0;i--)
  565. {
  566.          DQ=1;_nop_();_nop_();
  567.           DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
  568.          DQ=value&0x01;
  569.           delay1(9);
  570.     value>>=1;
  571. }
  572.         DQ=1;
  573.         delay1(1);
  574. }
  575. //*****************************************************************************************
  576. INT8U read_byte(void)
  577. {
  578.         INT8U i;
  579.         INT8U value1=0;
  580. for(i=8;i>0;i--)
  581. {
  582.         DQ=1;_nop_();_nop_();
  583.         value1>>=1;
  584.         DQ=0;
  585.         _nop_();_nop_();_nop_();_nop_();
  586.         DQ=1;
  587.         _nop_();_nop_();_nop_();_nop_();
  588.         if(DQ)
  589.         value1|=0x80;
  590.          delay1(9);
  591. }
  592.         DQ=1;
  593.         return(value1);
  594. }
  595. //*****************************************************************************************
  596. void read_temp()
  597. {
  598.         ds_reset();
  599.         write_byte(0xcc);
  600.         write_byte(0xbe);
  601.         temp_data[0]=read_byte();
  602.         temp_data[1]=read_byte();
  603.         ds_reset();
  604.         write_byte(0xcc);
  605.         write_byte(0x44);
  606. }
  607. //*****************************************************************************************
  608. void work_temp()
  609. {
  610.         INT8U n=0;
  611. if(temp_data[1]>127)
  612.         {
  613.         temp_data[1]=(256-temp_data[1]);                        //负值
  614.         temp_data[0]=(256-temp_data[0]);
  615.         n=1;
  616.         }
  617.         dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  618.         dispaly[5]=dispaly[6]/100;                                //百位
  619.         dispaly[4]=dispaly[6]%100;                                //
  620.         dispaly[2]=dispaly[4]/10;                                //十位
  621.         dispaly[1]=dispaly[4]%10;                                //个位        
  622.         switch        (temp_data[0]&0x0f)                                //小数位
  623.         {
  624.         case 0x0f:dispaly[0]=9;break;
  625.         case 0x0e:dispaly[0]=9;break;
  626.         case 0x0d:dispaly[0]=8;break;
  627.         case 0x0c:dispaly[0]=8;break;
  628.         case 0x0b:dispaly[0]=7;break;
  629.         case 0x0a:dispaly[0]=6;break;
  630.         case 0x09:dispaly[0]=6;break;
  631.         case 0x08:dispaly[0]=5;break;
  632.         case 0x07:dispaly[0]=4;break;
  633.         case 0x06:dispaly[0]=4;break;
  634.         case 0x05:dispaly[0]=3;break;
  635.         case 0x04:dispaly[0]=3;break;
  636.         case 0x03:dispaly[0]=2;break;
  637.         case 0x02:dispaly[0]=1;break;
  638.         case 0x01:dispaly[0]=1;break;
  639.         case 0x00:dispaly[0]=1;break;
  640.         default:break;
  641.         }
  642. if(n)                                                                                //负值时显示aa,正直显示dd
  643.         {
  644.         dispaly[3]=0x11;                                                //
  645.         }
  646. else         dispaly[3]=0x22;
  647. }
  648. //*****************************************************************************************
  649. void disdignit()
  650. {
  651.         char i;
  652. //        if(temp[0])
  653.         {
  654.         for(i=0;i<3;i++)
  655.                 {
  656.                         P0=0xC6;
  657.                         led0=0;
  658.                         delay1(40);
  659.                         led0=1;
  660.                         P0=seg[dispaly[0]];
  661.                         led1=0;
  662.                         delay1(40);
  663.                         led1=1;
  664.                                 P0=seg1        [dispaly[1]];
  665.                                 led2=0;
  666.                         delay1(40);
  667.                         led2=1;
  668.                                 P0=seg[        dispaly[2]];
  669.                         led3=0;
  670.                                 delay1(40);
  671.                                 led3=1;
  672.                         }
  673.                         }
  674. }
  675. void main(void)
  676. {
  677.         INT8U leng =0;
  678.         INT8U tf =0;
  679.         INT8U TxBuf[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};         // 8字节, 如果需要更长的数据包,请正确设置
  680.         INT8U RxBuf[8]={0};        
  681.         CpuInit();
  682.         POWER_UP_RESET_CC1100();
  683.         halRfWriteRfSettings();
  684.         halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
  685. //        halRfSendPacket(TxBuf,8);        // Transmit Tx buffer data
  686.         delay(6000);
  687.         while(1)
  688.         {
  689.                 read_temp();
  690.                 work_temp();
  691.                 delay1(500);
  692.                 disdignit();
  693.                 halRfSendPacket(dispaly,4);
  694.         //        delay1(1000);
  695. //        leng=8;
  696. //        halRfSendPacket(TxBuf,leng);        // Transmit Tx buffer data
  697.         }
  698.         
  699. }


复制代码
1100无线温度传感器\无线温度接收
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define                INT8U                unsigned char
  4. #define                INT16U                unsigned int

  5. #define         WRITE_BURST             0x40                                                //连续写入
  6. #define         READ_SINGLE             0x80                                                //读
  7. #define         READ_BURST              0xC0                                                //连续读
  8. #define         BYTES_IN_RXFIFO     0x7F                                                  //接收缓冲区的有效字节数
  9. #define         CRC_OK              0x80                                                 //CRC校验通过位标志
  10. //*****************************************************************************************
  11. sbit         GDO0        =P1^3;
  12. sbit         GDO2        =P3^2;
  13. sbit        MISO        =P1^6;
  14. sbit        MOSI        =P1^5;
  15. sbit        SCK                =P1^7;
  16. sbit        CSN                =P1^2;
  17. //*****************************************************************************************
  18. sbit    LED2    =P3^4;
  19. sbit    LED1    =P3^5;
  20. sbit    KEY1    =P3^6;
  21. sbit    KEY2    =P3^7;
  22. //*****************************************************************************************
  23. sbit        led3=P2^3;
  24. sbit        led2=P2^2;
  25. sbit        led1=P2^1;
  26. sbit        led0=P2^0;
  27. char temp[6];
  28. INT8U seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
  29. INT8U seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  30. INT8U data temp_data[2]={0x00,0x00};
  31. INT8U dispaly[8];
  32. //*****************************************************************************************
  33. INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};
  34. //*****************************************************************************************
  35. void SpiInit(void);
  36. void CpuInit(void);
  37. void RESET_CC1100(void);
  38. void POWER_UP_RESET_CC1100(void);
  39. void halSpiWriteReg(INT8U addr, INT8U value);
  40. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  41. void halSpiStrobe(INT8U strobe);
  42. INT8U halSpiReadReg(INT8U addr);
  43. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  44. INT8U halSpiReadStatus(INT8U addr);
  45. void halRfWriteRfSettings(void);
  46. void halRfSendPacket(INT8U *txBuffer, INT8U size);
  47. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length);  
  48. void StartUART( void );
  49. void R_S_Byte(INT8U R_Byte);
  50. //*****************************************************************************************
  51. // CC1100 STROBE, CONTROL AND STATUS REGSITER
  52. #define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
  53. #define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
  54. #define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
  55. #define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
  56. #define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
  57. #define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
  58. #define CCxxx0_PKTLEN       0x06        // Packet length
  59. #define CCxxx0_PKTCTRL1     0x07        // Packet automation control
  60. #define CCxxx0_PKTCTRL0     0x08        // Packet automation control
  61. #define CCxxx0_ADDR         0x09        // Device address
  62. #define CCxxx0_CHANNR       0x0A        // Channel number
  63. #define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
  64. #define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
  65. #define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
  66. #define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
  67. #define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
  68. #define CCxxx0_MDMCFG4      0x10        // Modem configuration
  69. #define CCxxx0_MDMCFG3      0x11        // Modem configuration
  70. #define CCxxx0_MDMCFG2      0x12        // Modem configuration
  71. #define CCxxx0_MDMCFG1      0x13        // Modem configuration
  72. #define CCxxx0_MDMCFG0      0x14        // Modem configuration
  73. #define CCxxx0_DEVIATN      0x15        // Modem deviation setting
  74. #define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
  75. #define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
  76. #define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
  77. #define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
  78. #define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
  79. #define CCxxx0_AGCCTRL2     0x1B        // AGC control
  80. #define CCxxx0_AGCCTRL1     0x1C        // AGC control
  81. #define CCxxx0_AGCCTRL0     0x1D        // AGC control
  82. #define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
  83. #define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
  84. #define CCxxx0_WORCTRL      0x20        // Wake On Radio control
  85. #define CCxxx0_FREND1       0x21        // Front end RX configuration
  86. #define CCxxx0_FREND0       0x22        // Front end TX configuration
  87. #define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
  88. #define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
  89. #define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
  90. #define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
  91. #define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
  92. #define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
  93. #define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
  94. #define CCxxx0_PTEST        0x2A        // Production test
  95. #define CCxxx0_AGCTEST      0x2B        // AGC test
  96. #define CCxxx0_TEST2        0x2C        // Various test settings
  97. #define CCxxx0_TEST1        0x2D        // Various test settings
  98. #define CCxxx0_TEST0        0x2E        // Various test settings

  99. // Strobe commands
  100. #define CCxxx0_SRES         0x30        // Reset chip.
  101. #define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  102.                                         // If in RX/TX: Go to a wait state where only the synthesizer is
  103.                                         // running (for quick RX / TX turnaround).
  104. #define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
  105. #define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
  106.                                         // (enables quick start).
  107. #define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
  108.                                         // MCSM0.FS_AUTOCAL=1.
  109. #define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
  110.                                         // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
  111.                                         // Only go to TX if channel is clear.
  112. #define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
  113.                                         // Wake-On-Radio mode if applicable.
  114. #define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
  115. #define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
  116. #define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
  117. #define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
  118. #define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
  119. #define CCxxx0_SWORRST      0x3C        // Reset real time clock.
  120. #define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
  121.                                         // INT8Us for simpler software.

  122. #define CCxxx0_PARTNUM      0x30
  123. #define CCxxx0_VERSION      0x31
  124. #define CCxxx0_FREQEST      0x32
  125. #define CCxxx0_LQI          0x33
  126. #define CCxxx0_RSSI         0x34
  127. #define CCxxx0_MARCSTATE    0x35
  128. #define CCxxx0_WORTIME1     0x36
  129. #define CCxxx0_WORTIME0     0x37
  130. #define CCxxx0_PKTSTATUS    0x38
  131. #define CCxxx0_VCO_VC_DAC   0x39
  132. #define CCxxx0_TXBYTES      0x3A
  133. #define CCxxx0_RXBYTES      0x3B

  134. #define CCxxx0_PATABLE      0x3E
  135. #define CCxxx0_TXFIFO       0x3F
  136. #define CCxxx0_RXFIFO       0x3F

  137. // RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
  138. typedef struct S_RF_SETTINGS
  139. {
  140.         INT8U FSCTRL2;                //自已加的
  141.     INT8U FSCTRL1;   // Frequency synthesizer control.
  142.     INT8U FSCTRL0;   // Frequency synthesizer control.
  143.     INT8U FREQ2;     // Frequency control word, high INT8U.
  144.     INT8U FREQ1;     // Frequency control word, middle INT8U.
  145.     INT8U FREQ0;     // Frequency control word, low INT8U.
  146.     INT8U MDMCFG4;   // Modem configuration.
  147.     INT8U MDMCFG3;   // Modem configuration.
  148.     INT8U MDMCFG2;   // Modem configuration.
  149.     INT8U MDMCFG1;   // Modem configuration.
  150.     INT8U MDMCFG0;   // Modem configuration.
  151.     INT8U CHANNR;    // Channel number.
  152.     INT8U DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
  153.     INT8U FREND1;    // Front end RX configuration.
  154.     INT8U FREND0;    // Front end RX configuration.
  155.     INT8U MCSM0;     // Main Radio Control State Machine configuration.
  156.     INT8U FOCCFG;    // Frequency Offset Compensation Configuration.
  157.     INT8U BSCFG;     // Bit synchronization Configuration.
  158.     INT8U AGCCTRL2;  // AGC control.
  159.         INT8U AGCCTRL1;  // AGC control.
  160.     INT8U AGCCTRL0;  // AGC control.
  161.     INT8U FSCAL3;    // Frequency synthesizer calibration.
  162.     INT8U FSCAL2;    // Frequency synthesizer calibration.
  163.         INT8U FSCAL1;    // Frequency synthesizer calibration.
  164.     INT8U FSCAL0;    // Frequency synthesizer calibration.
  165.     INT8U FSTEST;    // Frequency synthesizer calibration control
  166.     INT8U TEST2;     // Various test settings.
  167.     INT8U TEST1;     // Various test settings.
  168.     INT8U TEST0;     // Various test settings.
  169.     INT8U IOCFG2;    // GDO2 output pin configuration
  170.     INT8U IOCFG0;    // GDO0 output pin configuration
  171.     INT8U PKTCTRL1;  // Packet automation control.
  172.     INT8U PKTCTRL0;  // Packet automation control.
  173.     INT8U ADDR;      // Device address.
  174.     INT8U PKTLEN;    // Packet length.
  175. } RF_SETTINGS;

  176. /////////////////////////////////////////////////////////////////
  177. const RF_SETTINGS rfSettings =
  178. {
  179.         0x00,
  180.     0x08,   // FSCTRL1   Frequency synthesizer control.
  181.     0x00,   // FSCTRL0   Frequency synthesizer control.
  182.     0x10,   // FREQ2     Frequency control word, high byte.
  183.     0xA7,   // FREQ1     Frequency control word, middle byte.
  184.     0x62,   // FREQ0     Frequency control word, low byte.
  185.     0x5B,   // MDMCFG4   Modem configuration.
  186.     0xF8,   // MDMCFG3   Modem configuration.
  187.     0x03,   // MDMCFG2   Modem configuration.
  188.     0x22,   // MDMCFG1   Modem configuration.
  189.     0xF8,   // MDMCFG0   Modem configuration.

  190.     0x00,   // CHANNR    Channel number.
  191.     0x47,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
  192.     0xB6,   // FREND1    Front end RX configuration.
  193.     0x10,   // FREND0    Front end RX configuration.
  194.     0x18,   // MCSM0     Main Radio Control State Machine configuration.
  195.     0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
  196.     0x1C,   // BSCFG     Bit synchronization Configuration.
  197.     0xC7,   // AGCCTRL2  AGC control.
  198.     0x00,   // AGCCTRL1  AGC control.
  199.     0xB2,   // AGCCTRL0  AGC control.

  200.     0xEA,   // FSCAL3    Frequency synthesizer calibration.
  201.     0x2A,   // FSCAL2    Frequency synthesizer calibration.
  202.     0x00,   // FSCAL1    Frequency synthesizer calibration.
  203.     0x11,   // FSCAL0    Frequency synthesizer calibration.
  204.     0x59,   // FSTEST    Frequency synthesizer calibration.
  205.     0x81,   // TEST2     Various test settings.
  206.     0x35,   // TEST1     Various test settings.
  207.     0x09,   // TEST0     Various test settings.
  208.     0x0B,   // IOCFG2    GDO2 output pin configuration.
  209.     0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

  210.     0x04,   // PKTCTRL1  Packet automation control.
  211.     0x05,   // PKTCTRL0  Packet automation control.
  212.     0x00,   // ADDR      Device address.
  213.     0x0c    // PKTLEN    Packet length.
  214. };
  215. //*****************************************************************************************
  216. //函数名:delay(unsigned int s)
  217. //输入:时间
  218. //输出:无
  219. //功能描述:普通廷时,内部用
  220. //*****************************************************************************************               
  221. static void delay(unsigned int s)
  222. {
  223.         unsigned int i;
  224.         for(i=0; i<s; i++);
  225.         for(i=0; i<s; i++);
  226. }

  227. //*****************************************************************************************
  228. void delay1(        INT16U i)
  229. {
  230.         for(;i>0;i--);   
  231. }
  232. void halWait(INT16U timeout) {
  233.     do {
  234.         _nop_();
  235.                 _nop_();
  236.                 _nop_();
  237.                 _nop_();
  238.                 _nop_();
  239.                 _nop_();
  240.                 _nop_();
  241.                 _nop_();
  242.                 _nop_();
  243.                 _nop_();
  244.                 _nop_();
  245.                 _nop_();
  246.                 _nop_();
  247.                 _nop_();
  248.                 _nop_();
  249.     } while (--timeout);
  250. }


  251. void SpiInit(void)
  252. {
  253.         CSN=0;
  254.         SCK=0;
  255.         CSN=1;
  256. }

  257. /*****************************************************************************************
  258. //函数名:CpuInit()
  259. //输入:无
  260. //输出:无
  261. //功能描述:SPI初始化程序
  262. /*****************************************************************************************/
  263. void CpuInit(void)
  264. {
  265.         SpiInit();
  266.         delay(5000);
  267. }
  268.         

  269. //*****************************************************************************************
  270. //函数名:SpisendByte(INT8U dat)
  271. //输入:发送的数据
  272. //输出:无
  273. //功能描述:SPI发送一个字节
  274. //*****************************************************************************************
  275. INT8U SpiTxRxByte(INT8U dat)
  276. {
  277.         INT8U i,temp;
  278.         temp = 0;
  279.         
  280.         SCK = 0;
  281.         for(i=0; i<8; i++)
  282.         {
  283.                 if(dat & 0x80)
  284.                 {
  285.                         MOSI = 1;
  286.                 }
  287.                 else MOSI = 0;
  288.                 dat <<= 1;

  289.                 SCK = 1;
  290.                 _nop_();
  291.                 _nop_();

  292.                 temp <<= 1;
  293.                 if(MISO)temp++;
  294.                 SCK = 0;
  295.                 _nop_();
  296.                 _nop_();        
  297.         }
  298.         return temp;
  299. }

  300. //*****************************************************************************************
  301. //函数名:void RESET_CC1100(void)
  302. //输入:无
  303. //输出:无
  304. //功能描述:复位CC1100
  305. //*****************************************************************************************
  306. void RESET_CC1100(void)
  307. {
  308.         CSN = 0;
  309.         while (MISO);
  310.     SpiTxRxByte(CCxxx0_SRES);                 //写入复位命令
  311.         while (MISO);
  312.     CSN = 1;
  313. }

  314. //*****************************************************************************************
  315. //函数名:void POWER_UP_RESET_CC1100(void)
  316. //输入:无
  317. //输出:无
  318. //功能描述:上电复位CC1100
  319. //*****************************************************************************************
  320. void POWER_UP_RESET_CC1100(void)
  321. {
  322.         CSN = 1;
  323.         halWait(1);
  324.         CSN = 0;
  325.         halWait(1);
  326.         CSN = 1;
  327.         halWait(41);
  328.         RESET_CC1100();                   //复位CC1100
  329. }

  330. //*****************************************************************************************
  331. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  332. //输入:地址和配置字
  333. //输出:无
  334. //功能描述:SPI写寄存器
  335. //*****************************************************************************************
  336. void halSpiWriteReg(INT8U addr, INT8U value)
  337. {
  338.     CSN = 0;
  339.     while (MISO);
  340.     SpiTxRxByte(addr);                //写地址
  341.     SpiTxRxByte(value);                //写入配置
  342.     CSN = 1;
  343. }

  344. //*****************************************************************************************
  345. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  346. //输入:地址,写入缓冲区,写入个数
  347. //输出:无
  348. //功能描述:SPI连续写配置寄存器
  349. //*****************************************************************************************
  350. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  351. {
  352.     INT8U i, temp;
  353.         temp = addr | WRITE_BURST;
  354.     CSN = 0;
  355.     while (MISO);
  356.     SpiTxRxByte(temp);
  357.     for (i = 0; i < count; i++)
  358.          {
  359.         SpiTxRxByte(buffer[i]);
  360.     }
  361.     CSN = 1;
  362. }

  363. //*****************************************************************************************
  364. //函数名:void halSpiStrobe(INT8U strobe)
  365. //输入:命令
  366. //输出:无
  367. //功能描述:SPI写命令
  368. //*****************************************************************************************
  369. void halSpiStrobe(INT8U strobe)
  370. {
  371.     CSN = 0;
  372.     while (MISO);
  373.     SpiTxRxByte(strobe);                //写入命令
  374.     CSN = 1;
  375. }





  376. //*****************************************************************************************
  377. //函数名:INT8U halSpiReadReg(INT8U addr)
  378. //输入:地址
  379. //输出:该寄存器的配置字
  380. //功能描述:SPI读寄存器
  381. //*****************************************************************************************
  382. INT8U halSpiReadReg(INT8U addr)
  383. {
  384.         INT8U temp, value;
  385.     temp = addr|READ_SINGLE;//读寄存器命令
  386.         CSN = 0;
  387.         while (MISO);
  388.         SpiTxRxByte(temp);
  389.         value = SpiTxRxByte(0);
  390.         CSN = 1;
  391.         return value;
  392. }


  393. //*****************************************************************************************
  394. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  395. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  396. //输出:无
  397. //功能描述:SPI连续写配置寄存器
  398. //*****************************************************************************************
  399. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  400. {
  401.     INT8U i,temp;
  402.         temp = addr | READ_BURST;                //写入要读的配置寄存器地址和读命令
  403.     CSN = 0;
  404.     while (MISO);
  405.         SpiTxRxByte(temp);   
  406.     for (i = 0; i < count; i++)
  407.         {
  408.         buffer[i] = SpiTxRxByte(0);
  409.     }
  410.     CSN = 1;
  411. }


  412. //*****************************************************************************************
  413. //函数名:INT8U halSpiReadReg(INT8U addr)
  414. //输入:地址
  415. //输出:该状态寄存器当前值
  416. //功能描述:SPI读状态寄存器
  417. //*****************************************************************************************
  418. INT8U halSpiReadStatus(INT8U addr)
  419. {
  420.     INT8U value,temp;
  421.         temp = addr | READ_BURST;                //写入要读的状态寄存器的地址同时写入读命令
  422.     CSN = 0;
  423.     while (MISO);
  424.     SpiTxRxByte(temp);
  425.         value = SpiTxRxByte(0);
  426.         CSN = 1;
  427.         return value;
  428. }
  429. //*****************************************************************************************
  430. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  431. //输入:无
  432. //输出:无
  433. //功能描述:配置CC1100的寄存器
  434. //*****************************************************************************************
  435. void halRfWriteRfSettings(void)
  436. {

  437.         halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);//自已加的
  438.     // Write register settings
  439.     halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
  440.     halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
  441.     halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
  442.     halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
  443.     halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
  444.     halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
  445.     halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
  446.     halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
  447.     halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
  448.     halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
  449.     halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
  450.     halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
  451.     halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
  452.     halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
  453.     halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
  454.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
  455.     halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
  456.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  457.         halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  458.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  459.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
  460.         halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
  461.         halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
  462.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
  463.     halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
  464.     halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
  465.     halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
  466.     halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
  467.     halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
  468.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);   
  469.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  470.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  471.     halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
  472.     halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
  473. }

  474. //*****************************************************************************************
  475. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  476. //输入:发送的缓冲区,发送数据个数
  477. //输出:无
  478. //功能描述:CC1100发送一组数据
  479. //*****************************************************************************************

  480. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  481. {
  482.         halSpiWriteReg(CCxxx0_TXFIFO, size);
  483.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);        //写入要发送的数据

  484.     halSpiStrobe(CCxxx0_STX);                //进入发送模式发送数据

  485.     // Wait for GDO0 to be set -> sync transmitted
  486.     while (!GDO0);
  487.     // Wait for GDO0 to be cleared -> end of packet
  488.     while (GDO0);
  489.         halSpiStrobe(CCxxx0_SFTX);
  490. }


  491. void setRxMode(void)
  492. {
  493.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  494. }
  495. //---------------------------------------------------------------------------
  496. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
  497. {
  498.     INT8U status[2];
  499.     INT8U packetLength;
  500.         INT8U i=(*length)*4;  // 具体多少要根据datarate和length来决定

  501.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  502.         //delay(5);
  503.     //while (!GDO1);
  504.     //while (GDO1);
  505.         delay(2);
  506.         while (GDO0)
  507.         {
  508.                 delay(2);
  509.                 --i;
  510.                 if(i<1)
  511.                    return 0;            
  512.         }         
  513.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  514.         {
  515.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  516.         if (packetLength <= *length)                 //如果所要的有效数据长度小于等于接收到的数据包的长度
  517.                 {
  518.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  519.             *length = packetLength;                                //把接收数据长度的修改为当前数据的长度
  520.         
  521.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  522.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
  523.                         halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  524.             return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
  525.         }
  526.                  else
  527.                 {
  528.             *length = packetLength;
  529.             halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  530.             return 0;
  531.         }
  532.     }
  533.         else
  534.          return 0;
  535. }
  536. //*****************************************************************************************
  537. void disdignit()
  538. {
  539.         char i;
  540.         if(temp[0])
  541.         {
  542.         for(i=0;i<3;i++)
  543.                 {
  544.                         P0=0xC6;
  545.                         led0=0;
  546.                         delay1(40);
  547.                         led0=1;
  548.                         P0=seg[temp[1]];
  549.                         led1=0;
  550.                         delay1(40);
  551.                         led1=1;
  552.                                 P0=seg1[temp[5]];
  553.                                 led2=0;
  554.                         delay1(40);
  555.                         led2=1;
  556.                                 P0=seg[temp[4]];
  557.                         led3=0;
  558.                                 delay1(40);
  559.                                 led3=1;
  560.                         }
  561.                         }
  562. }
  563. //********************************************************************************
  564. void StartUART( void )
  565. {                                                          //波特率4800
  566.      SCON = 0x50;
  567.      TMOD = 0x20;
  568.      TH1 = 0xFA;
  569.      TL1 = 0xFA;
  570.      PCON = 0x00;
  571.      TR1 = 1;
  572. }
  573. void R_S_Byte(INT8U R_Byte)
  574. {        
  575.          SBUF = R_Byte;  
  576.      while( TI == 0 );                                //查询法
  577.            TI = 0;
  578.      
  579. }
  580. void main(void)
  581. {
  582.         INT8U i,leng =0;
  583.         INT8U RxBuf[8]={0};        // 8字节, 如果需要更长的数据包,请正确设置
  584.         CpuInit();
  585.         POWER_UP_RESET_CC1100();
  586.         halRfWriteRfSettings();
  587.         halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);//发射功率设置
  588.         delay(6000);
  589.         StartUART();
  590.         while(1)
  591.         {
  592.                 leng =4; // 预计接受8 bytes
  593.                    if(halRfReceivePacket(RxBuf,&leng))  //判断是否接收到数据
  594.                 {
  595.                 temp[0]=RxBuf[3];      //符号位
  596.                 temp[2]=((RxBuf[2]<<4)|RxBuf[1]);                //整数位
  597.                 temp[1]=RxBuf[0];                                                        //小数位
  598.                 temp[4]=RxBuf[2];                                                        //十位
  599.                 temp[5]=RxBuf[1];
  600.                 for(i=0;i<3;i++)
  601.                 {
  602.                 R_S_Byte(temp[2-i])        ;        
  603.                 delay(100);
  604.                 }
  605.                  disdignit();
  606.                 }
  607.         }
  608.         
  609. }


复制代码





下载


回复

使用道具 举报

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

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-9-20 11:46 , Processed in 0.046114 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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