找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 23385|回復(fù): 28
收起左側(cè)

STM32+NRF24L01無線通信使用教程+源碼+資料

  [復(fù)制鏈接]
ID:409063 發(fā)表于 2018-10-13 15:22 | 顯示全部樓層 |閱讀模式
NRF24L01無線模塊簡(jiǎn)介

NRF24L01 無線模塊,采用的芯片是 NRF24L01,該芯片的主要特點(diǎn)如下:
1)2.4G 全球開放的 ISM 頻段,免許可證使用。
2)最高工作速率 2Mbps,高校的 GFSK 調(diào)制,抗干擾能力強(qiáng)。
3)125 個(gè)可選的頻道,滿足多點(diǎn)通信和調(diào)頻通信的需要。
4)內(nèi)置 CRC 檢錯(cuò)和點(diǎn)對(duì)多點(diǎn)的通信地址控制。
5)低工作電壓(1.9-3.6V)。
6)可設(shè)置自動(dòng)應(yīng)答,確保數(shù)據(jù)可靠傳輸。

該芯片通過 SPI 與外部 MCU 通信,最大的 SPI 速度可以達(dá)到 10Mhz,所 以在后面軟件編程的時(shí)候 SPI 速度不能高于這個(gè)最大值。本章我們用到的模塊是 深圳云佳科技生產(chǎn)的 NRF24L01,該模塊已經(jīng)被很多公司大量使用,成熟度和穩(wěn) 定性都是相當(dāng)不錯(cuò)的。該模塊的外形和引腳圖如圖 1.1.1 所示:

圖 1.1.1 NRF24L01 模塊外觀引腳圖
模塊 VCC 腳的電壓范圍為 1.9-3.6V,建議不要超過 3.6V,否則可能燒壞 模塊,一般用 3.3V 電壓比較合適。除了 VCC 和 GND 腳,其他引腳都可以和 5V 單片機(jī)的 IO 口直連,正是因?yàn)槠浼嫒?5V 單片機(jī)的 IO,故使用上具有很大優(yōu) 勢(shì)。關(guān)于 NRF24L01 的詳細(xì)介紹,請(qǐng)參考 NRF24L01 的技術(shù)手冊(cè)。

1.2硬件設(shè)計(jì)

本實(shí)驗(yàn)功能簡(jiǎn)介:開機(jī)時(shí)系統(tǒng)先檢測(cè) NRF24L01 模塊是否存在,在檢測(cè)到 NRF24L01 模塊之后,根據(jù) K_UP 和 K_DOWN 按鍵來決定模塊的工作模式,在設(shè) 定好工作模式之后,就會(huì)開發(fā)發(fā)送/接收數(shù)據(jù),同樣用 D1 指示燈來指示程序正 在運(yùn)行。
開發(fā)板上并沒有集成 NRF24L01 無線模塊,而是預(yù)留了一個(gè)模塊接口,所以我 們需要知道模塊接口與開發(fā)板對(duì)應(yīng)的管腳原理圖,如圖1.2.1 所示:




圖 1.2.1 NRF24L01 模塊接口與開發(fā)板連接原理圖
這里 NRF24L01 模塊使用的是 SPI2,和我們開發(fā)板上的 FLASH 共用一個(gè) SPI 接口,所以在使用的時(shí)候要分時(shí)復(fù)用 SPI2。本章我們需要把 FLASH EN25QXX 的 片選信號(hào)置高,以防止這個(gè)器件對(duì) NRF24L01 的通信造成干擾。
NRF24L01 無線模塊和開發(fā)板的連接實(shí)物圖如圖 1.2.2 所示:

圖 1.2.2 NRF24L01 模塊連接圖
由于 2.4G 無線通信是雙向的,所以至少要有兩個(gè)模塊同時(shí)能工作,這里我 們使用 2 套普中 STM3-PZ6806L 開發(fā)板來向大家演示。

1.3軟件設(shè)計(jì)

