|
|
nrf24l01帶數(shù)據(jù)返回的ack,等價(jià)于主從式被動(dòng)全雙工收發(fā)(不用切換收發(fā)),并且可以實(shí)現(xiàn)變數(shù)據(jù)長(zhǎng)度收發(fā)
之前求助過(guò),沒(méi)能解決,最近閑,研究了下。ack數(shù)據(jù)很多漢語(yǔ)的參考手冊(cè)沒(méi)有介紹,看的話看原版的英語(yǔ)nrf24l01 手冊(cè)
1:變數(shù)據(jù)長(zhǎng)度是指0-32長(zhǎng)度,可以發(fā)送的時(shí)候指定
2:帶數(shù)據(jù)返回的ack,就是開(kāi)啟應(yīng)答,一般情況是通過(guò)應(yīng)答看是否發(fā)送成功,這個(gè)ack可以帶返回?cái)?shù)據(jù),實(shí)現(xiàn)不切換收發(fā)模式的偽雙工
3:nrf24l01有三個(gè)緩沖區(qū),例子中是收到數(shù)據(jù)才裝載ack緩沖區(qū),所以前兩次收到的ack數(shù)據(jù)是隨機(jī)的,第三次才是發(fā)送過(guò)去的數(shù)據(jù)ack回來(lái),;實(shí)際應(yīng)用的時(shí)候可以提前裝載ack數(shù)據(jù),那么收到數(shù)據(jù)就會(huì)自動(dòng)把a(bǔ)ck緩沖區(qū)的數(shù)據(jù)聯(lián)通ack發(fā)出去(程序內(nèi)有說(shuō)明)
三個(gè)緩沖區(qū),先進(jìn)先出 first in – first out,第一個(gè)截圖最后說(shuō)了,要是保證緩存的就是要發(fā)送的,請(qǐng)清除FLUSH_TX 但是實(shí)際沒(méi)用好像,待測(cè)試
If the TX FIFO (PRX) contains more than one payload to a PTX, payloads are handled using the first in –
first out principle. The TX FIFO (PRX) is blocked if all pending payloads are addressed to a PTX where the
link is lost. In this case, the MCU can flush the TX FIFO (PRX) by using the FLUSH_TX command.也就是修改下面這個(gè)函數(shù)
void NRF24L01_PacketAckData(u8*pBuf,u8 len)//發(fā)送數(shù)據(jù)包,用于發(fā)送模式2/4
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(W_ACK_PAYLOAD,pBuf,len);
NRF24L01_CE=1;
}
void NRF24L01_PacketAckData(u8*pBuf,u8 len)//發(fā)送數(shù)據(jù)包,用于發(fā)送模式2/4
{
NRF24L01_CE=0;
NRF24L01_Write_Reg(FLUSH_TX, 0xff);
NRF24L01_Write_Buf(W_ACK_PAYLOAD,pBuf,len);
NRF24L01_CE=1;
}
不過(guò)也僅限于提前裝載ack數(shù)據(jù)的方案
發(fā)送程序:
- #include "sys.h"
- #include "delay.h"
- #include "usart1.h"
- #include "nRF24L01.h"
- #include<stdlib.h> //包含函數(shù)rand()聲明的頭文件
- int main()
- {
- u8 i,sta,tx_len=1;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //設(shè)置NVIC中斷分組4: 16位搶占優(yōu)先級(jí)0,15最好不用
- delay_init();
- USART1_Init(115200);
- printf("OK...\r\n\r\n\r\n");
- NRF24L01_Init(); //初始化NRF24L01
- while(NRF24L01_Check())
- {
- printf("NRF24L01 Error\r\n");
- delay_ms(1000);
- }
- printf("TX NRF24L01 OK\r\n");
-
- NRF24L01_TX_Mode();
-
- for(i=1;i<32;i++)
- TX_BUF[i]=i;
- TX_BUF[1]=10;
- while(1)
- {
- sta=NRF24L01_TxPacket(TX_BUF,tx_len,RX_BUF,&RX_ACK_NUM);//發(fā)送數(shù)據(jù)
- if(sta&TX_OK)//顯示要發(fā)送的數(shù)據(jù)
- {
- //發(fā)送成功打印發(fā)送的數(shù)據(jù)
- printf("TX_OK TX_BUF:");
- for(i=0;i<tx_len;i++)printf("%2d,",TX_BUF[i]);
- printf("\r\n");
-
- //發(fā)送成功一次變化一次長(zhǎng)度
- tx_len++;
- if(tx_len>32)tx_len=1;//測(cè)試變數(shù)據(jù)長(zhǎng)度發(fā)送,每次長(zhǎng)度加1,最大32,變?yōu)?
- //填充新數(shù)據(jù)
- TX_BUF[0]=tx_len;//第一個(gè)代表發(fā)送長(zhǎng)度
- TX_BUF[1]++; //加加數(shù) 用于看ack響應(yīng)延時(shí)幀數(shù)
-
- //長(zhǎng)度大于1最后一個(gè)隨機(jī)個(gè)數(shù) 用于看數(shù)據(jù)是否變化
- if (tx_len>=2)
- TX_BUF[tx_len-1]=rand()%10; //賦值發(fā)送的數(shù)據(jù) ,第一個(gè)數(shù)每次加1改變,最后一個(gè)數(shù)隨機(jī),中間的1 2 3、、、
- }
- if(sta&RX_OK)//顯示接收到的ack數(shù)據(jù) 連續(xù)證明不丟幀
- {
- printf("RX_ACK_OK RX_BUF:");
- for(i=0;i<RX_ACK_NUM;i++)printf("%2d,",RX_BUF[i]);
- printf("\r\n");
- }
- delay_ms(10);
- }
- }
復(fù)制代碼
注意看說(shuō)明書(shū)有的舊的nrf24l01不支持ack帶data
代碼下載:
nrf24l01_ack調(diào)通帶備注.7z
(206.84 KB, 下載次數(shù): 54)
2021-9-17 15:36 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|