1. 程式人生 > >NRF24L01多對一、多通道通訊關鍵程式碼

NRF24L01多對一、多通道通訊關鍵程式碼

要想24L01多通道通訊成功,務必先單通道除錯成功,並且懂得這塊晶片通訊的一些基本知識。

一、基本的通訊條件

1、接收端的接收地址(RX_ADDR_Px)等於發射端的發射送地址(TX_ADDR)
2、收發端的頻道一致(RF_CH)
3、收發端的發射引數一致(RF_SETUP)

二、收發模式初始化的基本步驟

Rx端初始化步驟:
1)寫 Rx 節點的地址 RX_ADDR_Px
2)使能 AUTO ACK EN_AA
3)使能通道的接收地址 EN_RXADDR
4)選擇通訊頻率 RF_CH
5 ) 選擇通道有效資料寬度 Rx_Pw_Px
6)配置發射引數(低噪放大器增益、發射功率、無線速率) RF_SETUP
7)配置 24L01 的基本引數以及切換工作模式 CONFIG

Tx端初始化步驟:
1)寫 Tx 節點的地址 TX_ADDR
2)寫 RX通道P0 的地址 用ACK應答 RX_ADDR_P0
3)使能自動應答 EN_AA
4)使能通道接收地址 EN_RXADDR
5)配置自動重發次數 SETUP_RETR
6)選擇通訊頻率 RF_CH
7)配置發射引數(低噪放大器增益、發射功率、無線速率) RF_SETUP
8 ) 選擇通道有效資料寬度 Rx_Pw_Px
9)配置 24L01 的基本引數以及切換工作模式 CONFIG

三、多通道通訊關鍵程式碼

接收端:

const u8 RX_ADDRESS0[] = {0xff,0xff,0xff
,0xff,0x00};//通道0地址 const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址 //使用通道0和1通訊接收模式 //設定RX地址,寫RX資料寬度,選擇RF頻道 //當CE變高後,即進入RX模式,並可以接收資料了 void NRF24L01_RX_Mode(void) { NRF24L01_CE=0; NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//寫P0的Rx節點地址 NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8
*)RX_ADDRESS1,RX_ADR_WIDTH);//寫P1的Rx節點地址 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能所有通道的自動應答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能所有通道的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設定RF通訊頻率 NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效資料寬度 NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//選擇通道1的有效資料寬度 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設定TX發射引數,0db增益,2Mbps,低噪聲增益開啟 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的引數;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF24L01_CE = 1; //CE為高,進入接收模式 delay_us(130); }

傳送端0:

const u8 TX_ADDRESS0[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x00}; //傳送地址


//**傳送端0初始化程式碼,使用通道0進行通訊:**
//設定TX地址,寫TX資料寬度,設定RX自動應答的地址,填充TX傳送資料,選擇RF頻道

void NRF24L01_TX_Mode(void)
{                                                        
    NRF24L01_CE=0;      
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS0,TX_ADR_WIDTH);//寫TX節點地址 
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS0,RX_ADR_WIDTH); //設定RX_ADDR_P0的地址,為了使能ACK

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道自動應答    
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址  
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設定自動重發間隔時間:500us + 86us;最大自動重發次數:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //設定RF通道為40
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //設定TX發射引數,0db增益,2Mbps,低噪聲增益開啟   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的引數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
    NRF24L01_CE=1;//CE為高,10us後啟動傳送
    delay_us(10);
}

傳送端1:

const u8 TX_ADDRESS1[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x01}; //傳送地址

//**傳送端1初始化程式碼,使用通道1進行通訊:**
//設定TX地址,寫TX資料寬度,設定RX自動應答的地址,填充TX傳送資料,選擇RF頻道

void NRF24L01_TX_Mode(void)
{                                                        
    NRF24L01_CE=0;      
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//寫TX節點地址 
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS1,RX_ADR_WIDTH); //設定RX_ADDR_P0的地址,為了使能ACK     

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道的自動應答    
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址  
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設定自動重發間隔時間:500us + 86us;最大自動重發次數:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //設定RF通道為40
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //設定TX發射引數,0db增益,2Mbps,低噪聲增益開啟   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的引數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
    NRF24L01_CE=1;//CE為高,10us後啟動傳送
    delay_us(10);
}

四、多通道通訊關鍵點

1、傳送端資料通道0被用做接收應答訊號,因此不同通道發射端都要必須使能RX_ADDR_P0,因此需要把傳送端地址寫入裡面。(當然除非關掉應答)
2、使能第N個​的通道,前N個通道也必須被使能。
3、2~5通道與通道1共用高32位(4位元組)地址,只有低8位(1位元組)可以改變,且絕不能一樣,如下:

const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
const u8 RX_ADDRESS2[] = {0x02,0xff,0xff,0xff,0x01};//通道2地址
const u8 RX_ADDRESS3[] = {0x03,0xff,0xff,0xff,0x01};//通道3地址
const u8 RX_ADDRESS4[] = {0x04,0xff,0xff,0xff,0x01};//通道4地址
const u8 RX_ADDRESS5[] = {0x05,0xff,0xff,0xff,0x01};//通道5地址

PS:如果地址寬度是2(16位),那麼高8位(1位元組)共用,低8位(1位元組)不同。

4、接收端寫各通道地址時候,必須先從低通道(通道0開始)開始寫,使能地址寬度也是。

NRF24L01作為一塊低價格、入門級無線通訊晶片,自身限制還是挺多的,穩定組網還是有一定的難度,還不夠成熟於物聯網領域,做點小作品還是可以的。

