非常 有感觉 24l01 模块 一次成功!!!使用 stc12 系列 的 单片机

http://blog.csdn.net/yuweixian/article/details/5752835

[c-sharp]  view plain copy
  1. //#include  
  2.   
  3. typedef unsigned char uchar;  
  4. typedef unsigned char uint;  
  5. //#define uchar unsigned char  
  6. //#define uint unsigned int  
  7. //****************************************IO端口定义***************************************  
  8. sbit    MISO    =P1^4;  
  9. sbit    MOSI    =P1^0;  
  10. sbit    SCK     =P1^1;  
  11. sbit    CE      =P1^3;  
  12. sbit    CSN     =P1^2;  
  13. //*********************************************NRF24L01*************************************  
  14. #define TX_ADR_WIDTH    5       // 5 uints TX address width  
  15. #define RX_ADR_WIDTH    5       // 5 uints RX address width  
  16. #define TX_PLOAD_WIDTH  32      // 20 uints TX payload  
  17. #define RX_PLOAD_WIDTH  32      // 20 uints TX payload  
  18. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};    //本地地址  
  19. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};    //接收地址  
  20. //***************************************NRF24L01寄存器指令*******************************************************  
  21. #define READ_REG        0x00    // 读寄存器指令  
  22. #define WRITE_REG       0x20    // 写寄存器指令  
  23. #define RD_RX_PLOAD     0x61    // 读取接收数据指令  
  24. #define WR_TX_PLOAD     0xA0    // 写待发数据指令  
  25. #define FLUSH_TX        0xE1    // 冲洗发送 FIFO指令  
  26. #define FLUSH_RX        0xE2    // 冲洗接收 FIFO指令  
  27. #define REUSE_TX_PL     0xE3    // 定义重复装载数据指令  
  28. #define NOP             0xFF    // 保留  
  29. //*************************************SPI(nRF24L01)寄存器地址****************************************************  
  30. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式  
  31. #define EN_AA           0x01  // 自动应答功能设置  
  32. #define EN_RXADDR       0x02  // 可用信道设置  
  33. #define SETUP_AW        0x03  // 收发地址宽度设置  
  34. #define SETUP_RETR      0x04  // 自动重发功能设置  
  35. #define RF_CH           0x05  // 工作频率设置  
  36. #define RF_SETUP        0x06  // 发射速率、功耗功能设置  
  37. #define STATUS          0x07  // 状态寄存器  
  38. #define OBSERVE_TX      0x08  // 发送监测功能  
  39. #define CD              0x09  // 地址检测             
  40. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址  
  41. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址  
  42. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址  
  43. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址  
  44. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址  
  45. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址  
  46. #define TX_ADDR         0x10  // 发送地址寄存器  
  47. #define RX_PW_P0        0x11  // 接收频道0接收数据长度  
  48. #define RX_PW_P1        0x12  // 接收频道1接收数据长度  
  49. #define RX_PW_P2        0x13  // 接收频道2接收数据长度  
  50. #define RX_PW_P3        0x14  // 接收频道3接收数据长度  
  51. #define RX_PW_P4        0x15  // 接收频道4接收数据长度  
  52. #define RX_PW_P5        0x16  // 接收频道5接收数据长度  
  53. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置  
  54.   
  55. unsigned char TxBuf_nRF24L01[3]={0,1,2};       
  56. unsigned char RxBuf_nRF24L01[3]={0};  
  57.   
  58. //**************************************************************************************  
  59. void Delay(unsigned int s);  
  60. void inerDelay_us(unsigned char n);  
  61. void init_NRF24L01(void);  
  62. uint SPI_RW(uint uchar);  
  63. uchar SPI_Read(uchar reg);  
  64. void SetRX_Mode(void);  
  65. uint SPI_RW_Reg(uchar reg, uchar value);  
  66. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);  
  67. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);  
  68. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);  
  69. void nRF24L01_TxPacket(unsigned char * tx_buf);  
  70. //*****************************************长延时*****************************************  
  71. void Delay(unsigned int s)  
  72. {  
  73.     unsigned int i;  
  74.     for(i=0; i
  75.     for(i=0; i
  76. }  
  77. //******************************************************************************************  
  78. uint    bdata sta;   //状态标志  
  79. sbit    RX_DR   =sta^6;  
  80. sbit    TX_DS   =sta^5;  
  81. sbit    MAX_RT  =sta^4;  
  82. /******************************************************************************************  
  83. /*延时函数  
  84. /******************************************************************************************/  
  85. void inerDelay_us(unsigned char n)  
  86. {  
  87.     for(;n>0;n--)  
  88.         _nop_();  
  89. }  
  90. /**************************************************************************************** 
  91. /*NRF24L01初始化 
  92. /***************************************************************************************/  
  93. void init_NRF24L01(void)  
  94. {  
  95.     inerDelay_us(100);  
  96.     CE=0;    // chip enable  
  97.     CSN=1;   // Spi disable   
  98.     SCK=0;   // Spi clock line init high  
  99.     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址     
  100.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址  
  101.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答允许   
  102.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21    
  103.     SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致  
  104.     SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节  
  105.     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);         //设置发射速率为1MHZ,发射功率为最大值0dB  
  106.     SetRX_Mode();  
  107. }  
  108. /**************************************************************************************************** 
  109. /*函数:uint SPI_RW(uint uchar) 
  110. /*功能:NRF24L01的SPI写时序 
  111. /****************************************************************************************************/  
  112. uint SPI_RW(uint uchar)  
  113. {  
  114.     uint bit_ctr;  
  115.     for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit  
  116.     {  
  117.         MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI  
  118.         uchar = (uchar << 1);           // shift next bit into MSB..  
  119.         SCK = 1;                      // Set SCK high..  
  120.         uchar |= MISO;                // capture current MISO bit  
  121.         SCK = 0;                      // ..then set SCK low again  
  122.     }  
  123.     return(uchar);                    // return read uchar  
  124. }  
  125. /**************************************************************************************************** 
  126. /*函数:uchar SPI_Read(uchar reg) 
  127. /*功能:NRF24L01的SPI时序 
  128. /****************************************************************************************************/  
  129. uchar SPI_Read(uchar reg)  
  130. {  
  131.     uchar reg_val;  
  132.       
  133.     CSN = 0;                // CSN low, initialize SPI communication...  
  134.     SPI_RW(reg);            // Select register to read from..  
  135.     reg_val = SPI_RW(0);    // ..then read registervalue  
  136.     CSN = 1;                // CSN high, terminate SPI communication  
  137.       
  138.     return(reg_val);        // return register value  
  139. }  
  140. /****************************************************************************************************/  
  141. /*功能:NRF24L01读写寄存器函数 
  142. /****************************************************************************************************/  
  143. uint SPI_RW_Reg(uchar reg, uchar value)  
  144. {  
  145.     uint status;  
  146.       
  147.     CSN = 0;                   // CSN low, init SPI transaction  
  148.     status = SPI_RW(reg);      // select register  
  149.     SPI_RW(value);             // ..and write value to it..  
  150.     CSN = 1;                   // CSN high again  
  151.       
  152.     return(status);            // return nRF24L01 status uchar  
  153. }  
  154. /****************************************************************************************************/  
  155. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) 
  156. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数 
  157. /****************************************************************************************************/  
  158. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)  
  159. {  
  160.     uint status,uchar_ctr;  
  161.       
  162.     CSN = 0;                            // Set CSN low, init SPI tranaction  
  163.     status = SPI_RW(reg);               // Select register to write to and read status uchar  
  164.       
  165.     for(uchar_ctr=0;uchar_ctr
  166.         pBuf[uchar_ctr] = SPI_RW(0);    //   
  167.       
  168.     CSN = 1;                             
  169.       
  170.     return(status);                    // return nRF24L01 status uchar  
  171. }  
  172. /********************************************************************************************************* 
  173. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) 
  174. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 
  175. /*********************************************************************************************************/  
  176. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)  
  177. {  
  178.     uint status,uchar_ctr;  
  179.       
  180.     CSN = 0;            //SPI使能         
  181.     status = SPI_RW(reg);     
  182.     for(uchar_ctr=0; uchar_ctr//  
  183.         SPI_RW(*pBuf++);  
  184.     CSN = 1;           //关闭SPI  
  185.     return(status);    //   
  186. }  
  187. /****************************************************************************************************/  
  188. /*函数:void SetRX_Mode(void) 
  189. /*功能:数据接收配置  
  190. /****************************************************************************************************/  
  191. void SetRX_Mode(void)  
  192. {  
  193.     CE=0;  
  194.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x2f);           // IRQ收发完成中断响应,16位CRC   ,主接收  
  195.     CE = 1;   
  196.     inerDelay_us(200);  
  197. }  
  198. /******************************************************************************************************/  
  199. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) 
  200. /*功能:数据读取后放如rx_buf接收缓冲区中 
  201. /******************************************************************************************************/  
  202. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)  
  203. {  
  204.     unsigned char revale=0;  
  205.     sta=SPI_Read(STATUS);   // 读取状态寄存其来判断数据接收状况  
  206.     if(RX_DR)               // 判断是否接收到数据  
  207.     {  
  208.         CE = 0;             //SPI使能  
  209.         SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer  
  210.         revale =1;          //读取数据完成标志  
  211.     }  
  212.       
  213.     SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志  
  214.       
  215.     SetRX_Mode();  
  216.       
  217.     return revale;  
  218. }  
  219. /*********************************************************************************************************** 
  220. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) 
  221. /*功能:发送 tx_buf中数据 
  222. /**********************************************************************************************************/  
  223. void nRF24L01_TxPacket(unsigned char * tx_buf)  
  224. {  
  225.     CE=0;           //StandBy I模式     
  226.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址  
  227.     SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);              // 装载数据      
  228.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x2e);            // IRQ收发完成中断响应,16位CRC,主发送  
  229.     CE=1;        //置高CE,激发数据发送  
  230.                       //重点注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  231.     inerDelay_us(200);//重点注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  232.                       //重点注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  233.     SetRX_Mode();  
  234. }  

希望有机会能够测试24l01的无线通讯


你可能感兴趣的:(非常 有感觉 24l01 模块 一次成功!!!使用 stc12 系列 的 单片机)