標(biāo)題: 如何快速搞通“NRF24L01”,你造嗎? [打印本頁]

作者: xiao_yp2014    時(shí)間: 2016-6-7 13:43
標(biāo)題: 如何快速搞通“NRF24L01”,你造嗎?
本帖最后由 xiao_yp2014 于 2016-6-8 00:15 編輯

nRF24L01應(yīng)用筆記(上)    http://www.torrancerestoration.com/bbs/dpj-37580-1.html
nRF24L01應(yīng)用筆記(下)    http://www.torrancerestoration.com/bbs/dpj-37581-1.html



很多單片機(jī)初學(xué)者做NRF24L01通信后,一個(gè)星期也搞不通,最后越搞越迷茫,直至放棄(有木有)。

其實(shí)NRF24L01是一個(gè)非常容易操控的東西大部分人使用的NRF24L01模塊都如上圖所示,上面模塊的原理圖如下:


看不清楚?去datasheet上去看。這里嘮叨幾句,很多人懶的要命,連datasheet也沒有看過,就到處求爺爺求奶奶的幫他搞NRF24L01。還有一部分人,“我的datasheet上怎么沒有?” “親,能給個(gè)datasheet嗎?”。          datasheet是一個(gè)免費(fèi)的東西,你要看哪個(gè)芯片的datasheet,去哪個(gè)芯片的官網(wǎng)去下載就可以了,你連芯片的datasheet也拿不到,我勸你還是改行吧!

為了節(jié)省大家的時(shí)間,這里放出NRF24L01的datasheet(^_^),點(diǎn)擊下載: nRF24L01-.zip (974.35 KB, 下載次數(shù): 79)

回到正題,大家看NRF24L01模塊的原理圖,實(shí)際上就是一個(gè)芯片,連了一些必要的電容電阻電感和一個(gè)天線,然后留出了和單片機(jī)通信的SPI口和IRQ中斷引腳。

NRF24L01,任何單片機(jī)可以驅(qū)動,帶硬件SPI口的單片機(jī),可以配置好SPI外設(shè)以后驅(qū)動,沒有硬件SPI口的單片機(jī),可以用IO口模擬SPI時(shí)序通信。

重點(diǎn):NRF24L01是一個(gè)數(shù)字芯片,內(nèi)部有若干寄存器,什么數(shù)據(jù)寄存器、配置寄存器、狀態(tài)寄存器等。單片機(jī)通過SPI口,首先配置好NRF24L01的配置寄存器,諸如頻道,通道,地址,接收還是發(fā)送模式等等。然后分兩種情況,一、如果配置為了發(fā)送模式,就可以發(fā)送數(shù)據(jù)了,發(fā)送完數(shù)據(jù)以后,IRQ引腳會拉低,所以觀察IRQ引腳就可以知道有沒有發(fā)送成功;二、如果配置為了接收模式,就需要不斷的觀察IRQ引腳,IRQ引腳正常是高電平,如果接收到數(shù)據(jù),就會變成低電平,所以觀察這個(gè)引腳就知道有沒有接收到數(shù)據(jù)。

新手在做NRF24L01的通信程序時(shí),最好拿兩個(gè)相同的單片機(jī),做相同的程序(除了一個(gè)配置未發(fā)送,一個(gè)配置為接收)。

重中之重:首先要確保單片機(jī)和NRF24L01能夠正常的SPI通信,這個(gè)就好比你和一個(gè)阿拉伯人說話,你告它先去家樂福買瓶牛奶,再去沃爾瑪買個(gè)雞腿,然后….,但是如果阿拉伯人根本聽不懂你說話,那么…就沒有然后了。你用單片機(jī)給NRF24L01寫配置寄存器,輸入地址,輸入頻道…稍等,你配置了半天,NRF24L01的寄存器真的如你所想配置好了嗎?不確定?這就需要驗(yàn)證。驗(yàn)證方法?太容易了,找一個(gè)可讀可寫的寄存器,你先寫進(jìn)去,然后再讀出來,如果數(shù)據(jù)一樣,那么你的SPI通信就正常,你大可放心的配置了,如果讀出來的數(shù)據(jù)和寫進(jìn)去的數(shù)據(jù)不一樣,恭喜你,你再和不懂漢語的阿拉伯人說了半天廢話,你還是先搞通SPI再說吧。這里我給你一個(gè)寄存器,就是地址寄存器,可讀可寫,所以你可以用地址寄存器驗(yàn)證一個(gè)SPI通信是否正常,下面是我寫的驗(yàn)證函數(shù):

  1. /********************************************/
  2. /* 函數(shù)功能:檢測24L01是否存在 */
  3. /* 返回值; 0 存在 */
  4. /* 1 不存在 */
  5. /********************************************/
  6. uchar NRF24L01_Check(void)
  7. {
  8. uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
  9. uchar check_out_buf[5]={0x00};
  10. NRF_CE=0;
  11. NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);

  12. NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);

  13. if((check_out_buf[0] == 0x11)&&\
  14. (check_out_buf[1] == 0x22)&&\
  15. (check_out_buf[2] == 0x33)&&\
  16. (check_out_buf[3] == 0x44)&&\
  17. (check_out_buf[4] == 0x55))return 0;
  18. else return 1;
  19. }</font>
復(fù)制代碼

如果你不確保你的SPI通信正常,請先確定以后再進(jìn)行下面的內(nèi)容,否則就可能要對牛彈琴了。

收發(fā)數(shù)據(jù)的程序,要先判斷“數(shù)據(jù)是否發(fā)送出去了”和“是否接收到了”,而不要直接判斷發(fā)送和接收的數(shù)據(jù)是否一致。

例如:接收模塊,if(IRQ==0)點(diǎn)亮LED1,當(dāng)程序執(zhí)行后,當(dāng)你看到LED1亮了,哇,接收到了。

當(dāng)你確定接收到數(shù)據(jù)以后,你再判斷接收到的數(shù)據(jù)和你發(fā)送的數(shù)據(jù)是否一致。

例如:接收模塊,if(IRQ==0)把接收到的數(shù)據(jù)取出來,if(rec[0]==0x88),哇,和我發(fā)的一樣。

記住了嗎?做程序要循序漸進(jìn),而不是直接寫完。我多年親自試驗(yàn),不管多大的程序,循序漸進(jìn)的寫,速度是最快的。




作者: heicc    時(shí)間: 2016-6-7 14:51
很通俗易懂啊,不愧是版主的大作,收藏備用
作者: 無尾熊    時(shí)間: 2016-6-7 16:58
很好的網(wǎng)站。
作者: 1399945988    時(shí)間: 2017-8-7 21:26
真棒啊
作者: xiong731    時(shí)間: 2017-11-30 18:56
學(xué)習(xí)了,謝謝!
作者: harlow    時(shí)間: 2018-6-29 10:48
看了老半天還沒看懂,慢慢學(xué)
作者: stkh    時(shí)間: 2018-6-29 21:06
收藏學(xué)習(xí)
作者: chinarally@    時(shí)間: 2018-6-29 22:33
完全支持
作者: 不再記起    時(shí)間: 2018-7-1 07:54
受用,還是要循序漸進(jìn)的寫




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1