nrf24l01接收如何使用

nrf24l01接收如何使用

NRF24L01寄存器如何設(shè)置 主模式控制下的寄存器的操作設(shè)置器件利用兩個(gè)引腳進(jìn)行數(shù)據(jù)傳送: ? 串行時(shí)鐘(SCL)——RC3/SCK/SCL ? 串行數(shù)據(jù)(SDA)——RC4/SDI/SDA 用戶可以通過設(shè)置TRISC<4:3>位將這兩個(gè)引腳設(shè)為輸入或輸出。MSSP模塊有六個(gè)寄存器用于I2C 操作,它們是: ? MSSP控制寄存器 (SSPCON)? MSSP控制寄存器 2(SSPCON2)? MSSP狀態(tài)寄存器 (SSPSTAT)? 串行接收/發(fā)送緩沖器 (SSPBUF)? MSSP 移位寄存器 (SSPSR)—不可直接訪問? MSSP 地址寄存器 (SSPADD)SSPCON、SSPCON2 和SSPSTAT是 I2C 操作的控制和狀態(tài)寄存器。

SSPCON和SSPCON2寄存器可讀寫。

SSPSTAT 的低6 位為只讀,高2 位可讀寫。SSPSR 是用于將數(shù)據(jù)移入或移出的移位寄存器。SSPBUF 是緩沖寄存器, 數(shù)據(jù)字節(jié)寫入或從該寄存器中讀取。當(dāng) SSP 被設(shè)置為 I2C 從模式時(shí),SSPADD 寄存器用于保存從機(jī)地址。

當(dāng) SSP 被設(shè)置為主模式時(shí), SSPADD的低7 位作為波特率發(fā)生器的重裝值。接收時(shí),SSPSR和 SSPBUF共同構(gòu)成一個(gè)雙緩沖接收器。當(dāng) SSPSR 接收到一個(gè)完整字節(jié)時(shí),該字節(jié)就被移入SSPBUF,同時(shí) SSPIF中斷被置 1。

發(fā)送時(shí),SSPBUF無雙緩沖。寫 SSPBUF 等同于同時(shí)寫SSPBUF和SSPSR。寄存器 10-3: SSPSTAT:MSSP 狀態(tài)(I2C 模式)寄存器(地址為 94h) R/W-0 R/W-0 R-0 R-0 R-0 R-0 R-0 R-0SMP CKE D/A PSR/W UA BFbit 7 bit 0bit 7 SMP: 轉(zhuǎn)換率控制位主、從模式下: 1 = 關(guān)閉轉(zhuǎn)換率控制,標(biāo)準(zhǔn)速度方式(100 kHz 和 1 MHz)0 = 使能轉(zhuǎn)換率控制,高速方式 (400 kHz)bit 6 CKE: SMBus 選擇位主、從模式下:1 = 使能 SMBus專用輸入0 = 禁止 SMBus專用輸入bit 5 D/A: 數(shù)據(jù)/地址位 主模式下:保留。

從模式下:1 = 表示**接收或發(fā)送的字節(jié)是數(shù)據(jù) 0 = 表示**接收或發(fā)送的字節(jié)是地址bit 4 P: 停止位1 = 表示**檢測到停止位0 = 表示**未檢測到停止位注: 復(fù)位及SSPEN 被清零時(shí)該位被清零。bit 3 S: 起始位1 = 表示**檢測到起始位0 = 表示**未檢測到起始位注: 復(fù)位及SSPEN 被清零時(shí)該位被清零。bit 2 R/W: 讀/ 寫位信息 (僅限I2C模式)從模式下: 1 = 讀 0 = 寫注: 在前一次地址匹配時(shí)該位保存讀 / 寫位信息。

該位僅在地址匹配至下一個(gè)開始位、停止位或非 ACK時(shí)有效。主模式下: 1 = 正在進(jìn)行發(fā)送; 0 = 不在進(jìn)行發(fā)送。注: 該位與SEN、RSEN、PEN、RCEN 或ACKEN 位進(jìn)行邏輯或操作時(shí)將表明MSSP是否處于空閑狀態(tài)。bit 1 UA: 地址更新位(僅限10 位從模式)1 = 表示用戶需要更新 SSPADD 寄存器中的地址 0 = 表示不需要更新地址bit 0 BF: 緩沖器滿狀態(tài)位接收時(shí): 1 = 表示接收完成, SSPBUF 已滿0 = 表示接收未完成, SSPBUF 空發(fā)送時(shí): 1 = 數(shù)據(jù)發(fā)送正在進(jìn)行(不包括 ACK 位和停止位) , SSPBUF 滿 0 = 數(shù)據(jù)發(fā)送已完成 (不包括 ACK 位和停止位),SSPBUF 空圖注:R = 可讀位 W = 可寫位 U = 未使用,讀作 0- n = 上電復(fù)位值 “1” = 該位被置 1 “0” = 該位被清零 x = 未知狀態(tài) 寄存器 10-4: SSPCON:MSSP控制 (I2C 模式)寄存器 1 (地址為 14h) R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0bit 7 bit 0bit 7 WCOL: 寫沖突檢測位主發(fā)送模式下: 1 = 不具備開始發(fā)送的I2C 條件時(shí)試圖向 SSPBUF 寄存器寫入數(shù)據(jù) (必須用軟件清零) 。