打開“\2.4G 無線通信應(yīng)用\2.4G 無線通信程序”工程,可以看到我們加入 了 nrf24l01.c 源文件和 nrf24l01.h 頭文件,所有NRF24L01 相關(guān)的驅(qū)動(dòng)代碼和 定義都在這兩個(gè)文件中實(shí)現(xiàn)。同時(shí),我們還加入了之前的 spi 驅(qū)動(dòng)文件 spi.c 和 spi.h 頭文件,因?yàn)镹RF24L01 是通過 SPI 接口通信的。

1.3.1NRF24L01驅(qū)動(dòng)程序

打開 nrf24l01.c 文件,代碼如下:
  1. #include "nrf24l01.h"
  2. #include "spi.h"



  3. const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; // 發(fā)送地址
  4. const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};

  5. //初始化 24L01 的 IO 口
  6. void NRF24L01_Init(void)
  7. {
  8. GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef              SPI_InitStructure;


  9. //使能 PB,F,D 端口時(shí)鐘              //PF8-CE              PF9-CSN              PD3-IRQ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPI
  10. OF|RCC_APB2Periph_GPIOD, ENABLE);



  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;              //PG13 上拉 防 止 EN25X 的干擾
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;              // 推
  13. 挽輸出

  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化指定 IO GPIO_SetBits(GPIOG,GPIO_Pin_13);//上拉

  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;              //PB12 上拉 防止 以太網(wǎng) NSS 的干擾
  16. GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化指定 IO GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉



  17. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8; //PF8 9 推 挽
  18. GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化指定 IO GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_8);//PF6,7,8 下拉


  19. GPIO_InitStructure.GPIO_Pin              = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PD3 輸入
  20. GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD,GPIO_Pin_3);//PD3 下拉


  21. SPI2_Init();              //初始化 SPI SPI_Cmd(SPI2, DISABLE); // SPI 外設(shè)不使能


  22. SPI_InitStructure.SPI_Direction              = SPI_Direction_2Lines_FullDuplex;              //SPI 設(shè)置為雙線雙向全雙工
  23. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;              //SPI 主機(jī) SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;              //發(fā)送
  24. 接收 8 位幀結(jié)構(gòu)
  25. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;              //時(shí)鐘懸空低 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //數(shù)據(jù)捕獲于第 1
  26. 個(gè)時(shí)鐘沿
  27. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;              //NSS 信號(hào)由 軟件
  28. 控制
  29. SPI_InitStructure.SPI_BaudRatePrescaler              =
  30. SPI_BaudRatePrescaler_16;              //定義波特率預(yù)分頻的值:波特率預(yù)分頻值 為 16
  31. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;              // 數(shù) 據(jù) 傳 輸從 MSB 位開始
  32. SPI_InitStructure.SPI_CRCPolynomial = 7;              //CRC 值計(jì)算的多項(xiàng)式 SPI_Init(SPI2, &SPI_InitStructure);              //根據(jù) SPI_InitStruct 中指
  33. 定的參數(shù)初始化外設(shè) SPIx 寄存器
  34. SPI_Cmd(SPI2, ENABLE); //使能 SPI 外設(shè)


  35. NRF24L01_CE=0;              //使能 24L01
  36. NRF24L01_CSN=1;              //SPI 片選取消
  37. }


  38. //檢測(cè) 24L01 是否存在
  39. //返回值:0,成功;1,失敗
  40. u8 NRF24L01_Check(void)
  41. {
  42. u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  43. u8 i;
  44. SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi 速度為 9Mhz(24L01 的最大 SPI 時(shí)鐘為 10Mhz)
  45. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入 5 個(gè)字節(jié) 的地址.
  46. NRF24L01_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址
  47. for(i=0;i<5;i++)if(buf[i]!=0XA5)break;

  48. if(i!=5)return 1;//檢測(cè) 24L01 錯(cuò)誤
  49. return 0;              //檢測(cè)到 24L01
  50. }


  51. //SPI 寫寄存器
  52. //reg:指定寄存器地址
  53. //value:寫入的值
  54. u8 NRF24L01_Write_Reg(u8 reg,u8 value)
  55. {
  56. u8 status;
  57. NRF24L01_CSN=0;                                          //使能 SPI 傳輸 status =SPI2_ReadWriteByte(reg);//發(fā)送寄存器號(hào) SPI2_ReadWriteByte(value);                            //寫入寄存器的值 NRF24L01_CSN=1;                            //禁止 SPI 傳輸 return(status);              //返回狀態(tài)值
  58. }


  59. //讀取 SPI 寄存器值
  60. //reg:要讀的寄存器
  61. u8 NRF24L01_Read_Reg(u8 reg)
  62. {
  63. u8 reg_val;
  64. NRF24L01_CSN = 0;              //使能 SPI 傳輸 SPI2_ReadWriteByte(reg);              //發(fā)送寄存器號(hào) reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內(nèi)容 NRF24L01_CSN = 1;              //禁止 SPI 傳輸 return(reg_val);              //返回狀態(tài)值
  65. }


  66. //在指定位置讀出指定長(zhǎng)度的數(shù)據(jù)
  67. //reg:寄存器(位置)
  68. //*pBuf:數(shù)據(jù)指針
  69. //len:數(shù)據(jù)長(zhǎng)度
  70. //返回值,此次讀到的狀態(tài)寄存器值
  71. u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
  72. {
  73. u8 status,u8_ctr;
  74. NRF24L01_CSN = 0;              //使能 SPI 傳輸
  75. status=SPI2_ReadWriteByte(reg);//發(fā)送寄存器值(位置),并讀取狀態(tài) 值

  76. for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(
  77. 0XFF);//讀出數(shù)據(jù)
  78. NRF24L01_CSN=1;              //關(guān)閉 SPI 傳輸
  79. return status;              //返回讀到的狀態(tài)值
  80. }

  81. //在指定位置寫指定長(zhǎng)度的數(shù)據(jù)
  82. //reg:寄存器(位置)
  83. //*pBuf:數(shù)據(jù)指針
  84. //len:數(shù)據(jù)長(zhǎng)度
  85. //返回值,此次讀到的狀態(tài)寄存器值
  86. u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
  87. {
  88. u8 status,u8_ctr;
  89. NRF24L01_CSN = 0;              //使能 SPI 傳輸
  90. status = SPI2_ReadWriteByte(reg);//發(fā)送寄存器值(位置),并讀取狀 態(tài)值
  91. for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++);
  92. //寫入數(shù)據(jù)
  93. NRF24L01_CSN = 1;              //關(guān)閉 SPI 傳輸
  94. return status;              //返回讀到的狀態(tài)值
  95. }

  96. //啟動(dòng) NRF24L01 發(fā)送一次數(shù)據(jù)
  97. //txbuf:待發(fā)送數(shù)據(jù)首地址
  98. //返回值:發(fā)送完成狀況
  99. u8 NRF24L01_TxPacket(u8 *txbuf)
  100. {
  101. u8 sta;
  102. SPI2_SetSpeed(SPI_BaudRatePrescaler_4);//spi 速度為 9Mhz(24L01 的最大 SPI 時(shí)鐘為 10Mhz)
  103. NRF24L01_CE=0; NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);// 寫 數(shù) 據(jù)
  104. 到 TX BUF              32 個(gè)字節(jié) NRF24L01_CE=1;//啟動(dòng)發(fā)送 while(NRF24L01_IRQ!=0);//等待發(fā)送完成 sta=NRF24L01_Read_Reg(STATUS);              //讀取狀態(tài)寄存器的值
  105. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); // 清 除 TX_DS 或 MAX_RT 中斷標(biāo)志
  106. if(sta&MAX_TX)//達(dá)到最大重發(fā)次數(shù)
  107. {
  108. NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器
  109. return MAX_TX;
  110. }
  111. if(sta&TX_OK)//發(fā)送完成
  112. {
  113. return TX_OK;
  114. }
  115. return 0xff;//其他原因發(fā)送失敗
  116. }


  117. //啟動(dòng) NRF24L01 發(fā)送一次數(shù)據(jù)
  118. //txbuf:待發(fā)送數(shù)據(jù)首地址
  119. //返回值:0,接收完成;其他,錯(cuò)誤代碼
  120. u8 NRF24L01_RxPacket(u8 *rxbuf)
  121. {
  122. u8 sta;
  123. SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi 速度為 9Mhz(24L01 的最大 SPI 時(shí)鐘為 10Mhz)
  124. sta=NRF24L01_Read_Reg(STATUS);              //讀取狀態(tài)寄存器的值 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); // 清 除 TX_DS 或
  125. MAX_RT 中斷標(biāo)志
  126. if(sta&RX_OK)//接收到數(shù)據(jù)
  127. {
  128. NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);// 讀 取 數(shù)據(jù)
  129. NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器
  130. return 0;
  131. }
  132. return 1;//沒收到任何數(shù)據(jù)
  133. }


  134. //該函數(shù)初始化 NRF24L01 到 RX 模式
  135. //設(shè)置 RX 地址,寫 RX 數(shù)據(jù)寬度,選擇 RF 頻道,波特率和 LNA HCURR
  136. //當(dāng) CE 變高后,即進(jìn)入 RX 模式,并可以接收數(shù)據(jù)了
  137. void NRF24L01_RX_Mode(void)
  138. {
  139. NRF24L01_CE=0;


  140. NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_AD R_WIDTH);//寫 RX 節(jié)點(diǎn)地址


  141. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);              //使能通道 0 的自動(dòng)應(yīng)答
  142. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);// 使 能 通 道 0 的接收地址
  143. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);              //設(shè)置 RF 通
  144. 信頻率
  145. NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選
  146. 擇通道 0 的有效數(shù)據(jù)寬度 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設(shè)置 TX 發(fā)射
  147. 參數(shù),0db 增益,2Mbps,低噪聲增益開啟
  148. NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作 模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式
  149. NRF24L01_CE = 1; //CE 為高,進(jìn)入接收模式
  150. }

  151. //該函數(shù)初始化 NRF24L01 到 TX 模式
  152. //設(shè)置 TX 地址,寫 TX 數(shù)據(jù)寬度,設(shè)置 RX 自動(dòng)應(yīng)答的地址,填充 TX 發(fā)送數(shù)據(jù), 選擇 RF 頻道,波特率和 LNA HCURR
  153. //PWR_UP,CRC 使能
  154. //當(dāng) CE 變高后,即進(jìn)入 RX 模式,并可以接收數(shù)據(jù)了
  155. //CE 為高大于 10us,則啟動(dòng)發(fā)送. void NRF24L01_TX_Mode(void)
  156. {
  157. NRF24L01_CE=0;


  158. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_W IDTH);//寫 TX 節(jié)點(diǎn)地址


  159. NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_AD R_WIDTH); //設(shè)置 TX 節(jié)點(diǎn)地址,主要為了使能 ACK


  160. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);              //使能通道 0 的自動(dòng)應(yīng)答
  161. NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道 0 的接收地址
  162. NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動(dòng)重 發(fā)間隔時(shí)間:500us + 86us;最大自動(dòng)重發(fā)次數(shù):10 次
  163. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);              //設(shè)置 RF 通
  164. 道為 40
  165. NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);              //設(shè)置 TX 發(fā)
  166. 射參數(shù),0db 增益,2Mbps,低噪聲增益開啟 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);              //配置基本工
  167. 作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷 NRF24L01_CE=1;//CE 為高,10us 后啟動(dòng)發(fā)送
  168. }
