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

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

QQ登錄

只需一步,快速開始

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

基于STM32驅(qū)動(dòng)NRF24L01 2.4G模塊調(diào)試之路

  [復(fù)制鏈接]
ID:235201 發(fā)表于 2018-10-19 09:58 | 顯示全部樓層 |閱讀模式
/*
* 您好,歡迎您來到2.4G調(diào)式的世界
* 調(diào)式之路是非常艱辛和枯燥的
* 如果你沒有一鼓作氣的決心和毅力!
* 請(qǐng)不要來調(diào)式,時(shí)間不會(huì)陪您打魚曬網(wǎng)
*/
雙方配置確保一致(地址,數(shù)據(jù)位長(zhǎng)度,通信頻率等)
請(qǐng)嚴(yán)格按照資料的發(fā)送與接收時(shí)間來控制(發(fā)送控制時(shí)間和接收控制時(shí)間)
在模塊發(fā)送數(shù)據(jù)或者接收數(shù)據(jù)時(shí)盡量不要被打斷(關(guān)閉中斷)
如果你用的是SWD接口下載調(diào)試,那么這里請(qǐng)注意,SWD可能會(huì)影響2.4G模塊的正常工作。

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

所以正確的調(diào)試方法應(yīng)該是先調(diào)試發(fā)送方,能保證發(fā)送正確,再去調(diào)接收,這樣就可以有針對(duì)性的解決問題。
至于怎么去調(diào)發(fā)送方,先說下發(fā)送方的工作流程:

配置寄存器使芯片工作于發(fā)送模式后拉高CE端至少10us
讀狀態(tài)寄存器STATUS
判斷是否是發(fā)送完成標(biāo)志位置位
清標(biāo)志
清數(shù)據(jù)緩沖

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


這樣就很清晰了,我們可以通過讀取STATUS的值來判斷是哪個(gè)事件觸發(fā)了中斷,寄存器4、5、6位分別對(duì)應(yīng)自動(dòng)重發(fā)完成中斷,
數(shù)據(jù)發(fā)送完成中斷,數(shù)據(jù)接收完成中斷。也就是說,在之前的配置下,如果數(shù)據(jù)成功發(fā)送,那么STATUS的值應(yīng)該為0x2e。
這樣就可以作為一個(gè)檢測(cè)標(biāo)準(zhǔn),另外一個(gè)標(biāo)準(zhǔn)可以看FIFO_STATUS寄存器,第5位的描述:發(fā)送緩沖器滿標(biāo)志,1為滿,0為有可用空間;
第4位的描述:發(fā)送緩沖器空標(biāo)志,1為空,0為有數(shù)據(jù);同樣可以看到接收緩沖器的對(duì)應(yīng)標(biāo)志。這樣在數(shù)據(jù)發(fā)送成功后,發(fā)送寄存器當(dāng)然應(yīng)該是空的,
接收緩沖因?yàn)樵谥耙呀?jīng)失能,所以也應(yīng)該是空,也就是說成功發(fā)送之后的FIFO_STATUS寄存器值應(yīng)該是0x11。
有了這兩個(gè)檢測(cè)標(biāo)準(zhǔn),我們即使不用接收方也可以確定發(fā)送方是否成功發(fā)送。當(dāng)發(fā)送方調(diào)試成功之后,
在程序里讓它一直發(fā)送,然后我們就可以去調(diào)試接收方,思路是一樣的,同樣說下接收方工作流程先。



配置寄存器使芯片工作于接收模式后拉高CE端至少130us
讀狀態(tài)寄存器STATUS
判斷是否是接收完成標(biāo)志位置位
清標(biāo)志
讀取數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)
清數(shù)據(jù)緩沖0先0

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

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

這樣發(fā)送和接收就進(jìn)入了一個(gè)標(biāo)準(zhǔn)狀態(tài),發(fā)送-等應(yīng)答-(自動(dòng)重發(fā))-觸發(fā)中斷;接收-應(yīng)答-觸發(fā)中斷,一切按部就班,程序里加上自己的應(yīng)用部分就能實(shí)現(xiàn)很多功能了。
B9EC9CF6FF9441C8FB8BBC33CC57A017.png

