久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8001|回復: 6
打印 上一主題 下一主題
收起左側

基于STM32驅動NRF24L01 2.4G模塊調試之路

  [復制鏈接]
跳轉到指定樓層
樓主
/*
* 您好,歡迎您來到2.4G調式的世界
* 調式之路是非常艱辛和枯燥的
* 如果你沒有一鼓作氣的決心和毅力!
* 請不要來調式,時間不會陪您打魚曬網
*/
雙方配置確保一致(地址,數據位長度,通信頻率等)
請嚴格按照資料的發送與接收時間來控制(發送控制時間和接收控制時間)
在模塊發送數據或者接收數據時盡量不要被打斷(關閉中斷)
如果你用的是SWD接口下載調試,那么這里請注意,SWD可能會影響2.4G模塊的正常工作。

下面是調試的基本方法:           
24L01是收發雙方都需要編程的器件,這就對調試方法產生了一定的要求,如果兩塊一起調,那么通訊不成功,
根本不知道是發的問題還是收的問題,不好意思的說,我當時也是沒理清調試思路才浪費了一下午時間看著模塊干瞪眼。

所以正確的調試方法應該是先調試發送方,能保證發送正確,再去調接收,這樣就可以有針對性的解決問題。
至于怎么去調發送方,先說下發送方的工作流程:

配置寄存器使芯片工作于發送模式后拉高CE端至少10us
讀狀態寄存器STATUS
判斷是否是發送完成標志位置位
清標志
清數據緩沖

網上的程序我也看過,大多都是成品,發送方發送-等應答-(自動重發)-觸發中斷。
可是這樣的流程就已經把接收方給牽涉進來了,就是說一定要接收方正確收到數據并且回送應答信號之后發送方才能觸發中斷,
結束一次完整的發送。可是這跟我們的初衷不相符,我們想單獨調試發送,完全拋開接收,
這樣就要去配置一些參數來取消自動應答,取消自動重發,讓發送方達到發出數據就算成功的目的。
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);        // 失能通道0自動應答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);    // 失能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);  // 失能自動重發
1有了以上這三個配置,發送方的流程就變成了發送-觸發中斷。這樣就拋開了接收方,
可以專心去調試發送,可是怎么樣才知道發送是否成功呢,要用到另外兩個寄存器,STATUS和FIFO_STATUS。


這樣就很清晰了,我們可以通過讀取STATUS的值來判斷是哪個事件觸發了中斷,寄存器4、5、6位分別對應自動重發完成中斷,
數據發送完成中斷,數據接收完成中斷。也就是說,在之前的配置下,如果數據成功發送,那么STATUS的值應該為0x2e。
這樣就可以作為一個檢測標準,另外一個標準可以看FIFO_STATUS寄存器,第5位的描述:發送緩沖器滿標志,1為滿,0為有可用空間;
第4位的描述:發送緩沖器空標志,1為空,0為有數據;同樣可以看到接收緩沖器的對應標志。這樣在數據發送成功后,發送寄存器當然應該是空的,
接收緩沖因為在之前已經失能,所以也應該是空,也就是說成功發送之后的FIFO_STATUS寄存器值應該是0x11。
有了這兩個檢測標準,我們即使不用接收方也可以確定發送方是否成功發送。當發送方調試成功之后,
在程序里讓它一直發送,然后我們就可以去調試接收方,思路是一樣的,同樣說下接收方工作流程先。



配置寄存器使芯片工作于接收模式后拉高CE端至少130us
讀狀態寄存器STATUS
判斷是否是接收完成標志位置位
清標志
讀取數據緩沖區的數據
清數據緩沖0先0

然后在初始化配置寄存器的時候要和發送方保持一致,比較重要的是要失能自動應答,使能通道0接收:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);        // 失能通道0自動應答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    // 接收要使能接收通道0
這樣就可以了,接收方就可以進入接收模式去接收數據了,這次的調試就會靈活一些,因為是接收數據,可以在接收方添加一個顯示設備把數據直觀的顯示出來,
去對照看是否正確,當然還可以使用和發送方一樣的方法:觀察STATUS和FIFO_STATUS的值,對照寄存器描述,接收正確時STATUS的值應該是0x40,
對于FIFO_STATUS的情況就多了些,因為數據寬度的不同也會造成寄存器的值不一樣,24L01最大支持32字節寬度,就是說一次通訊最多可以傳輸32個字節的數據,
在這種情況下,接收成功讀數據之前寄存器值應該為0x12,讀數據之后就會變成0x11;如果數據寬度定義的小于32字節,那么接收成功讀數據之前寄存器值應該為0x10,
讀數據之后就會變成0x11。這個看起來挺復雜,其實很清晰,大家可以試著分析下,對照數據手冊分析每個位的狀態就可以得到結果。

好了,到這里對nRF24L01的調試基本上就算通了,但是要明白這些只是調試方法,最終的產品如果不加上應答和重發的話那么數據的穩定性是很難保證的,
所以在基本的通訊建立之后就要把發送的配置改為:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       //使能接收通道0自動應答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);  // 自動重發10次,間隔500us
接收方的配置也要更改:
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);        // 失能通道0自動應答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    // 接收要使能接收通道0