復(fù)制代碼

此部分代碼我們不多介紹,程序內(nèi)有詳細(xì)的注釋,在這里強(qiáng)調(diào)一個(gè)要注意的
地方,在 NRF24L01_Init 函數(shù)里面,我們調(diào)用了 SPI2_Init()函數(shù),該函數(shù)我 們?cè)?FLASH 實(shí)驗(yàn)中講到過,當(dāng)時(shí)我們把 SPI 的 SCK 設(shè)置為空閑時(shí)為高,但是 NRF24L01 的 SPI 通信時(shí)序如圖 1.3.1 所示:


圖 1.3.1 NRF24L01 SPI 通信時(shí)序圖
從圖中可以看出,SCK 空閑的時(shí)候是低電平的,而數(shù)據(jù)在 SCK 的上升沿被 讀寫。所以,我們需要設(shè)置 SPI 的 CPOL 和 CPHA 均為 0,來滿足 NRF24L01 對(duì) SPI 操作的要求。所以,我們?cè)?NRF24L01_Init 函數(shù)里面又單獨(dú)添加了將 CPOL 和 CPHA 設(shè)置為 0 的代碼。
接下來我們看看 nrf24l01.h 代碼,該頭文件主要定義了一些 NRF24L01 的 命令字以及函數(shù)聲明,這里還通過 TX_PLOAD_WIDTH 和RX_PLOAD_WIDTH 決定了 發(fā)射和接收的數(shù)據(jù)寬度,也就是我們每次發(fā)射和接受的有效字節(jié)數(shù)。 NRF24L01 每次最多傳輸 32 個(gè)字節(jié),再多的字節(jié)傳輸則需要多次傳送。