0 = 未發(fā)生沖突從發(fā)送模式下:1 = 正在發(fā)送前一個(gè)數(shù)據(jù)時(shí)又有數(shù)據(jù)寫入 SSPBUF 寄存器(必須用軟件清零)。0 = 未發(fā)生沖突接收時(shí) (主、從模式) :該位是 “無關(guān)”位。bit 6 SSPOV: 接收溢出指示位 接收時(shí): 1 = SSPBUF 寄存器中仍然保持前一個(gè)數(shù)據(jù)時(shí)又收到新的字節(jié) (必須用軟件清零) 。0 = 未發(fā)生溢出發(fā)送時(shí): 該位是 “無關(guān)”位。

bit 5 SSPEN: 同步串行口使能位 1 = 使能串行口操作,并設(shè)定 SDA 和 SCL 為串行口引腳0 = 關(guān)閉串行口操作,并設(shè)定這些引腳為 I/O 引腳注: 使能時(shí),SDA和SCL引腳必須正確設(shè)定為輸入或輸出。bit 4 CKP: SCK 釋放控制位 從模式下: 1 = 釋放時(shí)鐘 0 = 保持時(shí)鐘為低電平(時(shí)鐘擴(kuò)展)。 (用于確保數(shù)據(jù)建立時(shí)間百科)。主模式下: 該模式下未使用。

bit 3-0 SSPM3:SSPM0: 同步串行口模式選擇位1111 = I2C 從模式, 10 位地址且啟動位和停止位中斷使能 1110 = I2C 從模式, 7 位地址且啟動位和停止位中斷使能1011 = I2C 固件控制為主模式 (從模式空閑)1000 = I2C 主模式,時(shí)鐘 = FOSC/(4 * (SSPADD + 1)) 0111 = I2C 從模式, 10 位地址0110 = I2C 從模式, 7 位地址注: 其他的位組合方式保留未用或僅用于SPI 方式。圖注:R = 可讀位 W = 可寫位 U = 未使用,讀作 0- n = 上電復(fù)位值 “1” = 該位被置 1 “0” = 該位被清零 x = 不確定寄存器 10-5: SSPCON2:MSSP 控制(I2C 模式)寄存器 2 (地址為 91h) R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SENbit 7 bit 0bit 7 GCEN: 廣播呼叫使能位 (僅限從模式) 1 = 收到來自 SSPSR的廣播呼叫地址時(shí)(0000h)使能中斷0 = 禁止廣播呼叫地址bit 6 ACKSTAT: 應(yīng)答狀態(tài)位 (僅限主模式)1 = 未收到從機(jī)的應(yīng)答0 = 收到從機(jī)的應(yīng)答 bit 5 ACKDT: 應(yīng)答數(shù)據(jù)位 (僅限主模式) 1 = 未應(yīng)答 0 = 已應(yīng)答 注: 當(dāng)用戶在接收之后啟動應(yīng)答時(shí)序時(shí)將要發(fā)送的值。bit 4 ACKEN: 應(yīng)答順序使能位 (僅限主模式) 1 = 在SDA 和 SCL 引腳上啟動應(yīng)答順序,并發(fā)送 ACKDT 數(shù)據(jù)位。

由硬件自動清零。0 = 應(yīng)答順序空閑bit 3 RCEN: 接收使能位 (僅限主模式) 1 = 使能 I2C 接收模式0 = 接收空閑bit 2 PEN: 停止條件使能位 (僅限主模式) 1 = 在 SDA 和 SCL 引腳上啟動停止條件,由硬件自動清零0 = 停止條件空閑bit 1 RSEN: 重復(fù)起始條件使能位 (僅限主模式) 1 = 在SDA 和 SCL 引腳上啟動重復(fù)起始條件,由硬件自動清零 0 = 重復(fù)起始條件空閑bit 0 SEN: 起始條件使能/ 擴(kuò)展使能位主模式下:1 =在 SDA 和 SCL 引腳上啟動起始條件,由硬件自動清零 0 = 起始條件空閑從模式下:1 = 在從動發(fā)送和從動接收時(shí)均使能時(shí)鐘擴(kuò)展(擴(kuò)展使能) 0 = 只在從動發(fā)送時(shí)使能時(shí)鐘擴(kuò)展(與 PIC16F87X 兼容)注: 對于 ACKEN、 RCEN、PEN、 RSEN 和 SEN 等位,如果 I2C 模塊不處于空閑狀態(tài),該位可能不置 1 (無假脫機(jī)技術(shù)),且 SSPBUF 寄存器可能不寫入(或?qū)懭隨SPBUF 被禁止)。圖注:R = 可讀位 W = 可寫位 U = 未使用,讀作0- n = 上電復(fù)位值 “1”= 該位被置 1 “0” = 該位被清零 x = 不確定10.4.6 主模式通過對SSPCON寄存器中的各相應(yīng)SSPM位置1和清零并對 SSPEN置 1可以使能主模式。