這樣發送和接收就進入了一個標準狀態,發送-等應答-(自動重發)-觸發中斷;接收-應答-觸發中斷,一切按部就班,程序里加上自己的應用部分就能實現很多功能了。


單片機源程序如下:
  1. /***********************************************************************
  2.   *
  3.         *  @{ 創建時間  2018.10.01
  4.         *  @{ 開發者    xiaoxiao
  5.         *  @{ 功能      2.4G通信
  6.         *
  7. ************************************************************************/
  8. #include "sys.h"
  9. u8 tmp_buf[33] = {10,20,30,40};
  10. int main(void)
  11. {
  12.     JTAG_Set(JTAG_SWD_DISABLE);//關閉JTAG接口
  13.     JTAG_Set(SWD_ENABLE);//開啟SWD接口,方便調式程序
  14.     //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  15.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  16.     LED_Init();                          //初始化與LED連接的硬件接口
  17.     delay_init();            //延時函數初始化
  18.     uart_init(115200);
  19.     printf("\r\n 加載串口完成 \r\n");
  20.     printf("\r\n 這是一個 NRF24L01 無線傳輸實驗 \r\n");
  21.     printf("\r\n 這是無線傳輸 主機端 的反饋信息\r\n");
  22.     printf("\r\n   正在檢測NRF與MCU是否正常連接。。。\r\n");
  23.     NRF24L01_Init();

  24.     if(NRF24L01_Check() == 0)
  25.         printf("\r\n      NRF與MCU連接成功!\r\n");
  26.     else
  27.         printf("\r\n  NRF與MCU連接失敗,請重新檢查接線。\r\n");


  28.     printf("\r\n 主機端 進入自應答發送模式\r\n");
  29.     while(1)
  30.     {
  31.         if(NRF24L01_Check() == 0)
  32.         {
  33.             printf("\r\n 開始配置為發送模式\r\n");
  34.             TX_Mode();
  35.             printf("\r\n 配置完成\r\n");
  36.             printf("\r\n 開始發送\r\n");
  37.             while(1)
  38.             {
  39.                 switch(NRF24L01_TxPacket(tmp_buf))
  40.                 {
  41.                 case MAX_TX:
  42.                     printf("\r\n 主機端 沒接收到應答信號,發送次數超過限定值,發送失敗。 \r\n");
  43.                     break;

  44.                 case 0xff:
  45.                     printf("\r\n 未知原因導致發送失敗。 \r\n");
  46.                     break;

  47.                 case TX_OK:
  48.                     printf("\r\n 主機端 接收到 從機端 的應答信號,發送成功! %d %d %d %d \r\n",tmp_buf[0],tmp_buf[1],tmp_buf[2],tmp_buf[3]);
  49.                     break;
  50.                 }
  51.                 delay_ms(1000);
  52.                                                                 tmp_buf[0]+=1;
  53.                                                                 tmp_buf[1]+=1;
  54.                                                                 tmp_buf[2]+=1;
  55.                                                                 tmp_buf[3]+=1;
  56.             }
  57.         }
  58.     }
  59. }
復制代碼



所有資料51hei提供下載:
2.4G調式.rar (829.3 KB, 下載次數: 258)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:412302 發表于 2018-10-20 23:25 | 只看該作者
請問有RF433教學??
回復

使用道具 舉報

板凳
ID:251866 發表于 2019-1-14 02:12 | 只看該作者
感謝樓組的貢獻!謝謝
回復

使用道具 舉報

地板
ID:67425 發表于 2019-6-7 05:59 | 只看該作者
很好,感謝樓主分享!
回復

使用道具 舉報

5#
ID:648247 發表于 2019-11-24 10:47 | 只看該作者
非常好的總結,對我很有幫助
回復

使用道具 舉報

6#
ID:696335 發表于 2021-4-18 12:41 | 只看該作者
請問nrf和單片機怎么接線呢?
回復

使用道具 舉報

7#
ID:865915 發表于 2021-7-31 15:21 | 只看該作者
請問發送端一直顯示已經達到最大重發次數是什么情況啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 521av网站| 国产午夜一级 | 国产99免费| 精品国产一区探花在线观看 | 欧美aⅴ | 成人一区精品 | 国产日韩一区二区 | 亚洲国产欧美日韩 | 亚洲精品国产电影 | 欧美视频第三页 | 久久极品 | 久久免费观看视频 | 成人h电影在线观看 | 中文字幕一区二区三区精彩视频 | 婷婷综合| 96国产精品久久久久aⅴ四区 | 久久久久国产精品一区二区 | 国产免费av在线 | 天天插天天射天天干 | 91精品91久久久 | 亚洲国产成人精品久久久国产成人一区 | av片免费 | 日本视频一区二区三区 | 国产午夜精品一区二区三区四区 | 九九九视频 | 日韩三区在线观看 | 99热这里有精品 | 一区二区精品视频 | 看av电影| 日韩三级视频 | 91看国产| 亚洲激精日韩激精欧美精品 | 欧美aⅴ片| 亚洲美女网站 | 精品国产91乱码一区二区三区 | 日本午夜网| 97久久精品午夜一区二区 | 国产综合视频 | 91在线电影 | 国产精品精品视频 | 久久精品99久久 |