24l01.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include "24l01.h"
  2. #include "myRadio_gpio.h"
  3. const uint8_t TX_ADDRESS[5]={0x34,0x43,0x10,0x10,0x01}; //发送地址
  4. const uint8_t RX_ADDRESS[5]={0x34,0x43,0x10,0x10,0x01}; //发送地址
  5. static uint8_t rf_mode = 0x55;//初始化值,保证第一次能执行
  6. //初始化24L01的IO口
  7. static bool ext3_flag=false;
  8. rfPackage_ts rfRxPackage;
  9. static void delay_us(uint32_t delay_us)
  10. {
  11. uint32_t i = 0;
  12. uint32_t j = 0;
  13. for (i = 0; i < delay_us; i++)
  14. {
  15. for (j = 0; j < 10; j++)
  16. {
  17. ;
  18. }
  19. }
  20. }
  21. void NRF24L01_WriteStrobe(uint8_t strobe)
  22. {
  23. RF_SPI_NSS_L(); //使能SPI传输
  24. SpiReadWrite(strobe);//发送寄存器号
  25. SpiReadWrite(0);//发送寄存器号
  26. RF_SPI_NSS_H(); //禁止SPI传输
  27. }
  28. //SPI写寄存器
  29. //reg:指定寄存器地址
  30. //value:写入的值
  31. uint8_t NRF24L01_Write_Reg(uint8_t reg,uint8_t value)
  32. {
  33. uint8_t status;
  34. RF_SPI_NSS_L(); //使能SPI传输
  35. status = SpiReadWrite(reg);//发送寄存器号
  36. SpiReadWrite(value); //写入寄存器的值
  37. RF_SPI_NSS_H(); //禁止SPI传输
  38. return(status); //返回状态值
  39. }
  40. //读取SPI寄存器值
  41. //reg:要读的寄存器
  42. uint8_t NRF24L01_Read_Reg(uint8_t reg)
  43. {
  44. uint8_t reg_val;
  45. RF_SPI_NSS_L(); //使能SPI传输
  46. SpiReadWrite(reg); //发送寄存器号
  47. reg_val= SpiReadWrite(0XFF);//读取寄存器内容
  48. RF_SPI_NSS_H(); //禁止SPI传输
  49. return(reg_val); //返回状态值
  50. }
  51. //在指定位置读出指定长度的数据
  52. //reg:寄存器(位置)
  53. //*pBuf:数据指针
  54. //len:数据长度
  55. //返回值,此次读到的状态寄存器值
  56. uint8_t NRF24L01_Read_Buf(uint8_t reg,uint8_t *pBuf,uint8_t len)
  57. {
  58. uint8_t status,uint8_t_ctr;
  59. RF_SPI_NSS_L(); //使能SPI传输
  60. status= SpiReadWrite(reg);//发送寄存器值(位置),并读取状态值
  61. for(uint8_t_ctr=0;uint8_t_ctr<len;uint8_t_ctr++)
  62. pBuf[uint8_t_ctr]= SpiReadWrite(0XFF);//读出数据
  63. RF_SPI_NSS_H(); //关闭SPI传输
  64. return status; //返回读到的状态值
  65. }
  66. //在指定位置写指定长度的数据
  67. //reg:寄存器(位置)
  68. //*pBuf:数据指针
  69. //len:数据长度
  70. //返回值,此次读到的状态寄存器值
  71. uint8_t NRF24L01_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t len)
  72. {
  73. uint8_t status,uint8_t_ctr;
  74. RF_SPI_NSS_L(); //使能SPI传输
  75. status = SpiReadWrite(reg);//发送寄存器值(位置),并读取状态值
  76. for(uint8_t_ctr=0; uint8_t_ctr<len; uint8_t_ctr++)
  77. SpiReadWrite(*pBuf++); //写入数据
  78. RF_SPI_NSS_H(); //关闭SPI传输
  79. return status; //返回读到的状态值
  80. }
  81. //检测24L01是否存在
  82. //返回值:0,成功;1,失败
  83. uint8_t NRF24L01_Check(void)
  84. {
  85. uint8_t buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  86. uint8_t i;
  87. // SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
  88. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.
  89. memset(buf,0, 5);
  90. NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址
  91. for(i=0;i<5;i++)if(buf[i]!=0XA5)break;
  92. if(i!=5)return 1;//检测24L01错误
  93. return 0; //检测到24L01
  94. }
  95. //启动NRF24L01发送一次数据
  96. //txbuf:待发送数据首地址
  97. //返回值:发送完成状况
  98. void NRF24L01_TxPacket(uint8_t *txbuf, uint16_t len)
  99. {
  100. RF_NRF_CE_L();
  101. NRF24L01_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
  102. RF_NRF_CE_H(); //启动发送
  103. }
  104. //启动NRF24L01发送一次数据
  105. //txbuf:待发送数据首地址
  106. void NRF24L01_getRxPacket(uint8_t *rxbuf, uint16_t len)
  107. {
  108. NRF24L01_Read_Buf(RD_RX_PLOAD, rxbuf, len);//读取数据
  109. NRF24L01_WriteStrobe(FLUSH_RX);//清除RX FIFO寄存器
  110. }
  111. /**
  112. *
  113. * 设置无线工作模式
  114. * mode
  115. * =CONFIG_RF_MODE_TX,发送
  116. * =CONFIG_RF_MODE_RX,接收
  117. */
  118. void NRF24L01_RfMode(uint8_t mode)//
  119. {
  120. config_tu config;
  121. RF_NRF_CE_L();
  122. config.value = NRF24L01_Read_Reg(NRF_READ_REG + CONFIG);//读取配置寄存器
  123. config.bits.prim_rx = (rf_mode_te)mode;
  124. config.bits.mask_rx_dr = 0;
  125. config.bits.mask_tx_ds = 0;
  126. config.bits.mask_max_rt = 0;
  127. config.bits.pwr_up = 1;
  128. NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, config.value);
  129. if (mode == RF_PRIM_RX)
  130. {
  131. RF_NRF_CE_H();
  132. }
  133. }
  134. /**
  135. *
  136. *
  137. */
  138. status_tu NRF24L01_readStatus(void)
  139. {
  140. status_tu sta;
  141. sta.value = NRF24L01_Read_Reg(STATUS);
  142. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS, sta.value);
  143. return sta;
  144. }
  145. /**
  146. *
  147. * 设置无线发射功率
  148. *
  149. */
  150. void NRF24L01_setRfPower(uint8_t power)
  151. {
  152. rf_setup_tu rf_setup;
  153. RF_NRF_CE_L();
  154. rf_setup.value = NRF24L01_Read_Reg(NRF_READ_REG + RF_SETUP);//读取配置寄存器
  155. rf_setup.bits.rf_pwr = power;
  156. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP, rf_setup.value);
  157. }
  158. /**
  159. *
  160. * 设置无线发射功率
  161. *
  162. */
  163. void NRF24L01_setRfBaudrate(uint32_t br)
  164. {
  165. rf_setup_tu rf_setup;
  166. RF_NRF_CE_L();
  167. rf_setup.value = NRF24L01_Read_Reg(NRF_READ_REG + RF_SETUP);//读取配置寄存器
  168. rf_setup.bits.rf_dr_low = (br & 0x02) >> 1;
  169. rf_setup.bits.rf_dr_high = br & 0x01;
  170. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP, rf_setup.value);
  171. }
  172. /**
  173. *
  174. * 设置无线信道
  175. * 具体频点:2400MHz+ch MHz
  176. */
  177. void NRF24L01_setChannl(uint8_t ch)
  178. {
  179. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH, ch);
  180. }
  181. /**
  182. *
  183. * 进入stb1 mode
  184. */
  185. void NRF24L01_powerDown(void)
  186. {
  187. config_tu config;
  188. RF_NRF_CE_L();
  189. config.value = NRF24L01_Read_Reg(NRF_READ_REG + CONFIG);//读取配置寄存器
  190. config.bits.pwr_up = 0;
  191. NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, config.value);
  192. }
  193. /**
  194. *
  195. * 获取信号强度
  196. */
  197. int8_t NRF24L01_getRssi(void)
  198. {
  199. int8_t rssi = 0;
  200. // RF_NRF_CE_L();
  201. rssi = NRF24L01_Read_Reg(NRF_READ_REG+CD)&0x01;
  202. // RF_NRF_CE_H();
  203. return rssi;
  204. }
  205. /**
  206. *
  207. * 单载波测试
  208. */
  209. void NRF24L01_carrierWave(void)
  210. {
  211. rf_setup_tu rf_setup;
  212. config_tu config;
  213. RF_NRF_CE_L();
  214. config.value = NRF24L01_Read_Reg(NRF_READ_REG + CONFIG);//读取配置寄存器
  215. rf_setup.value = NRF24L01_Read_Reg(NRF_READ_REG + RF_SETUP);
  216. config.bits.pwr_up = 1;
  217. // rf_setup.bits.obsolete = 0;
  218. // rf_setup.bits.rf_pwr = 0x03;
  219. rf_setup.bits.rf_dr_low = 0;
  220. rf_setup.bits.rf_dr_high = 0;
  221. rf_setup.bits.pll_lock = 1;
  222. rf_setup.bits.reserved = 0;
  223. rf_setup.bits.cont_wave = 1;
  224. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,rf_setup.value);
  225. NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, config.value);
  226. // NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,50); //设置RF通信频率
  227. RF_NRF_CE_H();
  228. }
  229. int NRF24L01_Init(void)
  230. {
  231. int sta = 0;
  232. int errorCnt=0;
  233. rf_setup_tu rf_setup;
  234. setupRetr_tu setupRetr;
  235. future_tu future;
  236. config_tu config;
  237. //测试NRF24L01是否存在
  238. while(NRF24L01_Check())
  239. {
  240. errorCnt ++;
  241. if (errorCnt > 100)
  242. {
  243. break;
  244. }
  245. }
  246. if (errorCnt < 10)
  247. {
  248. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
  249. NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
  250. NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_AW,0x03);
  251. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00); //使能通道0的自动应答
  252. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
  253. NRF24L01_Write_Reg(NRF_WRITE_REG+FEATURE,0x00);
  254. NRF24L01_Write_Reg(NRF_WRITE_REG+DYNDP,0x00);
  255. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,0); //设置RF通道
  256. NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
  257. setupRetr.bits.ard = 0x00;
  258. setupRetr.bits.arc = 0x00;
  259. NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,setupRetr.setupRetrValue);
  260. // rf_setup.bits.obsolete = 0;
  261. rf_setup.bits.rf_pwr = 0x00;
  262. rf_setup.bits.rf_dr_low = 1;
  263. rf_setup.bits.rf_dr_high = 0;
  264. rf_setup.bits.pll_lock = 0;
  265. rf_setup.bits.reserved = 0;
  266. rf_setup.bits.cont_wave = 0;
  267. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,rf_setup.value); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启
  268. config.bits.pwr_up = 1;
  269. config.bits.crco = 1;
  270. config.bits.enCrc = 1;
  271. config.bits.mask_max_rt = 0;
  272. config.bits.mask_tx_ds = 0;
  273. config.bits.mask_rx_dr = 0;
  274. config.bits.reserved = 0;
  275. NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,config.value); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  276. future.bits.en_dyn_ack = 0x00;
  277. future.bits.en_ack_pay = 0x00;
  278. future.bits.en_dpl = 0x00;
  279. future.bits.receved = 0x00;
  280. NRF24L01_Write_Reg(NRF_WRITE_REG+FEATURE,future.futureValue); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  281. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS, 0x70);
  282. NRF24L01_WriteStrobe(FLUSH_RX);
  283. }
  284. else
  285. {
  286. sta = 1;
  287. }
  288. return sta;
  289. }