相關推薦

NRF24L01通道通訊關鍵程式碼

要想24L01多通道通訊成功,務必先單通道除錯成功,並且懂得這塊晶片通訊的一些基本知識。 一、基本的通訊條件 1、接收端的接收地址(RX_ADDR_Px)等於發射端的發射送地址(TX_ADDR) 2、收發端的頻道一致(RF_CH) 3、收發端的發射引

mybatis 一對一一對

bigint into rem http depend path spa records 數據庫表 本項目是 框架架構是 springboot+mybatis 添加maven依賴 <dependency> <groupId>org.mybat

Mybatis的一對案例

一、一對多 1.首先建立資料庫和表。兩張表的id欄位是自動遞增的。 給category表錄入兩條資料,可自行新增記錄。 INSERT INTO `category` VALUES (1, '我是分類1'); INSERT INTO `category` VALUES (2, '我

mybatis註解式的增刪改查一對

目錄 一、專案資料庫表和資料的截圖。 二、maven專案所需依賴。 三、mybatis配置檔案。 四、增刪改查。 五、一對多 六、多對一 七、多對多 八、所有測試的一個總體的測試類: 九、專案主體結構圖:   一、專案資料庫表和資料的截圖

處理 Mybatis 中一對對映的黑魔法

前言 先看看Mybatis官方介紹 MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的

Mybatis的一對例子

一、一對多 1.首先建立資料庫和表。兩張表的id欄位是自動遞增的。 給category表錄入兩條資料,可自行新增記錄。 INSERT INTO `category` VALUES (1, '我是分類1'); INSERT INTO `category` VALUES

【SSH三大框架】Hibernate基礎第十二篇:load()懶載入分析以及一對一一對懶載入的分析

一、懶載入的定義: 懶載入:在WEB應用程式中,經常會需要查詢資料庫,系統的響應速度在很大程度上是與資料庫互動的響應。因此,如果能夠優化與資料庫的互動速度,則能夠大大提高WEB應用的響應速度。 例如:當有一個Student類和一個Teacher類。當我們載入一個學生的所有資

LitePal一對一

一對一 一個boy對應一個girl,相應地一個girl對應一個boy Boy類: public class Boy extends DataSupport { private int id; priva

[轉載]關於laravel中表關系的一對一一對實踐

對象 foreign 主鍵 fault pri create 密碼 names ace 這是轉載的文章 出處:https://blog.csdn.net/weixin_38112233/article/details/79220535 作者:重新遇到 一。建表和插入測

JPA表關聯關係(一對一對一)

小提示:外來鍵在哪邊,那邊就是多方哦!! 單向多對一:   給多方加上 @ManyToOne ex:【產品類Product--多方 ,產品分類ProductDir--一方】 單向一對多:給一方加上 @OneToMany ex

Hibernate 單向單向一對雙向一對關聯關係詳解

一對多關係是最普遍的對映關係。比如部門和職工 一對多:從部門的角度,一個部門對應多個職工 多對一:從職工的角度,多個職工對應一個部門 資料庫表中結構: 表 department:did departname 表 Employee:eid   en

Hibernate雙向關係控制反轉級聯配置

Hibernate多對一關係配置 Students配置檔案: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0

hibernate關聯關係註解(一對一對一)

一對多、多對一、一對一的註解實現 casecade={CasecadeType.REFRESH}的含義是隻是查詢級聯,它還有其他3個型別: CascadeType.MERGE級聯更新 CascadeType.PERSIST級聯儲存 CascadeType.REMOVE級聯刪

Json序列化,有關系時出現的問題

oca lan util 一對一 屬性。 sans 雙向 rate stat /** * 這是一張 單表中的雙向一對多,多對一 關系。自己跟自己一對多多對一 */ @Entity @Table(name="tb_test") public class

Json序列化,有關係時出現的問題

/** * 這是一張 單表中的雙向一對多,多對一 關係。自己跟自己一對多多對一 */ @Entity @Table(name="tb_test") public class CreditsEventBean implements Serializable{ private s

Mybatis 一對一,一對的理解

First (一對一)      首先我來說下一對一的理解,就是一個班主任只屬於一個班級,一個班級也只能有一個班主任。好吧這就是對於一對一的理解 怎麼來實現呢? 這裡我介紹了兩種方式:    一種是:使用巢狀結果對映來處理重複的聯合結果的子集      另一種呢是:

Hibernate:單項雙向

單項多對一 封裝類: Dept.java: public class Dept {     private Byte deptNo;     private String deptName;

解決json序列化有關係的物件時造成死迴圈的問題

json序列化的物件中存在雙向引用會導致的無限遞迴(infinite recursion)問題。 使用@JsonBackReference標記在有多對一或者多對多關係的屬性上即可解決這個問題,舉例

Django 的 ORM 有多種關係:一對一,

Django 的 ORM 有多種關係:一對一,多對一,多對多。 各自定義的方式為 : 一對一: OneToOneField 多對一: ForeignKey 多對多: ManyToManyField 上邊的描述太過資料而缺乏人性化,我們來更人性化一些: 多個屬於一個,即 belong to

springboot +mybatis 實現一對 【註解版】

MyBatis中的一對多 ,多對一,多對多【註解】 以下的例子就是針對 前端框架中所實現的 省-市-區  選擇框的資料介面 前端需要的介面型別:  後臺程式碼: dao層: ProvinceDAO /**  *  * @author 鄔志斌