單片機(jī)源程序如下:
  1. /***********************************************************************
  2.   *
  3.         *  @{ 創(chuàng)建時(shí)間  2018.10.01
  4.         *  @{ 開發(fā)者    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);//關(guān)閉JTAG接口
  13.     JTAG_Set(SWD_ENABLE);//開啟SWD接口,方便調(diào)式程序
  14.     //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  15.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  16.     LED_Init();                          //初始化與LED連接的硬件接口
  17.     delay_init();            //延時(shí)函數(shù)初始化
  18.     uart_init(115200);
  19.     printf("\r\n 加載串口完成 \r\n");
  20.     printf("\r\n 這是一個(gè) NRF24L01 無線傳輸實(shí)驗(yàn) \r\n");
  21.     printf("\r\n 這是無線傳輸 主機(jī)端 的反饋信息\r\n");
  22.     printf("\r\n   正在檢測(cè)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連接失敗,請(qǐng)重新檢查接線。\r\n");


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

  44.                 case 0xff:
  45.                     printf("\r\n 未知原因?qū)е掳l(fā)送失敗。 \r\n");
  46.                     break;

  47.                 case TX_OK:
  48.                     printf("\r\n 主機(jī)端 接收到 從機(jī)端 的應(yīng)答信號(hào),發(fā)送成功! %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. }
復(fù)制代碼

QQ截圖20181019095617.png

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


回復(fù)

使用道具 舉報(bào)

ID:412302 發(fā)表于 2018-10-20 23:25 | 顯示全部樓層
請(qǐng)問有RF433教學(xué)??
回復(fù)

使用道具 舉報(bào)

ID:251866 發(fā)表于 2019-1-14 02:12 | 顯示全部樓層
感謝樓組的貢獻(xiàn)!謝謝
回復(fù)

使用道具 舉報(bào)

ID:67425 發(fā)表于 2019-6-7 05:59 | 顯示全部樓層
很好,感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

ID:648247 發(fā)表于 2019-11-24 10:47 | 顯示全部樓層
非常好的總結(jié),對(duì)我很有幫助
回復(fù)

使用道具 舉報(bào)

ID:696335 發(fā)表于 2021-4-18 12:41 | 顯示全部樓層
請(qǐng)問nrf和單片機(jī)怎么接線呢?
回復(fù)

使用道具 舉報(bào)

ID:865915 發(fā)表于 2021-7-31 15:21 | 顯示全部樓層
請(qǐng)問發(fā)送端一直顯示已經(jīng)達(dá)到最大重發(fā)次數(shù)是什么情況啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色综合99 | 日本精品一区二区三区视频 | 亚洲bt 欧美bt 日本bt | 亚洲精品电影在线观看 | 在线免费视频一区 | 国产精品性做久久久久久 | 久久久999国产精品 中文字幕在线精品 | 日韩在线视频一区 | 一区二区三区网站 | 亚洲人成在线观看 | 欧美偷偷操 | 欧美性另类 | 一级黄色绿像片 | 欧美视频第二页 | 国产精品久久 | 亚洲精品在线看 | 欧洲尺码日本国产精品 | 精品视频一区二区三区在线观看 | 人人澡人人爱 | 一级黄色网页 | 成人不卡 | 四虎在线观看 | 亚洲日韩欧美一区二区在线 | 性高湖久久久久久久久 | www.4hu影院 | 亚洲精品小视频在线观看 | 中文字幕在线剧情 | 99色在线 | 久久一二| 日日碰狠狠躁久久躁96avv | 免费在线观看一区二区 | 91成人在线视频 | 亚洲激情专区 | 99综合在线| 日韩视频在线一区 | 毛片在线免费播放 | 日韩一| 老牛嫩草一区二区三区av | 国产精品视频一二三区 | 精品亚洲一区二区 | 99视频免费播放 |