用NRF905模块控制灯的状态变化!程序实在找不出问题

2019-07-15 16:49发布

  1. #include <msp430.h>
  2. //==============================================================================
  3. #define  uchar   unsigned char
  4. #define  uint    unsigned int
  5. #define  uclong  unsigned long
  6. //==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
  7. #define  TXEN_0     P2OUT &=~BIT0          //输出0
  8. #define  TXEN_1     P2OUT |= BIT0          //输出1
  9. //==============================================================================
  10. #define  TRX_CE_0   P2OUT &=~BIT1
  11. #define  TRX_CE_1   P2OUT |= BIT1
  12. //==============================================================================
  13. #define  PWR_0      P2OUT &=~BIT2
  14. #define  PWR_1      P2OUT |= BIT2
  15. //===================================主入从出===================================
  16. #define  MISO_0     P1OUT &=~BIT2      
  17. #define  MISO_1     P1OUT |= BIT2         
  18. //==================================主出从入====================================
  19. #define  MOSI_0     P1OUT &=~BIT1         
  20. #define  MOSI_1     P1OUT |= BIT1        
  21. //===================================SPI时钟端口================================
  22. #define  SCK_0      P1OUT &=~BIT4         
  23. #define  SCK_1      P1OUT |= BIT4         
  24. //===================================SPI使能端口=================================
  25. #define  CSN_0      P1OUT &=~BIT5
  26. #define  CSN_1      P1OUT |= BIT5
  27. //==================================以下为状态端口==============================
  28. //===========================AM  地址匹配=======================================
  29. #define  AM_0       P2OUT &=~BIT5      
  30. #define  AM_1       P2OUT |= BIT5
  31. //=================================DR 数据接收状态==============================
  32. #define  DR_0       P2OUT &=~BIT4
  33. #define  DR_1       P2OUT |= BIT4
  34. //=====================================CD 载波侦听状态==========================
  35. #define  CD_0       P2OUT &=~BIT3
  36. #define  CD_1       P2OUT |= BIT3
  37. //==============================================================================
  38. #define  LED1_0     P1OUT &=~BIT0          //输出0
  39. #define  LED1_1     P1OUT |= BIT0          //输出1

  40. //===========================NRF905:SPI指令=====================================
  41. #define WC                0x00
  42. #define RC                0x10
  43. #define WTP                0x20
  44. #define RTP                0x21
  45. #define WTA                0x22
  46. #define RTA                0x23
  47. #define RRP                0x24
  48. //==========================32字节发送数据收发缓冲区============================
  49. #define TxRxBuf_Len 4
  50. char TxBuf[TxRxBuf_Len];
  51. char RxBuf[TxRxBuf_Len];
  52. //==========================NRF905:10寄存器配置================================
  53. unsigned char  RFConf[11]=
  54. {
  55.   WC,                                //SPI写操作命令
  56.   0x4c,                             //CH_NO,配置频段在430MHZ
  57.   0x0C,                             //输出功率为10db,不重发,节电为正常模式
  58.   0x44,                             //地址宽度设置,为4字节
  59.   0x04,0x04,                        //接收发送有效数据长度为4字节
  60.   0xCC,0xCC,0xCC,0xCC,              //接收地址
  61.   0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
  62. };
  63. char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
  64. char DATA_BUF;
  65. /*****************************************************************************
  66. 系统初始化
  67. ******************************************************************************/
  68. void InitSys()
  69. {
  70.    unsigned int iq0;
  71.    _DINT();
  72.    BCSCTL1 &=~XT2OFF;
  73.    do
  74.    {
  75.       IFG1 &= ~OFIFG;                                                        // 清除振荡器失效标志
  76.   for (iq0 = 0xFF; iq0 > 0; iq0--);        // 延时,等待XT2起振
  77.    }
  78.    while ((IFG1 & OFIFG) != 0);                // 判断XT2是否起振               
  79.    BCSCTL2 =SELM1+SELS;                      //MCLK,SMCLK时钟为XT2
  80.                                                         //???USART0
  81. }
  82. //==============================================================================
  83. void LED_IO_set(void)
  84. {   
  85.         P1DIR |= 0x01;      
  86. }

  87. //==============================================================================
  88. void KEY_IO_set(void)
  89. {   
  90.              P1REN|=BIT3;
  91.              P1DIR &=~BIT3;         
  92. }
  93. //==========================延时================================================
  94. void Delay(uchar n)
  95. {
  96.         uint i;
  97.         while(n--)
  98.         for(i=0;i<80;i++);
  99. }
  100. //=========================NRF905 SPI读函数(IO模拟SPI时序)==================
  101. unsigned char SpiRead(void)
  102. {
  103.         unsigned char i;
  104.         for (i=0;i<8;i++)
  105.         {
  106.                 DATA_BUF=DATA_BUF<<1;
  107.                 SCK_1;
  108.                 if ((P1IN&0x04))        //读取最高位,保存至最末尾,通过左移位完成整个字节
  109.                 {
  110.                         DATA_BUF|=0x01;
  111.                 }
  112.                 else
  113.                 {
  114.                         DATA_BUF&=~(0x01);
  115.                 }
  116.                 SCK_0;
  117.          }
  118.          return DATA_BUF;
  119. }
  120. //=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
  121. void SpiWrite(unsigned char send)
  122. {
  123.         unsigned char i;
  124.         DATA_BUF=send;
  125.         for (i=0;i<8;i++)
  126.         {
  127.         if (((DATA_BUF&0x80) != 0))        //总是发送最高位
  128.         {
  129.             MOSI_1;
  130.          }
  131.         else
  132.          {
  133.             MOSI_0;
  134.          }
  135.         SCK_1;
  136.         DATA_BUF=DATA_BUF<<1;
  137.         SCK_0;
  138.         }
  139. }

  140. //===========================初始化nRF905=======================================
  141. void nRF905_IO_set(void)
  142. {
  143.         P2DIR |= 0x07; P2DIR &= 0xC7;   P2SEL&=0x84;        
  144.         P1DIR |= 0xC0; P1DIR |= 0xFB;   P1SEL&=0xE0;        
  145.         CSN_1;                                            // Spi         disable
  146.         SCK_0;                                          // Spi clock line init low
  147.         PWR_1;                                         // nRF905 power on
  148.         TRX_CE_0;                                // Set nRF905 in standby mode
  149.         TXEN_0;                                        // set radio in Rx mode
  150. }
  151. //==================================初始化NRF905================================
  152. void Config905(void)
  153. {
  154.         uchar i;
  155.         CSN_0;                                                // Spi enable for write a spi command
  156.         for (i=0;i<11;i++)        // Write configration words  写放配置字
  157.         {
  158.            SpiWrite(RFConf<i>);
  159.         }
  160.         CSN_1;                                        //关闭SPI
  161. }
  162. //=========================NRF905装载地址+数据打包+数据发送=====================
  163. void TxPacket(char *data_Bufer)
  164. {
  165.         uchar i;
  166.         CSN_0;
  167.         SpiWrite(WTP);                                // 待发数据装载命令
  168.         for (i=0;i<4;i++)
  169.         {
  170.           SpiWrite(data_Bufer<i>);
  171.         }
  172.         CSN_1;                                  // 关闭SPI
  173.         Delay(1);               
  174.         CSN_0;                                        // 打开SPI
  175.         SpiWrite(WTA);                                // 写入地址要和接收方地址一样
  176.         for (i=0;i<4;i++)                        // 4字节地址
  177.         {
  178.           SpiWrite(TxAddress<i>);
  179.         }
  180.         CSN_1;                                        //关闭SPI
  181.         TRX_CE_1;                                        // Set TRX_CE high,start Tx data transmission
  182.         Delay(10);        // while (DR!=1); 延时时间不能太短
  183.         TRX_CE_0;                                        // Set TRX_CE low
  184. }
  185. //==================================发送模式初始化-=============================
  186. void SetTxMode(void)
  187. {
  188.         TRX_CE_0;
  189.         TXEN_1;
  190.         Delay(1);                                         // Delay for mode change(>=650us)
  191. }

  192. //=========DR检测,当 收到数据后DR置1,当把数据读出来后DR清0=====================
  193. unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
  194. {
  195.         if ((P2IN&0x10))
  196.         {
  197.                 return 1;
  198.         }
  199.         else
  200.         {
  201.                 return 0;
  202.         }
  203. }
  204. //==============================================================================
  205. void SetRxMode(void)
  206. {
  207.         TXEN_0;
  208.         TRX_CE_1;
  209.         Delay(1);                 // delay for mode change(>=650us)
  210. }
  211. //=================================数据接收=====================================
  212. void RxPacket(void)                                                
  213. {
  214.     char i;
  215.     Delay(1);
  216.     Delay(100);
  217.     TRX_CE_0;
  218.     CSN_0;                // SPI使能(Spi enable for write a spi command)
  219.     Delay(1);
  220.     SpiWrite(RRP);      // 读SPI数据命令(Read payload command)
  221. for (i = 0 ;i <4 ;i++)
  222.     {  
  223.       RxBuf<i>=SpiRead();                // Read data and save to buffer   
  224.     }
  225.     CSN_1;
  226.     Delay(10);
  227.     TRX_CE_1;                                                        
  228. }

  229. //==========================NRF905数据接收流程================================
  230. void  RX(void)
  231. {
  232.     SetRxMode();                        // Set nRF905 in Rx mode
  233. //  while (CheckDR()==0);
  234.     Delay(10);
  235.     RxPacket();                // Recive data by nRF905
  236.     Delay(10);
  237. //=============================================================================
  238.     if(RxBuf[0]==0x29)
  239.     {
  240.       P1OUT^=BIT0;
  241.     }
  242.     RxBuf[0]=0x00;
  243. }
  244. //==================================主函数=====================================
  245. void main(void)
  246. {
  247.    char tf;
  248.    WDTCTL = WDTPW + WDTHOLD;
  249.    InitSys();
  250.    nRF905_IO_set();
  251.    LED_IO_set();
  252.    KEY_IO_set();       //KEY端口设置
  253.    Config905();
  254. while(1)
  255.    {
  256.     RX();//接收数据
  257. //==================================================
  258.     if((P1IN&0x08))   //检测按键
  259.       {        
  260.         TxBuf[0]=0x29;tf = 1 ; LED1_1;
  261.       }
  262.      if(tf==1)      //有按键后发送数据
  263.       {
  264.          SetTxMode(); TxPacket(TxBuf);
  265.          tf = 0;        
  266.          TxBuf[0]=0x00;
  267.       }         
  268.    }
  269. }

  270. </i></i></i></i>
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。