主模式下,SCL和 SDA信號線由 MSSP硬件控制。主操作模式是通過檢測起始(START)和停止(STOP)條件產(chǎn)生中斷來工作的。起始標(biāo)志位(P)和停止標(biāo)志位(S)在復(fù)位或關(guān)閉MSSP模塊時(shí)被清零。當(dāng)P位被置1后可得到I2C總線的控制權(quán);否則當(dāng)P位和S位都清零時(shí),總線空閑。

在固件控制下的主模式中,用戶程序基于啟動位和停止位的狀態(tài)完成 I2C 總線的操作。主模式使能后,用戶有以下 6 種選擇:1. 在 SDA和 SCL 上發(fā)送起始條件;2. 在 SDA和 SCL 上發(fā)送重復(fù)起始條件;3. 寫 SSPBUF寄存器,啟動數(shù)據(jù)/地址的傳送;4. 設(shè)置 I2C 端口以接收數(shù)據(jù);5. 數(shù)據(jù)字節(jié)接收完畢后,發(fā)出應(yīng)答信號;6. 在 SDA和 SCL 上發(fā)送停止條件。以下幾種情況會引起SSP中斷標(biāo)志位SSPIF置1, (如果中斷允許則產(chǎn)生SSP 中斷) :? 起始條件? 停止條件? 發(fā)送/接收的傳輸字節(jié)? 發(fā)送應(yīng)答信號? 重復(fù)啟動狀態(tài)注: 當(dāng) MSSP 模塊設(shè)置為 I2C 主模式時(shí),不允許事件列隊(duì)。

例如:不允許用戶啟動起始條件,并在起始條件完成之前立即向SSPBUF 寄存器寫數(shù)據(jù)以啟動數(shù)據(jù)的發(fā)送。在這種情況下,不能向 SSPBUF 寄存器寫數(shù)據(jù),且寫沖突檢測標(biāo)志位 WCOL 被置1,表明未發(fā)生數(shù)據(jù)寫入 SSPBUF。10.4.6.1 I2C 主模式的操作主機(jī)產(chǎn)生所有的串行時(shí)鐘脈沖和啟動 / 停止信號。當(dāng)停止信號或重復(fù)啟動信號到來時(shí)中止傳送。

由于重復(fù)啟動信號也是下一個(gè)串行傳送的開始,因此 I2C 總線不會被釋放。在主發(fā)送器模式下, 串行數(shù)據(jù)通過SDA線輸出, 而SCL輸出串行時(shí)鐘。 發(fā)送的首字節(jié)包括接收器件的從機(jī)地址(7 位)和讀 / 寫位 (R/W)。

此時(shí) R/W 位將為邏輯“0” 。串行數(shù)據(jù)每次發(fā)送 8 位。?。

NRF24L01怎么一次發(fā)送自定義長度的數(shù)據(jù)?

在回答你的問題之前,我要反問幾個(gè)問題。一、你說的是發(fā)送一次數(shù)據(jù)包的長度?還是完成一次完整通信的數(shù)據(jù)長度?二、如果你想的是改動數(shù)據(jù)包的長度,那好,你寫一封信郵寄一張400字的方格紙出去,你為什么要去找能夠自定義的方格紙?比如347格的方格紙?不覺的累么?你知道電腦通信都是一個(gè)數(shù)據(jù)包一個(gè)數(shù)據(jù)包的發(fā)么,一個(gè)數(shù)據(jù)包是有固定的大小,哪怕你就是發(fā)一個(gè)1出去,也有可能是4kb的數(shù)據(jù)包(打個(gè)比方),你知道是為什么?你問的這么不清,我回答起來也巨累,不過接下來還是回答問題了如果是改動數(shù)據(jù)包的長度,將define 里的txpack 32(NRF的例程一般會設(shè)置數(shù)據(jù)包長32),找到他,把它改成unsigned char型或unsigned int型,寫代碼的時(shí)候弄成全局變量就可。

然后就是每一次更改數(shù)據(jù)包大小的發(fā)送,你必須重新初始化一次NRF,不然無法更改。

如果是一次完整通信的數(shù)據(jù)長度,這個(gè)就是你子寫通信協(xié)議了。

nRF24l01使用說明

類似的,還有通道1~5接收地址 設(shè)置寄存器: RX_ARRD_P1~5。 不過P1~P5共用32位高位地址,由P1設(shè)置, P2~P4只可以設(shè)置8位地址(低8位)。