nRF24L01_API.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "nRF24L01_API.h"
  2. void delay_us ( uchar num )
  3. {
  4. uchar i;
  5. for ( i = 0; i < num; i++ )
  6. {
  7. #ifdef N76E003_IAR
  8. asm ( "nop" );
  9. #else
  10. nop;
  11. #endif
  12. }
  13. }
  14. /***************************************************************/
  15. /*******************************************************************/
  16. uchar SPI_RW ( uchar byte )
  17. {
  18. uchar bit_ctr;
  19. for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ ) // 输出8位
  20. {
  21. NRF_MOSI = ( byte & 0x80 ); // MSB TO MOSI
  22. byte = ( byte << 1 ); // shift next bit to MSB
  23. NRF_SCK = 1;
  24. byte |= NRF_MISO; // capture current MISO bit
  25. NRF_SCK = 0;
  26. }
  27. return byte;
  28. }
  29. /*********************************************/
  30. /* 函数功能:给24L01的寄存器写值(一个字节) */
  31. /* 入口参数:reg 要写的寄存器地址 */
  32. /* value 给寄存器写的值 */
  33. /* 出口参数:status 状态值 */
  34. /*********************************************/
  35. uchar NRF24L01_Write_Reg ( uchar reg, uchar value )
  36. {
  37. uchar status;
  38. NRF_CSN = 0; //CSN=0;
  39. status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
  40. SPI_RW ( value );
  41. NRF_CSN = 1; //CSN=1;
  42. return status;
  43. }
  44. /*************************************************/
  45. /* 函数功能:读24L01的寄存器值 (一个字节) */
  46. /* 入口参数:reg 要读的寄存器地址 */
  47. /* 出口参数:value 读出寄存器的值 */
  48. /*************************************************/
  49. uchar NRF24L01_Read_Reg ( uchar reg )
  50. {
  51. uchar value;
  52. NRF_CSN = 0; //CSN=0;
  53. SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
  54. value = SPI_RW ( NOP );
  55. NRF_CSN = 1; //CSN=1;
  56. return value;
  57. }
  58. /*********************************************/
  59. /* 函数功能:读24L01的寄存器值(多个字节) */
  60. /* 入口参数:reg 寄存器地址 */
  61. /* *pBuf 读出寄存器值的存放数组 */
  62. /* len 数组字节长度 */
  63. /* 出口参数:status 状态值 */
  64. /*********************************************/
  65. uchar NRF24L01_Read_Buf ( uchar reg, uchar *pBuf, uchar len )
  66. {
  67. uchar status, u8_ctr;
  68. NRF_CSN = 0; //CSN=0
  69. status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
  70. for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
  71. {
  72. pBuf[u8_ctr] = SPI_RW ( 0XFF ); //读出数据
  73. }
  74. NRF_CSN = 1; //CSN=1
  75. return status; //返回读到的状态值
  76. }
  77. /**********************************************/
  78. /* 函数功能:给24L01的寄存器写值(多个字节) */
  79. /* 入口参数:reg 要写的寄存器地址 */
  80. /* *pBuf 值的存放数组 */
  81. /* len 数组字节长度 */
  82. /**********************************************/
  83. uchar NRF24L01_Write_Buf ( uchar reg, uchar *pBuf, uchar len )
  84. {
  85. uchar status, u8_ctr;
  86. NRF_CSN = 0;
  87. status = SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
  88. for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
  89. {
  90. SPI_RW ( *pBuf++ ); //写入数据
  91. }
  92. NRF_CSN = 1;
  93. return status; //返回读到的状态值
  94. }
  95. /*********************************************/
  96. /* 函数功能:24L01接收数据 */
  97. /* 入口参数:rxbuf 接收数据数组 */
  98. /* 返回值: 0 成功收到数据 */
  99. /* 1 没有收到数据 */
  100. /*********************************************/
  101. uchar NRF24L01_RxPacket ( uchar *rxbuf )
  102. {
  103. uchar state0, state1;
  104. uchar res = 0;
  105. state0 = state1 = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
  106. NRF24L01_Write_Reg ( WRITE_REG + STATUS, state1 ); //清除TX_DS或MAX_RT中断标志
  107. if ( state0 & RX_OK ) //接收到数据
  108. {
  109. NRF_CE = 0;
  110. NRF24L01_Read_Buf ( RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH ); //读取数据
  111. NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
  112. NRF_CE = 1;
  113. delay_us ( 150 );
  114. res = 1;
  115. }
  116. return res;//没收到任何数据
  117. }
  118. /**********************************************/
  119. /* 函数功能:设置24L01为发送模式 */
  120. /* 入口参数:txbuf 发送数据数组 */
  121. /* 返回值; 0x10 达到最大重发次数,发送失败*/
  122. /* 0x20 成功发送完成 */
  123. /* 0xff 发送失败 */
  124. /**********************************************/
  125. uchar NRF24L01_TxPacket ( uchar *txbuf )
  126. {
  127. uchar state;
  128. NRF_CE = 0; //CE拉低,使能24L01配置
  129. NRF24L01_Write_Buf ( WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH ); //写数据到TX BUF 32个字节
  130. NRF_CE = 1; //CE置高,使能发送
  131. while ( NRF_IRQ == 1 ); //等待发送完成
  132. state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
  133. NRF24L01_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
  134. if ( state & MAX_TX ) //达到最大重发次数
  135. {
  136. NRF24L01_Write_Reg ( FLUSH_TX, 0xff ); //清除TX FIFO寄存器
  137. return MAX_TX;
  138. }
  139. if ( state & TX_OK ) //发送完成
  140. {
  141. return TX_OK;
  142. }
  143. return 0xff; //发送失败
  144. }
  145. /********************************************/
  146. /* 函数功能:检测24L01是否存在 */
  147. /* 返回值; 0 存在 */
  148. /* 1 不存在 */
  149. /********************************************/
  150. uchar NRF24L01_Check ( void )
  151. {
  152. uchar check_in_buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
  153. uchar check_out_buf[5] = {0x00};
  154. NRF_SCK = 0;
  155. NRF_CSN = 1;
  156. NRF_CE = 0;
  157. NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, check_in_buf, 5 );
  158. NRF24L01_Read_Buf ( READ_REG + TX_ADDR, check_out_buf, 5 );
  159. if ( ( check_out_buf[0] == 0x11 ) && \
  160. ( check_out_buf[1] == 0x22 ) && \
  161. ( check_out_buf[2] == 0x33 ) && \
  162. ( check_out_buf[3] == 0x44 ) && \
  163. ( check_out_buf[4] == 0x55 ) ) return 0;
  164. else return 1;
  165. }
  166. /**********************************************/
  167. /* 函数功能:24L01初始化 */
  168. /* 入口参数:PLOAD_WIDTH 有效数据宽度 */
  169. /* TX_ADR 发送地址 */
  170. /* TX_ADDR_WIDTH 发送地址宽度 */
  171. /* RX_ADR 接收发送地址 */
  172. /* RX_ADDR_WIDTH 接收地址宽度 */
  173. /* RATE 有效数据宽度 */
  174. /* 返回值 ;无 */
  175. /**********************************************/
  176. void NRF24L01_RT_Init ( uchar PLOAD_WIDTH, uchar *TX_ADR, uchar TX_ADDR_WIDTH, uchar *RX_ADR, uchar RX_ADDR_WIDTH, uchar RATE )
  177. {
  178. NRF_CE = 0;
  179. NRF24L01_Write_Reg ( WRITE_REG + RX_PW_P0, PLOAD_WIDTH ); //设置接收数据长度,本次设置为32字节
  180. NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
  181. NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, TX_ADR, TX_ADDR_WIDTH ); //写TX节点地址
  182. NRF24L01_Write_Buf ( WRITE_REG + RX_ADDR_P0, RX_ADR, RX_ADDR_WIDTH ); //设置RX节点地址,主要为了使能ACK
  183. NRF24L01_Write_Reg ( WRITE_REG + EN_AA, 0x01 ); //使能通道0的自动应答
  184. NRF24L01_Write_Reg ( WRITE_REG + EN_RXADDR, 0x01 ); //使能通道0的接收地址
  185. NRF24L01_Write_Reg ( WRITE_REG + SETUP_RETR, 0x1a ); //设置自动重发间隔时间:500us + 86us;最大自动重发次数:10(a)次
  186. NRF24L01_Write_Reg ( WRITE_REG + RF_CH, 0 ); //设置RF通道为40 收发必须一致,0为2.4GHz
  187. NRF24L01_Write_Reg ( WRITE_REG + RF_SETUP, RATE ); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启
  188. NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  189. NRF_CE = 1; //CE置高,使能发送
  190. }
  191. /**********************************************/
  192. /* 函数功能:发射函数 */
  193. /* 入口参数:buf 发送寄存器 */
  194. /* 返回值 ;无 */
  195. /**********************************************/
  196. uchar SEND_BUF ( uchar *buf )
  197. {
  198. uchar state;
  199. NRF_CE = 0;
  200. NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0e );
  201. NRF_CE = 1;
  202. delay_us ( 15 );
  203. state = NRF24L01_TxPacket ( buf );
  204. NRF_CE = 0;
  205. NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f );
  206. NRF_CE = 1;
  207. return state;
  208. }