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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

nRF24L01應用筆記(上)

[復制鏈接]
跳轉到指定樓層
樓主
ID:69862 發表于 2015-7-24 22:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 xiao_yp2014 于 2016-6-7 13:58 編輯



nRF24L01應用筆記(下)               http://m.zg4o1577.cn/bbs/dpj-37581-1.html
     如何快速搞通“NRF24L01”,你造嗎?   http://m.zg4o1577.cn/bbs/dpj-51459-1.html





nRF24L01應用筆記


      nRF24L01Nordic公司生產的一個單芯片射頻收發器件,是目前應用比較廣泛的一款無線通訊芯片,具體手冊資料網上大把,我就不再重復它的特性什么的了,直接說說它的調試方法,方法供大家參考。
      24L01是收發雙方都需要編程的器件,這就對調試方法產生了一定的要求,如果兩塊一起調,那么通訊不成功,根本不知道是發的問題還是收的問題,不隱晦的說,我當時也是沒理清調試思路才浪費了大半天時間看著模塊干瞪眼。正確的方法應該是先調試發送方,能保證發送正確,再去調接收,這樣就可以有針對性的解決問題。

      至于怎么去調發送方,先說下發送方的工作流程:

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

      網上的程序我也看過,大多都是成品,發送方發送-等應答-(自動重發)-觸發中斷。可是這樣的流程就已經把接收方給牽涉進來了,就是說一定要接收方正確收到數據并且回送應答信號之后發送方才能觸發中斷,結束一次完整的發送。可是這跟我們的初衷不相符,我們想單獨調試發送,完全拋開接收,這樣就要去配置一些參數來取消自動應答,取消自動重發,讓發送方達到發出數據就算成功的目的。
  1.       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自動應答
  2.       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);    //失能接收通道0
  3.       SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);      //失能自動重發
復制代碼


      (注:以下貼出的寄存器描述由于中文資料上有一個錯誤,故貼出原版英文資料)

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

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

      然后在初始化配置寄存器的時候要和發送方保持一致,比較重要的是要失能自動應答,使能通道0接收:
  1.       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自動應答
  2.       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    //接收要使能接收通道0
復制代碼


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

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





      這樣發送和接收就進入了一個標準狀態,發送-等應答-(自動重發)-觸發中斷;接收-應答-觸發中斷,一切按部就班,程序里加上自己的應用部分就能實現很多功能了,呵呵,這個帖子就先到這,明白芯片工作原理之后寫程序就有目的性了,下一篇再說說程序中查詢法和中斷法以及具體的程序實例。

評分

參與人數 1黑幣 +8 收起 理由
stkh + 8 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:110550 發表于 2016-6-12 16:09 | 只看該作者
非常好,贊一個
回復

使用道具 舉報

板凳
ID:119252 發表于 2016-8-1 20:02 | 只看該作者
經過樓主這么一說,明天就動手NRF24L 買了一直沒敢去碰它,謝謝樓主的教程!
回復

使用道具 舉報

地板
ID:105442 發表于 2017-1-7 00:30 | 只看該作者
非常好,贊一個
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品视频一区 | 色婷婷香蕉在线一区二区 | 青娱乐99 | 一级黄毛片 | 午夜视频在线看 | 午夜性色 | 日本在线看片 | 亚洲精品影视 | 一级片在线观看视频 | 懂色av| 成人福利在线观看 | 国产精品伦子伦免费视频 | 国产黄在线观看 | 一级黄色片在线观看 | 午夜视频网 | 中文字幕日韩视频 | 精品黄色片 | 激情综合网站 | 18在线观看免费入口 | 最新中文字幕在线观看 | 中文字幕91 | 99久久婷婷国产综合精品草原 | av免费观看网站 | 黄片毛片 | 日韩中文字幕在线观看 | 激情五月综合色婷婷一区二区 | 国产精自产拍久久久久久蜜 | 免费看黄网 | 日韩成人在线播放 | 久久伊人网站 | 亚洲国产一区在线观看 | 黄色片视频在线观看 | 亚洲偷 | 免费观看全黄做爰大片视频美国 | 国产www在线观看 | 国产三级在线免费观看 | 国产不卡一区 | 日日操夜夜干 | 超碰av在线播放 | 少妇高潮毛片 | 日韩一区二区三 |