找回密码
 立即注册

QQ登录

只需一步,快速开始

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

msp430最小系统板串口测试程序源码

[复制链接]
跳转到指定楼层
楼主
ID:277100 发表于 2018-1-17 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /********************************************************************
  2. //DM430-L型最小系统板串口测试程序,使用单片机的串口0
  3. //使用板载BSL模块或者用户外接串口线到DB9,要求是直连公对母串口线
  4. //使用串口调试助手发送数据到系统板,比如02,03等
  5. //系统板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询
  6. //板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替
  7. //开发板的BSL_Config区的RXD和TXD0连接,TXD和RXD0连接即可,另外2个跳线帽取下
  8. //使用USB转串口功能时,BSL失效,因此操作前应该先将程序下载至芯片中再调整跳线帽

  9. ********************************************************************/
  10. #include <msp430x14x.h>
  11. #include "Config.h"
  12. //********************************
  13. #define  INT8U  unsigned char
  14. #define  INT16U  unsigned int
  15. #define  WRITE_BURST      0x40      //连续写入
  16. #define  READ_SINGLE      0x80      //读
  17. #define  READ_BURST       0xC0      //连续读
  18. #define  BYTES_IN_RXFIFO     0x7F        //接收缓冲区的有效字节数
  19. #define  CRC_OK              0x80       //CRC校验通过位标志
  20. //***************更多功率参数设置可详细参考DATACC1100英文文档中第48-49页的参数表******************
  21. //INT8U PaTabel[8] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04};  //-30dBm   功率最小
  22. //INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};  //0dBm
  23. INT8U PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};   //10dBm     功率最大
  24. //***********************************************************************************************
  25. void SpiInit(void);
  26. void CpuInit(void);
  27. void RESET_CC1100(void);
  28. void POWER_UP_RESET_CC1100(void);
  29. void halSpiWriteReg(INT8U addr, INT8U value);
  30. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  31. void halSpiStrobe(INT8U strobe);
  32. INT8U halSpiReadReg(INT8U addr);
  33. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);
  34. INT8U halSpiReadStatus(INT8U addr);
  35. void halRfWriteRfSettings(void);
  36. void halRfSendPacket(INT8U *txBuffer, INT8U size);
  37. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length);  
  38. //*****************************************************************************************
  39. // CC1100 STROBE, CONTROL AND STATUS REGSITER
  40. #define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
  41. #define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
  42. #define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
  43. #define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
  44. #define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
  45. #define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
  46. #define CCxxx0_PKTLEN       0x06        // Packet length
  47. #define CCxxx0_PKTCTRL1     0x07        // Packet automation control
  48. #define CCxxx0_PKTCTRL0     0x08        // Packet automation control
  49. #define CCxxx0_ADDR         0x09        // Device address
  50. #define CCxxx0_CHANNR       0x0A        // Channel number
  51. #define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
  52. #define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
  53. #define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
  54. #define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
  55. #define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
  56. #define CCxxx0_MDMCFG4      0x10        // Modem configuration
  57. #define CCxxx0_MDMCFG3      0x11        // Modem configuration
  58. #define CCxxx0_MDMCFG2      0x12        // Modem configuration
  59. #define CCxxx0_MDMCFG1      0x13        // Modem configuration
  60. #define CCxxx0_MDMCFG0      0x14        // Modem configuration
  61. #define CCxxx0_DEVIATN      0x15        // Modem deviation setting
  62. #define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
  63. #define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
  64. #define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
  65. #define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
  66. #define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
  67. #define CCxxx0_AGCCTRL2     0x1B        // AGC control
  68. #define CCxxx0_AGCCTRL1     0x1C        // AGC control
  69. #define CCxxx0_AGCCTRL0     0x1D        // AGC control
  70. #define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
  71. #define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
  72. #define CCxxx0_WORCTRL      0x20        // Wake On Radio control
  73. #define CCxxx0_FREND1       0x21        // Front end RX configuration
  74. #define CCxxx0_FREND0       0x22        // Front end TX configuration
  75. #define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
  76. #define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
  77. #define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
  78. #define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
  79. #define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
  80. #define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
  81. #define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
  82. #define CCxxx0_PTEST        0x2A        // Production test
  83. #define CCxxx0_AGCTEST      0x2B        // AGC test
  84. #define CCxxx0_TEST2        0x2C        // Various test settings
  85. #define CCxxx0_TEST1        0x2D        // Various test settings
  86. #define CCxxx0_TEST0        0x2E        // Various test settings
  87. // Strobe commands
  88. #define CCxxx0_SRES         0x30        // Reset chip.
  89. #define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  90.                                         // If in RX/TX: Go to a wait state where only the synthesizer is
  91.                                         // running (for quick RX / TX turnaround).
  92. #define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
  93. #define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
  94.                                         // (enables quick start).
  95. #define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
  96.                                         // MCSM0.FS_AUTOCAL=1.
  97. #define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
  98.                                         // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
  99.                                         // Only go to TX if channel is clear.
  100. #define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
  101.                                         // Wake-On-Radio mode if applicable.
  102. #define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
  103. #define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
  104. #define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
  105. #define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
  106. #define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
  107. #define CCxxx0_SWORRST      0x3C        // Reset real time clock.
  108. #define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
  109.                                         // INT8Us for simpler software.
  110. #define CCxxx0_PARTNUM      0x30
  111. #define CCxxx0_VERSION      0x31
  112. #define CCxxx0_FREQEST      0x32
  113. #define CCxxx0_LQI          0x33
  114. #define CCxxx0_RSSI         0x34
  115. #define CCxxx0_MARCSTATE    0x35
  116. #define CCxxx0_WORTIME1     0x36
  117. #define CCxxx0_WORTIME0     0x37
  118. #define CCxxx0_PKTSTATUS    0x38
  119. #define CCxxx0_VCO_VC_DAC   0x39
  120. #define CCxxx0_TXBYTES      0x3A
  121. #define CCxxx0_RXBYTES      0x3B
  122. #define CCxxx0_PATABLE      0x3E
  123. #define CCxxx0_TXFIFO       0x3F
  124. #define CCxxx0_RXFIFO       0x3F

  125. // RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
  126. typedef struct S_RF_SETTINGS
  127. {
  128. INT8U FSCTRL2;  //自已加的
  129.     INT8U FSCTRL1;   // Frequency synthesizer control.
  130.     INT8U FSCTRL0;   // Frequency synthesizer control.
  131.     INT8U FREQ2;     // Frequency control word, high INT8U.
  132.     INT8U FREQ1;     // Frequency control word, middle INT8U.
  133.     INT8U FREQ0;     // Frequency control word, low INT8U.
  134.     INT8U MDMCFG4;   // Modem configuration.
  135.     INT8U MDMCFG3;   // Modem configuration.
  136.     INT8U MDMCFG2;   // Modem configuration.
  137.     INT8U MDMCFG1;   // Modem configuration.
  138.     INT8U MDMCFG0;   // Modem configuration.
  139.     INT8U CHANNR;    // Channel number.
  140.     INT8U DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
  141.     INT8U FREND1;    // Front end RX configuration.
  142.     INT8U FREND0;    // Front end RX configuration.
  143.     INT8U MCSM0;     // Main Radio Control State Machine configuration.
  144.     INT8U FOCCFG;    // Frequency Offset Compensation Configuration.
  145.     INT8U BSCFG;     // Bit synchronization Configuration.
  146.     INT8U AGCCTRL2;  // AGC control.
  147. INT8U AGCCTRL1;  // AGC control.
  148.     INT8U AGCCTRL0;  // AGC control.
  149.     INT8U FSCAL3;    // Frequency synthesizer calibration.
  150.     INT8U FSCAL2;    // Frequency synthesizer calibration.
  151. INT8U FSCAL1;    // Frequency synthesizer calibration.
  152.     INT8U FSCAL0;    // Frequency synthesizer calibration.
  153.     INT8U FSTEST;    // Frequency synthesizer calibration control
  154.     INT8U TEST2;     // Various test settings.
  155.     INT8U TEST1;     // Various test settings.
  156.     INT8U TEST0;     // Various test settings.
  157.     INT8U IOCFG2;    // GDO2 output pin configuration
  158.     INT8U IOCFG0;    // GDO0 output pin configuration
  159.     INT8U PKTCTRL1;  // Packet automation control.
  160.     INT8U PKTCTRL0;  // Packet automation control.
  161.     INT8U ADDR;      // Device address.
  162.     INT8U PKTLEN;    // Packet length.
  163. } RF_SETTINGS;
  164. //-------------以下波特率为38.4K---------------------------//
  165. //---------------------------------------------------------
  166. const RF_SETTINGS rfSettings =
  167. {
  168.     0x00,
  169.     0x08,   // FSCTRL1   Frequency synthesizer control.    for  38.4K
  170.     0x00,   // FSCTRL0   Frequency synthesizer control.
  171.     0x10,   // FREQ2     Frequency control word, high byte.
  172.     0xA7,   // FREQ1     Frequency control word, middle byte.
  173.     0x62,   // FREQ0     Frequency control word, low byte.
  174.     0xCA,   // MDMCFG4   Modem configuration.     for 38.4K
  175.     0x83,   // MDMCFG3   Modem configuration.     for 38.4K
  176.     0x03,   // MDMCFG2   Modem configuration.     for 38.4K
  177.     0x22,   // MDMCFG1   Modem configuration.
  178.     0xF8,   // MDMCFG0   Modem configuration.
  179.     0x00,   // CHANNR    Channel number.
  180.     0x34,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).   for 38.4K
  181.     0x56,   // FREND1    Front end RX configuration.   for 38.4K
  182.     0x10,   // FREND0    Front end RX configuration.
  183.     0x18,   // MCSM0     Main Radio Control State Machine configuration.
  184.     0x16,   // FOCCFG    Frequency Offset Compensation Configuration.   for 38.4K
  185.     0x6C,   // BSCFG     Bit synchronization Configuration.             for 38.4K
  186.     0x43,   // AGCCTRL2  AGC control.       for 38.4K                              
  187.     0x40,   // AGCCTRL1  AGC control.       for 38.4K
  188.     0x91,   // AGCCTRL0  AGC control.       for 38.4K
  189.     0xE9,   // FSCAL3    Frequency synthesizer calibration.   for 38.4k
  190.     0x2A,   // FSCAL2    Frequency synthesizer calibration.   for 38.4K
  191.     0x00,   // FSCAL1    Frequency synthesizer calibration.   for 38.4K
  192.     0x1f,   // FSCAL0    Frequency synthesizer calibration.   for 38.4K
  193.     0x59,   // FSTEST    Frequency synthesizer calibration.
  194.     0x81,   // TEST2     Various test settings.
  195.     0x35,   // TEST1     Various test settings.
  196.     0x09,   // TEST0     Various test settings.
  197.     0x0B,   // IOCFG2    GDO2 output pin configuration.
  198.     0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.
  199.     0x04,   // PKTCTRL1  Packet automation control.
  200.     0x05,   // PKTCTRL0  Packet automation control.
  201.     0x00,   // ADDR      Device address.
  202.     0x20    // PKTLEN    Packet length.   old  is  0x0c    ,0x20
  203. };
  204. //---------------------------------------

  205. //*****************************************************************************************
  206. //函数名:delay(unsigned int s)
  207. //输入:时间
  208. //输出:无
  209. //功能描述:普通廷时,内部用
  210. //*****************************************************************************************  
  211. static void delay(unsigned int s)
  212. {
  213. unsigned int i;
  214. for(i=0; i<s; i++);
  215. for(i=0; i<s; i++);
  216. }

  217. void halWait(INT16U timeout)
  218. {
  219.     do {
  220.                 _NOP();
  221.   _NOP();
  222.   _NOP();
  223.   _NOP();
  224.   _NOP();
  225.   _NOP();
  226.   _NOP();
  227.   _NOP();
  228.   _NOP();
  229.   _NOP();
  230.   _NOP();
  231.   _NOP();
  232.   _NOP();
  233.   _NOP();
  234.   _NOP();
  235.     } while (--timeout);
  236. }
  237. void SpiInit(void)
  238. {
  239. CC1100_CSN_0;
  240. CC1100_SCK_0;
  241. CC1100_CSN_1;
  242. }
  243. //*****************************************************************************************
  244. //函数名:SpisendByte(INT8U dat)
  245. //输入:发送的数据
  246. //输出:无
  247. //功能描述:SPI发送一个字节
  248. //*****************************************************************************************
  249. INT8U SpiTxRxByte(INT8U dat)
  250. {
  251. INT8U i,temp;
  252. temp = 0;

  253. CC1100_SCK_0;
  254. for(i=0; i<8; i++)
  255. {
  256.   if(dat & 0x80)
  257.   {
  258.    CC1100_MOSI_1;
  259.   }
  260.   else CC1100_MOSI_0;
  261.   dat <<= 1;
  262.   CC1100_SCK_1 ;
  263. //  _nop_();
  264.   temp <<= 1;
  265.   if(CC1100_MISO_0)temp++;
  266.   CC1100_SCK_0;
  267. //  _nop_();
  268. }
  269. return temp;
  270. }

  271. //*****************************************************************************************
  272. //函数名:void POWER_UP_RESET_CC1100(void)
  273. //输入:无
  274. //输出:无
  275. //功能描述:上电复位CC1100
  276. //*****************************************************************************************
  277. void POWER_UP_RESET_CC1100(void)
  278. {
  279. CC1100_CSN_1 ;
  280. halWait(1);
  281. CC1100_CSN_0;
  282. halWait(1);
  283. CC1100_CSN_1;
  284. halWait(41);
  285. RESET_CC1100();     //复位CC1100
  286. }
  287. //*****************************************************************************************
  288. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  289. //输入:地址和配置字
  290. //输出:无
  291. //功能描述:SPI写寄存器
  292. //*****************************************************************************************
  293. void halSpiWriteReg(INT8U addr, INT8U value)
  294. {
  295.     CC1100_CSN_0 ;
  296.     while (CC1100_MISO_0);
  297.     SpiTxRxByte(addr);  //写地址
  298.     SpiTxRxByte(value);  //写入配置
  299.     CC1100_CSN_1;
  300. }
  301. //*****************************************************************************************
  302. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  303. //输入:地址,写入缓冲区,写入个数
  304. //输出:无
  305. //功能描述:SPI连续写配置寄存器
  306. //*****************************************************************************************
  307. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  308. {
  309.     INT8U i, temp;
  310. temp = addr | WRITE_BURST;
  311.     CC1100_CSN_0;
  312.     while (CC1100_MISO_0);
  313.     SpiTxRxByte(temp);
  314.     for (i = 0; i < count; i++)
  315.   {
  316.         SpiTxRxByte(buffer[i]);
  317.     }
  318.     CC1100_CSN_1 ;
  319. }
  320. //*****************************************************************************************
  321. //函数名:void halSpiStrobe(INT8U strobe)
  322. //输入:命令
  323. //输出:无
  324. //功能描述:SPI写命令
  325. //*****************************************************************************************
  326. void halSpiStrobe(INT8U strobe)
  327. {
  328.     CC1100_CSN_0 ;
  329.     while (CC1100_MISO_0);
  330.     SpiTxRxByte(strobe);  //写入命令
  331.     CC1100_CSN_1 ;
  332. }


  333. //*****************************************************************************************
  334. //函数名:INT8U halSpiReadReg(INT8U addr)
  335. //输入:地址
  336. //输出:该寄存器的配置字
  337. //功能描述:SPI读寄存器
  338. //*****************************************************************************************
  339. INT8U halSpiReadReg(INT8U addr)
  340. {
  341. INT8U temp, value;
  342.     temp = addr|READ_SINGLE;//读寄存器命令
  343. CC1100_CSN_0;
  344. while (CC1100_MISO_0);
  345. SpiTxRxByte(temp);
  346. value = SpiTxRxByte(0);
  347. CC1100_CSN_1 ;
  348. return value;
  349. }

  350. //*****************************************************************************************
  351. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  352. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  353. //输出:无
  354. //功能描述:SPI连续写配置寄存器
  355. //*****************************************************************************************
  356. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  357. {
  358.     INT8U i,temp;
  359. temp = addr | READ_BURST;  //写入要读的配置寄存器地址和读命令
  360.     CC1100_CSN_0 ;
  361.     while (CC1100_MISO_0);
  362. SpiTxRxByte(temp);   
  363.     for (i = 0; i < count; i++)
  364. {
  365.         buffer[i] = SpiTxRxByte(0);
  366.     }
  367.     CC1100_CSN_1;
  368. }

  369. //*****************************************************************************************
  370. //函数名:INT8U halSpiReadReg(INT8U addr)
  371. //输入:地址
  372. //输出:该状态寄存器当前值
  373. //功能描述:SPI读状态寄存器
  374. //*****************************************************************************************
  375. INT8U halSpiReadStatus(INT8U addr)
  376. {
  377.     INT8U value,temp;
  378. temp = addr | READ_BURST;  //写入要读的状态寄存器的地址同时写入读命令
  379.     CC1100_CSN_0 ;
  380.     while (CC1100_MISO_0);
  381.     SpiTxRxByte(temp);
  382. value = SpiTxRxByte(0);
  383.     CC1100_CSN_1 ;
  384. return value;
  385. }
  386. //*****************************************************************************************
  387. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  388. //输入:无
  389. //输出:无
  390. //功能描述:配置CC1100的寄存器
  391. //*****************************************************************************************
  392. void halRfWriteRfSettings(void)
  393. {
  394. halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);//自已加的
  395.     // Write register settings
  396.     halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
  397.     halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
  398.     halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
  399.     halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
  400.     halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
  401.     halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
  402.     halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
  403.     halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
  404.     halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
  405.     halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
  406.     halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
  407.     halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
  408.     halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
  409.     halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
  410.     halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
  411.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
  412.     halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
  413.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  414.     halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  415.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  416.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
  417.     halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
  418.     halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
  419.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
  420.     halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
  421.     halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
  422.     halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
  423.     halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
  424.     halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
  425.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);   
  426.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  427.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  428.     halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
  429.     halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
  430. }
  431. //*****************************************************************************************
  432. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  433. //输入:发送的缓冲区,发送数据个数
  434. //输出:无
  435. //功能描述:CC1100发送一组数据
  436. //*****************************************************************************************
  437. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  438. {
  439. halSpiWriteReg(CCxxx0_TXFIFO, size);
  440.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
  441.         halSpiStrobe(CCxxx0_STX);  //进入发送模式发送数据
  442.         // Wait for GDO0 to be set -> sync transmitted
  443.         while (CC1100_GDO0_1);
  444.         // Wait for GDO0 to be cleared -> end of packet
  445.         while (CC1100_GDO0_0);
  446. halSpiStrobe(CCxxx0_SFTX);
  447. }

  448. void setRxMode(void)
  449. {
  450.     halSpiStrobe(CCxxx0_SRX);  //进入接收状态
  451. }
  452. /*
  453. // Bit masks corresponding to STATE[2:0] in the status byte returned on MISO
  454. #define CCxx00_STATE_BM                 0x70
  455. #define CCxx00_FIFO_BYTES_AVAILABLE_BM  0x0F
  456. #define CCxx00_STATE_TX_BM              0x20
  457. #define CCxx00_STATE_TX_UNDERFLOW_BM    0x70
  458. #define CCxx00_STATE_RX_BM              0x10
  459. #define CCxx00_STATE_RX_OVERFLOW_BM     0x60
  460. #define CCxx00_STATE_IDLE_BM            0x00
  461. static INT8U RfGetRxStatus(void)
  462. {
  463. INT8U temp, spiRxStatus1,spiRxStatus2;
  464. INT8U i=4;// 循环测试次数
  465.     temp = CCxxx0_SNOP|READ_SINGLE;//读寄存器命令
  466. CSN = 0;
  467. while (MISO);
  468. SpiTxRxByte(temp);
  469. spiRxStatus1 = SpiTxRxByte(0);
  470. do
  471. {
  472.   SpiTxRxByte(temp);
  473.   spiRxStatus2 = SpiTxRxByte(0);
  474.   if(spiRxStatus1 == spiRxStatus2)
  475.   {
  476.    if( (spiRxStatus1 & CCxx00_STATE_BM) == CCxx00_STATE_RX_OVERFLOW_BM)
  477.    {
  478.                halSpiStrobe(CCxxx0_SFRX);
  479.       return 0;
  480.    }
  481.       return 1;
  482.   }
  483.    spiRxStatus1=spiRxStatus2;
  484. }
  485. while(i--);
  486. CSN = 1;
  487.     return 0;
  488. }
  489. */
  490. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
  491. {
  492.     INT8U status[2];
  493.     INT8U packetLength;
  494. INT8U i=(*length)*4;  // 具体多少要根据datarate和length来决定
  495.     halSpiStrobe(CCxxx0_SRX);  //进入接收状态
  496. //delay(5);
  497.     //while (!GDO1);
  498.     //while (GDO1);
  499. delay(2);
  500. while (CC1100_GDO0_1)
  501. {
  502.   delay(2);
  503.   --i;
  504.   if(i<1)
  505.      return 0;      
  506. }  
  507.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  508. {
  509.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  510.         if (packetLength <= *length)   //如果所要的有效数据长度小于等于接收到的数据包的长度
  511.   {
  512.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  513.             *length = packetLength;    //把接收数据长度的修改为当前数据的长度
  514.         
  515.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  516.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);  //读出CRC校验位
  517.    halSpiStrobe(CCxxx0_SFRX);  //清洗接收缓冲区
  518.             return (status[1] & CRC_OK);   //如果校验成功返回接收成功
  519.         }
  520.    else
  521.   {
  522.             *length = packetLength;
  523.             halSpiStrobe(CCxxx0_SFRX);  //清洗接收缓冲区
  524.             return 0;
  525.         }
  526.     }
  527. else
  528.   return 0;
  529. }
  530. //*****************************************************************************************
  531. //函数名:void RESET_CC1100(void)
  532. //输入:无
  533. //输出:无
  534. //功能描述:复位CC1100
  535. //*****************************************************************************************
  536. void RESET_CC1100(void)
  537. {
  538. CC1100_CSN_0;
  539. while (CC1100_MISO_1);
  540.         SpiTxRxByte(CCxxx0_SRES);   //写入复位命令
  541. while (CC1100_MISO_1);
  542.         CC1100_CSN_1;
  543. }
  544. /*****************************************************************************************
  545. //函数名:CpuInit()
  546. //输入:无
  547. //输出:无
  548. //功能描述:SPI初始化程序
  549. /*****************************************************************************************/
  550. void CpuInit(void)
  551. {
  552. SpiInit();
  553. delay(5000);
  554. }

  555. //*************************************************************************
  556. //               MSP430串口初始化
  557. //*************************************************************************
  558. void UART_Init()
  559. {
  560.   U0CTL|=SWRST;               //复位SWRST
  561.   U0CTL|=CHAR;                //8位数据模式
  562.   U0TCTL|=SSEL1;              //SMCLK为串口时钟
  563.   U0BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
  564.   U0BR0=baud_l;               //N=UBR+(UxMCTL)/8
  565.   U0MCTL=0x00;                //微调寄存器为0,波特率9600bps
  566.   ME1|=UTXE0;                 //UART0发送使能
  567.   ME1|=URXE0;                 //UART0接收使能
  568.   U0CTL&=~SWRST;
  569.   IE1|=URXIE0;                //接收中断使能位
  570.   
  571.   P3SEL|= BIT4;               //设置IO口为普通I/O模式
  572.   P3DIR|= BIT4;               //设置IO口方向为输出
  573.   P3SEL|= BIT5;
  574. }
  575. //*************************************************************************
  576. //              串口0发送数据函数
  577. //*************************************************************************
  578. void Send_Byte(uchar data)
  579. {
  580.   while((IFG1&UTXIFG0)==0);          //发送寄存器空的时候发送数据
  581.     U0TXBUF=data;
  582. }
  583. //*************************************************************************
  584. //               处理来自串口 0 的接收中断
  585. //*************************************************************************
  586. #pragma vector=UART0RX_VECTOR
  587. __interrupt void UART0_RX_ISR(void)
  588. {
  589.   uchar data=0;
  590.   data=U0RXBUF;                       //接收到的数据存起来
  591.   Send_Byte(data);                    //将接收到的数据再发送出去
  592. }
  593. //*************************************************************************
  594. //            处理来自串口 0 的发送中断,预留
  595. //*************************************************************************
  596. #pragma vector=UART0TX_VECTOR
  597. __interrupt void UART0_TX_ISR(void)
  598. {
  599. }
  600. //*************************************************************************
  601. //           主函数
  602. //*************************************************************************
  603. void main(void)
  604. {
  605.     INT8U n;
  606.     INT8U TxBuf[8]={0};  // 8字节, 如果需要更长的数据包,请正确设置
  607.   WDT_Init();                         //看门狗设置
  608.   Clock_Init();                       //系统时钟设置
  609.   UART_Init();                        //串口设置初始化
  610.   _EINT();                            //开中断

  611. CpuInit();

  612.         
  613. POWER_UP_RESET_CC1100();
  614. halRfWriteRfSettings();
  615. halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
  616. //TxBuf[0] = 8 ;
  617. TxBuf[1] = 1 ;
  618. TxBuf[2] = 1 ;
  619. // halRfSendPacket(TxBuf,8); // Transmit Tx buffer data
  620. delay(6000);
  621.   
  622.   while(1)                            //无限循环
  623.     {
  624.        TxBuf[1] = 1 ;
  625.        for(n=16; n>=1; n--)
  626.                {
  627.           halRfSendPacket(TxBuf,8); // Transmit Tx buffer data  发送16个数据包,总计耗时120ms
  628.        delay(1);                   // delay(200)=10ms
  629.                }
  630.    TxBuf[1] = 0xff;
  631.    TxBuf[2] = 0xff;
  632.       delay(6000);
  633.       
  634.     }
  635. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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