1.3.2 主函數(shù)

打開 main.c,代碼如下:
  1. /* 下載程序后,首先要按下按鍵 K_UP 或者 K_DOWN,按鍵 K_UP 是接收, K_DOWN 是發(fā)送,兩塊開發(fā)板
  2. 只能一個(gè)作為發(fā)送一個(gè)作為接收,否則兩個(gè)都為接收或者發(fā)送將進(jìn)入死 循環(huán)。接收的時(shí)候
  3. 指示燈閃爍              NRF24L01 的最大 SPI 時(shí)鐘為 10Mhz 因此在設(shè)定 SPI 時(shí)鐘的 時(shí)候要低于 10M*/

  4. #include "system.h"
  5. #include "SysTick.h"
  6. #include "led.h"
  7. #include "usart.h"
  8. #include "tftlcd.h"
  9. #include "key.h"
  10. #include "nrf24l01.h"



  11. void data_pros() //數(shù)據(jù)處理函數(shù)
  12. {
  13. u8 key;
  14. static u8 mode=2;              //模式選擇
  15. u8 rx_buf[33]="www點(diǎn)prechincn";
  16. static u16 t=0;
  17. while(1)              //等待按鍵按下進(jìn)行選擇發(fā)送還是接收
  18. {
  19. key=KEY_Scan(0);
  20. if(key==KEY_UP)              //接收模式
  21. {
  22. mode=0;

  23. LCD_ShowString(10,140,tftlcd_data.width,tftlcd_data.height,16,"RX
  24. _Mode");


  25. LCD_ShowString(10,160,tftlcd_data.width,tftlcd_data.height,16,"Re ceived Data:");



  26. ");
  27. LCD_ShowString(120,160,tftlcd_data.width,tftlcd_data.height,16,"

  28. break;
  29. }
  30. if(key==KEY_DOWN) //發(fā)送模式
  31. {
  32. mode=1;

  33. LCD_ShowString(10,140,tftlcd_data.width,tftlcd_data.height,16,"TX
  34. _Mode");


  35. LCD_ShowString(10,160,tftlcd_data.width,tftlcd_data.height,16,"Se nd Data:              ");


  36. ");
  37. LCD_ShowString(120,160,tftlcd_data.width,tftlcd_data.height,16,"

  38. break;
  39. }
  40. }

  41. if(mode==0)              //接收模式
  42. {
  43. NRF24L01_RX_Mode();
  44. while(1)
  45. {
  46. if(NRF24L01_RxPacket(rx_buf)==0) //接收到數(shù)據(jù)顯示
  47. {
  48. rx_buf[32]='\0';

  49. LCD_ShowString(120,160,tftlcd_data.width,tftlcd_data.height,16,rx
  50. _buf);
  51. break;
  52. }
  53. else
  54. {
  55. delay_ms(1);
  56. }
  57. t++;
  58. if(t==1000)
  59. {
  60. t=0;
  61. led2=~led2; //一秒鐘改變一次狀態(tài)
  62. }
  63. }
  64. }
  65. if(mode==1)              //發(fā)送模式
  66. {

  67. NRF24L01_TX_Mode();
  68. while(1)
  69. {
  70. if(NRF24L01_TxPacket(rx_buf)==TX_OK)
  71. {

  72. LCD_ShowString(120,160,tftlcd_data.width,tftlcd_data.height,16,rx
  73. _buf);
  74. break;
  75. }
  76. else
  77. {

  78. LCD_ShowString(120,160,tftlcd_data.width,tftlcd_data.height,16,"S
  79. end Data Failed              ");


  80. }
  81. }
  82. }
  83. }


  84. int main()
  85. {
  86. u8 i=0; u16 rd=0; SysTick_Init(72);
  87. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);              //中斷優(yōu)先級(jí) 分組 分 2 組
  88. LED_Init(); USART1_Init(9600);
  89. TFTLCD_Init();              //LCD 初始化 KEY_Init();
  90. NRF24L01_Init();



  91. FRONT_COLOR=BLACK; LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"
  92. PRECHIN STM32F1"); LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16,"
  93. www點(diǎn)prechin點(diǎn)net"); LCD_ShowString(10,50,tftlcd_data.width,tftlcd_data.height,16,"
  94. NRF24L01 Test"); LCD_ShowString(10,70,tftlcd_data.width,tftlcd_data.height,16,"
  95. K_UP:RX_Mode              K_DOWN:TX_Mode"); FRONT_COLOR=RED;

  96. while(NRF24L01_Check())              //檢測(cè) NRF24L01 是否存在
  97. {


  98. LCD_ShowString(140,50,tftlcd_data.width,tftlcd_data.height,16,"Er ror              ");
  99. } LCD_ShowString(140,50,tftlcd_data.width,tftlcd_data.height,16,
  100. "Success");

  101. while(1)
  102. {
  103. data_pros(); i++; if(i%20==0)
  104. {
  105. led1=!led1;
  106. }


  107. delay_ms(10);


  108. }
  109. }
復(fù)制代碼

程序運(yùn)行時(shí)先通過 NRF24L01_Check 函數(shù)檢測(cè) NRF24L01 是否存在,如果存 在,則讓用戶選擇發(fā)送模式(K_DOWN)還是接收模式(K_UP),在確定模式之后,

設(shè)置 NRF24L01 的工作模式,然后執(zhí)行相應(yīng)的數(shù)據(jù)發(fā)送/接收處理。在測(cè)試的時(shí) 候一定要注意,兩塊開發(fā)板一個(gè)選擇發(fā)送模式,一個(gè)選擇接收模式,這樣在 LCD 上才會(huì)顯示發(fā)送的字符數(shù)據(jù)“www點(diǎn)prechin點(diǎn)cn”,還有要注意發(fā)送字節(jié)的長(zhǎng)度, 在頭文件內(nèi)我們已經(jīng)定義了最大的發(fā)送字節(jié)長(zhǎng)度。

1.4實(shí)驗(yàn)現(xiàn)象

將模塊連接好以后,把實(shí)驗(yàn)程序分別下載到兩塊開發(fā)板內(nèi)即可看到兩塊開發(fā) 板 LCD 顯示,插上 NRF24L01 模塊后,通過 K_UP 和 K_DOWN按鍵,設(shè)定好對(duì)應(yīng)的 模式,發(fā)送端就會(huì)發(fā)送 www點(diǎn)prechin點(diǎn)cn 到接收端,同時(shí) LCD 會(huì)顯示發(fā)送與接收 的字符。如圖 1.4.1 所示:

0.png 0.png

全部資料51hei下載地址:
2.4G無線通信應(yīng)用.rar (4.26 MB, 下載次數(shù): 643)

評(píng)分

參與人數(shù) 2黑幣 +80 收起 理由
3196007926 + 30 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:42131 發(fā)表于 2018-11-10 13:14 | 顯示全部樓層
看看什么好東西                     
回復(fù)

使用道具 舉報(bào)

ID:388992 發(fā)表于 2019-1-9 13:38 | 顯示全部樓層
最近正在學(xué)習(xí)NRF24L01模塊,感謝樓主的分享!
回復(fù)

使用道具 舉報(bào)

ID:364224 發(fā)表于 2019-2-27 15:14 | 顯示全部樓層
十分感謝樓主,
回復(fù)

使用道具 舉報(bào)

ID:495437 發(fā)表于 2019-3-21 15:34 | 顯示全部樓層
十分感謝樓主,
回復(fù)

使用道具 舉報(bào)

ID:514041 發(fā)表于 2019-4-29 10:17 來自手機(jī) | 顯示全部樓層
感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:528929 發(fā)表于 2019-5-6 20:35 | 顯示全部樓層
急需這個(gè)資料,項(xiàng)目正用到
回復(fù)

使用道具 舉報(bào)

ID:234782 發(fā)表于 2019-7-9 11:52 | 顯示全部樓層
謝謝樓主的無私奉獻(xiàn)
回復(fù)

使用道具 舉報(bào)

ID:445996 發(fā)表于 2019-7-9 13:01 | 顯示全部樓層
感謝LZ無私風(fēng)險(xiǎn)
回復(fù)

使用道具 舉報(bào)

ID:316749 發(fā)表于 2019-7-9 17:21 | 顯示全部樓層
看看什么好東西                     
回復(fù)

使用道具 舉報(bào)

ID:309976 發(fā)表于 2019-7-13 22:51 | 顯示全部樓層
感謝大佬,正需要用這個(gè)模塊
回復(fù)

使用道具 舉報(bào)

ID:405461 發(fā)表于 2019-7-23 16:11 | 顯示全部樓層
謝謝樓主,請(qǐng)問一下,您的普中程序去哪里下載的
回復(fù)

使用道具 舉報(bào)

ID:405461 發(fā)表于 2019-7-23 16:11 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:587615 發(fā)表于 2019-7-23 21:09 | 顯示全部樓層
好資料
回復(fù)

使用道具 舉報(bào)

ID:321841 發(fā)表于 2019-8-4 21:59 | 顯示全部樓層
屏的驅(qū)動(dòng)怎么選呢
回復(fù)

使用道具 舉報(bào)

ID:541536 發(fā)表于 2019-8-7 23:45 來自手機(jī) | 顯示全部樓層
感謝樓主分享,嗚嗚~
回復(fù)

使用道具 舉報(bào)

ID:597519 發(fā)表于 2019-8-8 10:08 | 顯示全部樓層
最近正在學(xué)習(xí)NRF24L01模塊,好多地方不懂,需要指點(diǎn)!
回復(fù)

使用道具 舉報(bào)

ID:617320 發(fā)表于 2019-9-27 19:07 來自手機(jī) | 顯示全部樓層
下載一個(gè)試試看
回復(fù)

使用道具 舉報(bào)

ID:616993 發(fā)表于 2019-11-6 14:18 | 顯示全部樓層
很好很強(qiáng)大
回復(fù)

使用道具 舉報(bào)

ID:637348 發(fā)表于 2019-11-7 11:50 | 顯示全部樓層
正在學(xué)習(xí)ing
回復(fù)

使用道具 舉報(bào)

ID:639544 發(fā)表于 2019-11-11 16:26 | 顯示全部樓層
樓主能發(fā)一份源代碼到我的郵箱嗎?我的分不夠784405709@qq.com
回復(fù)

使用道具 舉報(bào)

ID:246783 發(fā)表于 2020-2-25 09:02 來自手機(jī) | 顯示全部樓層
無線應(yīng)用,NRF 有成本優(yōu)勢(shì)
回復(fù)

使用道具 舉報(bào)

ID:276361 發(fā)表于 2020-2-25 16:11 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:706907 發(fā)表于 2020-3-12 11:46 | 顯示全部樓層
給力啊 剛好遇到要用這個(gè)模塊
回復(fù)

使用道具 舉報(bào)

ID:700561 發(fā)表于 2020-3-14 15:12 | 顯示全部樓層
好帖子,頂
回復(fù)

使用道具 舉報(bào)

ID:97968 發(fā)表于 2020-3-15 09:23 | 顯示全部樓層
十分感謝樓主!
回復(fù)

使用道具 舉報(bào)

ID:686417 發(fā)表于 2020-3-16 15:52 | 顯示全部樓層
很好的學(xué)習(xí)資料,希望日后可以嘗試一下
回復(fù)

使用道具 舉報(bào)

ID:1116418 發(fā)表于 2024-4-12 23:03 | 顯示全部樓層
真不錯(cuò)很詳細(xì)
回復(fù)

使用道具 舉報(bào)

ID:202803 發(fā)表于 2024-7-3 15:22 | 顯示全部樓層
感謝樓主分享,寫的很詳細(xì)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表