nrf24l01使用与调试经验总结(包括一收多发)

合集下载

24L01详细经验之谈

24L01详细经验之谈
无论何时收到确认,都会认为上一个数据包发送成功,这个数据包将被从发送缓冲区清除,并且把TX_DS IRQ置为高。
每次开始spi写,读回来的都是状态字。
射频收发工作在2.4~2.4835G
收发共用天线接口
GFSK调制
250k,1M,2M的空中速率
发射输出功率最高0dBm,即1mW
6路1对6星型网络(使用6个data pipe)
#define NOP 0xFF//保留
//*****************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 //配置收发状态,CRC校验模式以及收发状态响应方式
/*reg:待写入的寄存器;value:待写入的值*/
ucharSPI_RW_Reg(uchar reg, uchar value)
{
ucharstatus;定义uchar变量status
CSN = 0;//片选非
status = SPI_RW(reg);//待写入的寄存器地址reg
SPI_RW(value);//写入值为value
自动应答的延时和重发次数是可编程的。
/********************************************************************************/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置
/********************************************************************************/

一位从厌倦调试NRF24L01无线模块到成功的收发经验分享

一位从厌倦调试NRF24L01无线模块到成功的收发经验分享

一位从厌倦调试NRF24L01无线模块到成功的收发经验分享拿到这对小家伙的时候,距离现在已经有好几个月了吧。

直到大概一个月前,才将它们从抽屉里拿出来。

之所以一直搁置着,是因为想要靠自己来驱动它们。

厌倦了那种拿到模块到处找例程的感觉。

不过,这也让人吃尽了苦头。

熬了多少个夜晚,看了多少遍datasheet,甚至因为实在太困难了,所以索性再次搁在一边,拿了个较为简单的1302寻寻feel。

这一搁置,又过了一个多星期。

大学时间真的太紧张了,各种各样无聊的课占据了平日的大部分时间。

周末,才感觉是为自己活着的日子。

第三次——真正的战役,持续时间并不算长,相对于前两次的铺垫来说。

熬了一个星期的夜,时间总是在不知不觉之间溜走,往往回过神来才发觉,大家都睡下了,已经三四点了。

不过喜欢这宁静的夜,也再一次深深的体会到,走这条路的人是没有夜晚的,因为深夜才是最高效的时间。

不过,这次的收尾工作却是在今天早上进行的。

前天晚上进行最终的测试,两台机都装的自己程序,结果接收机反馈回来乱码,经过昨天一整天的排查才知道是连续读数据函数不能表达。

修修改改忙了一整晚,到昨晚三四点还是没有突破,索性睡个觉。

今早九点,熟睡中一个激灵醒过来,打开电脑再看看,还是不行。

失望中倒头呼呼大睡,十一点再次醒来,牙都还没刷,问题就解决了。

虽然如此,但是心里还是带着小小的疑问,不明白究竟为什么。

这里实现的功能比较简单:通过PC串口给发送端写入要传送的数据(定长32字节),接收端将收到的数据反馈给PC。

由于只有一台电脑,所以只能够同时开两个串口调试窗来观察。

不过这里面的收获也挺多的,例如对C的指针有了较为直观、深刻的感受,再如数据交换函数的写法,还有就是包含串口通信在内所有程序都是参考数据手册写的。

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)/**************************************************基于单片机无线报警系统主机(机载设别)系统程序/**************************************************/#include#include#define uchar unsigned char/***************************************************/#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址#define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址uchar RX_BUF[4]={0,0,0,0};uchar TX_BUF[4]={0x20,0x20,0x20,0x20};uchar flag; //无线模块接受数据标志uchar DATA = 0x01;uchar bdata sta;unsigned int a,k; //定时器延时参数uchar mark; //传感器响应标志位uchar mark1; // 延时标志位sbit RX_DR = sta^6; //接受数据成功标志位sbit TX_DS = sta^5; // 发送成功标志位sbit MAX_RT = sta^4; //最大重发上限标志位sbit HW=P2^0; //红外感应模块输入端sbit ZD=P1^7; //震动传感器输入端sbit LED=P2^1; //LED报警器输出端sbit SDA=P2^4; //语音模块数据控制端sbit ONN=P2^3; //语音芯片电源控制端口sbit FM =P2^5; //蜂鸣器/************************************************** 函数:delayus()描述:延迟x微秒/**************************************************/void delayus(unsigned int t){while(t--);}/************************************************** 函数:delayms()描述:延迟x毫秒/**************************************************/void delayms(unsigned int h){unsigned int j;while(h--)for(j=85;j>0;j--);}/************************************************** 函数:delays()描述:延迟x.xx秒/**************************************************/void delays( float h){unsigned int i,j;h*=100;while(h--){for(i=0;i<235;i++)for(j=0;j<3;j++);}}/************************************************** 函数:sendadd()描述:语音模块发送地址信号/**************************************************/ void sendadd(unsigned char addr){uchar i;delayms(5); /* 数据信号置于低电平5ms */for(i=0;i<8;i++){ SDA=1;if(addr & 1){delayus(60); /* 高电平比低电平为600us:200us,表示发送数据1 */SDA=0;delayus(20);}else{delayus(20);SDA=0; /* 高电平比低电平为200us:600us,表示发送数据0 */ delayus(60);}addr>>=1;}SDA=1;}/**************************************************函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/**************************************************/uchar SPI_RW(uchar byte){for(i=0; i<8; i++) // 循环8次{MOSI = (byte & 0x80); // byte最高位输出到MOSIbyte <<= 1; // 低一位移位到最高位SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据byte |= MISO; // 读MISO到byte最低位SCK = 0; // SCK置低}return(byte); // 返回读出的一字节}/**************************************************//**************************************************函数:SPI_RW_Reg()描述:写数据value到reg寄存器/**************************************************/uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字SPI_RW(value); // 然后写数据到该寄存器CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/************************************************** 函数:clear()描述:清TX_FIFO寄存器/**************************************************/void clear(){CSN=0;SPI_RW(FLUSH_TX);CSN=1;}/************************************************** 函数:SPI_Read()描述:从reg寄存器读一字节/**************************************************/ uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // CSN置低,开始传输数据SPI_RW(reg); // 选择寄存器reg_val = SPI_RW(0); // 然后从该寄存器读数据CSN = 1; // CSN拉高,结束数据传输return(reg_val); // 返回寄存器数据}/**************************************************//**************************************************函数:SPI_Read_Buf()描述:从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/**************************************************/ uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes) {uchar status, i;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; ipBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/**************************************************//**************************************************函数:SPI_Write_Buf()描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/**************************************************/ uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) {uchar status, i;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; iSPI_RW(pBuf[i]); // 逐个字节写入nRF24L01CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/**************************************************函数:RX_Mode()描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包/**************************************************/void RX_Mode(void){CE = 0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F); // CRC使能,16位CRC校验,上电,接收模式CE = 1;delayus(200); // 拉高CE启动接收设备}/**************************************************函数:TX_Mode()描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。

NRF24L01之我的学习体会

NRF24L01之我的学习体会

本程序存在的问题:反应不够灵敏,当在按键1和按键2之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。

对部分函数的解释:uint SPI_RW(uint dat)最基本的函数,完成GPIO模拟SPI 的功能。

将输出字节(MOSI)从MSB 循环输出,同时将输入字节(MISO)从LSB 循环移入。

上升沿读入,下降沿输出。

(从SCK被初始化为低电平可以判断出)uchar SPI_Read(uchar reg); //从reg寄存器读一字节读取寄存器值的函数:基本思路就是通过READ_REG命令(也就是0x00+寄存器地址),把寄存器中的值读出来。

对于函数来说也就是把reg 寄存器的值读到reg_val 中去。

uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器寄存器访问函数:用来设置24L01 的寄存器的值。

基本思路就是通过WRITE_REG命令(也就是0x20+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。

对于函数来说也就是把value值写到reg 寄存器中。

需要注意的是,访问NRF24L01 之前首先要enable 芯片(CSN=0;),访问完了以后再disable芯片(CSN=1;)。

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);//从reg寄存器读出bytes个字节,通常用来//读取接收通道数据或接收/发送地址接收缓冲区访问函数:主要用来在接收时读取FIFO 缓冲区中的值。

基本思路就是通过READ_REG命令把数据从接收FIFO(RD_RX_PLOAD)中读出并存到数组里面去。

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);//把pBuf缓存中的数据写入到nRF24L01通常用来写入发发射缓冲区访问函数:主要用来把数组里的数放到发射FIFO缓冲区中。

NRF24L01 MSP430调试文档.

NRF24L01 MSP430调试文档.

/****************nrf24l01 fuctions ******************/
void NRF24L01IO_initial(); uchar SPI_RW(uchar byte); uchar SPI_RW_Reg(uchar reg, uchar value); uchar SPI_Read(uchar reg); uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes); void RX_Mode(void);
#define BIT(x) (1 << (x))
#defefine CSN
5
#define CLK
3
#define MOSI
1
#define MISO
2
#define IRQ
4
/************address width and Pload width******************/
0x00 // Define read command to register 0x20 // Define write command to register 0x61 // Define RX payload register address
// 5 bytes // 1 bytes
#define WR_TX_PLOAD #define FLUSH_TX #define FLUSH_RX #define REUSE_TX_PL #define NOP
2010-7-11 21:33

关于NRF24l01的调试

关于NRF24l01的调试

NRF24l01的调试过程与方法小结心得体会:最近老板给了几块nrf24l01模块我,初次上手难免走了许多的弯路,经过近一周的时间的不断调试,模块之间终于可以相互收发数据了。

这样下来终于松了一口气。

其间的各种辛苦与艰辛难于言表。

上网大致看了一下,网上基于51的调试比较多,但是我们实验室用的是DSP2812,由于nrf24l01是SPI接口,2812上刚好有SPI的接口,这样貌似给使用带来了方便,但是51之类的芯片虽然没有SPI口,但是例程也最多,关于他的讨论比较多。

最开始我的想法也比较混乱,想直接用SPI来调试,把底层函数稍微修改了一下,发现并没有结果,这个东西就像一个黑匣子一样,即看不见也摸不着,后来我慢慢改变了思路。

既然网上基于IO口模拟的SPI的例程最多,我决定另外走一条路,先用2812的IO 口模拟SPI再用自带的SPI口去调试。

这样一来我就有了两条可以走的路。

第一条:底层SPI时序用IO口模拟去写。

第二条:底层直接用2812的SPI去操作。

虽然这样一来,路好走了一点,有各类的程序可以参考,但是这样带来最大的一个问题,这也是后来我才发现的,nrf24l01的最大读写速率是有限制的,2812在150M运行时很显然是太大了一点,由于nrf24l01对时序的要求很高,端口的读写速率和时序都有严格的要求,所以我们才看到,在网上一般是15M左右的单片机来模拟IO口,没有谁用150M的DSP来模拟IO口的,当然既然确定了这样的方法后来也发现了问题,我还是继续走下去了。

很重要的一点是系统的时钟频率。

当然时序的要求也很高,这也就是为什么,网上说这个模块不好调试的原因,既然是调试,当然我们既然是调试,肯定有一个思路和方法。

那么方法是什么呢?开始的时候我是一股脑将发送和接收的程序都写进去,然后啥现象也没有,然后就傻眼了。

在网上看了看,于是有了一点思路。

方法是将发送和接收的调试分开来调试,以读取nrf24l01内部的寄存器为手段,先调试发送方,发送方调试没有问题以后,让发送方不断的发送数据,然后再来调试接收方,直到接收方也没有问题,再接着望下面去做。

nRF24L01学习经验

nRF24L01学习经验

nRF24L01学习经验nRF24L01+nRF24L01+这个无线收发模块目前已经大致学习完毕,实现的功能以及各项参数:1~32字节数据的无线传输;5m的有效收发距离,1m的无遗漏收发距离;距离在5m内和5m外转变时,超出距离数据传输会自动中断,进入范围自动继续;实验中数据不丢失,无错误。

可用于短距离的数据传输和交互。

在通信模块的学习中,主要分为以下3个部分1、通过SPI配置nRF24L01+的寄存器因为nRF24L01+的寄存器配置只支持SPI总线,从无线板与MCU的连线情况看,单片机自带的SPI总线接口与无线板接口不匹配,所以要模拟一个SPI总线来进行控制,查找了一些SPI的总线描述,感觉SPI较I2C的时序更为简单,模拟SPI的过程中,遇到过一个问题,将所需要的函数全都写好,感觉时序也没有任何问题,可是寄存器就是写不进去,这个问题困扰了很久,感觉是时序的问题,但是函数中却找不出来,后来发现是模拟时钟的高低电平写反了。

Void SCK_H(void) {PORTB &= ~(1 << SCK);}Void SCK_L(void) {PORTB |= (1 << SCK);}这个问题导致时序错误而无法写入,而且纠错中不容易发现。

SPI的读写过程如下(读一个字节,写一个字节等就不贴出了):void write_reg(unsigned char address, unsigned char temp){unsigned char status = 0;PORTB &= ~BIT(CSN); //使能SPIstatus = spi_rw(address);//前8位写入地址跟读取状态寄存器write(temp);//写入一个字节PORTB |= BIT(CSN);}unsigned char read_reg(unsigned char address){unsigned char dat = 0;unsigned char status = 0;PORTB &= ~BIT(CSN); //使能SPIstatus = spi_rw(address);//前8位写入地址跟读取状态寄存器dat = read();//读取一个字节PORTB |= BIT(CSN);return dat;}SPI调通之后配置寄存器就只需要了解寄存器的作用就行了,24L01的寄存器也不算多,配置过程也就是理解寄存器作用的过程了。

nrf24l01调试方法及经验总结

nrf24l01调试方法及经验总结

NRF24L01 :在通信中的应用方法,经验总结(1)2011-07-31 13:15首先说一下:是一款新型单片射频收发器件,工作于 GHz~ GHz ISM频段。

内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。

nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。

是想将这个IC调通,首先要多读一下技术文档:下载技术文档以下C51驱动的源代码库()此库文件适合发送端使用,在接收端会有所不同,请看第 2 部分的分析在使用过程中,需要引用SCK = 1; uchar |=MISO; then set SCK lowagain } return(uchar); . SPI_RW(reg);reg_val = SPI_RW(0); then read registervalue CSN =1; and write value to it.. CSN =1; // CSN highagain return(status); // return nRF24L01 statusuchar } /****************************************************************************************************/ /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*************************************************************************************** *************/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { uintstatus,uchar_ctr; CSN = 0; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read statusuchar for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr] =SPI_RW(0); // CSN =1; return(status);// return nRF24L01 statusuchar } /******************************************************************************* ************************** /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于写数据:reg为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*************************************************************************************** ******************/ uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) { uint status,uchar_ctr; CSN = 0; //SPI使能status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)// SPI_RW(*pBuf++); CSN = 1; //关闭SPI return(status); //} /************************************************************************************ ****************/ /*函数:void SetRX_Mode(void) /*功能:数据接收配置/*************************************************************************************** *************/ void SetRX_Mode(void) { CE=0; SPI_RW_Reg(WRITE_REG + CONFIG,0x0f); // IRQ收发完成中断响应,16位CRC ,主接收CE = 1;inerDelay_us(130); } /************************************************************** ****************************************/ /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中/*************************************************************************************** ***************/ uchar nRF24L01_RxPacket(unsigned char* rx_buf) { unsigned char revale=0; sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{ Display8bit(3,0,sta); //看一下接收机状态判断一下,IC的工作状态,在正常使用过程中,这句需要去掉 CE =0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer revale =1; //读取数据完成标志} SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志returnrevale; } /***************************************************************************** ****************************** /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据/*************************************************************************************** *******************/ void nRF24L01_TxPacket(unsigned char *tx_buf) { CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf,TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送SPI_RW_Reg(WRITE_REG+STATUS,0X7E); CE=1; //置高CE,激发数据发送inerDelay_us(100); }NRF24L01 :在通信中的应用方法,经验总结(3)2011-07-31 13:42再接着往下说调试过程:一般拿到IC后最大的困难就是无法知道自己 IC 是否已经工作了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

nrf24l01使用与调试经验总结
(包括一收多发--1主机最多6从机)
----------------------------------------------------------------------------------------------------------------------------
主要特性
工作在2.4GHz ISM 频段
调制方式:GFSK/FSK
数据速率:2Mbps/1Mbps/250Kbps
超低关断功耗:<0.7uA
超低待机功耗:<15uA
快速启动时间:<130uS
内部集成高PSRR LDO
宽电源电压范围:1.9-3.6V
数字IO 电压: 3.3V/5V
低成本晶振:16MHz±60ppm
接收灵敏度:<-83dBm @2MHz
最高发射功率:7dBm
接收电流(2Mbps):<15mA
发射电流(2Mbps):<12mA(0dBm)
10MHz 四线SPI 模块
内部集成智能ARQ 基带协议引擎
收发数据硬件中断输出
支持1bit RSSI 输出
极少外围器件,降低系统应用成本
QFN20 封装或COB 封装
注意:C代表了命令,S表示寄存器值,D表示数据
写数据:SPI写命令+寄存器地址----->SPI写入数据
读数据:SPI写寄存器地址(可以使用读命令+寄存器地址)----->SPI读取数据
不论是读取或者写入数据,甚至是读/写len长度的数据都要先写寄存器地址;
总的来说时候就三个模式:
1.待机模式(待机模式+掉电省电模式)
2.发送模式
3.接受模式
具体各个模式介绍参考数据手册。

----------------------------------------------------------------------------------------------------------------
nrf发送数据是以包来发送。

其中前导码和CRC不用管。

具体我们来看看中间三部分:
地址:
地址也就是接收到通道的地址,如果是能了自动应答,那么我们得将发送地址(TX_ADDR) 和
接受应答信号的通道地址(RX_ADDR_P0)设置为一样的。

地址这里必须搞清楚:
发送流程:发送方根据发送地址(TX_ADDR)发送到接收方(RX_ADDR_P0)接收方收到数据后以接收通道的地址(RX_ADDR_P0)为发送地址发送应答信号给发送方(这个应答信号为自动发送不需要人为发送)。

例如:发送方TX_ADDR=0x10=接收方接收通道地址(以通道0为例:RX_ADDR_P0)=发送端接收通道地址(以通道0为例:RX_ADDR_P0),总的来说就是接受方发送地址和接受应答信号的通道地址和接受方地址要一致。

多机组网只需要使能接收方全部通道并且分配好地址就ok了。

对于地址的分配要注意:
通道0和通道1的地址为5字节可随意给值。

其他2~5高4字节与通道1高四字节相同(通用高4字节)我们只能修改他的左后一个字节地址例如:
const u8 RX0_ADDRESS[5]={0x10,0x10,0x10,0x10,0xAA}; //接收地址
const u8 RX1_ADDRESS[5]={0x11,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX2_ADDRESS[5]={0x12,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX3_ADDRESS[5]={0x13,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX4_ADDRESS[5]={0x14,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX5_ADDRESS[5]={0x15}; //接收地址
其实有数据手册我们知道同道1有40位同道2只有8位所以我们在给同道2~5定义地址的时候可以定义为一个字节(上述通道5)亦可以为了统一定义为5字节(通道2~4)但是要注意:定义为5字节也好1字节也好我们在配置模式的时候通道2~5在写入地址的时候自能写入1字节而不能写入5字节(会该导致接收不到数据-------这时刻巨坑)
对于包控制字:
这一部分主要是在配置模式的时候配置相应寄存器即可。

负载数据:
nrf有两个32字节的fifo寄存器用来存放负载数据的
发送负载数据寄存器:W_TX_PAYLOAD(也就是命令,本人习惯叫他寄存器)
接收负载数据寄存器:R_RX_PAYLOAD(也就是命令,本人习惯叫他寄存器)
发送/接收数据过程:配置好模式-----发送/接收数据都是对W_TX_PAYLOAD/R_RX_PAYLOAD 寄存器进行读写完成数据的发送。

发送/接收完成都会产生中断,IRQ会输出低电平(原先为高电平,重点)
注意:在通过IRQ中断收发数据过程中遇到stm32io配置为上拉输入和IRQ引脚连接会导致有的时候进入不了中断
原因:IRQ的下拉能力太弱了会被io控偶的上拉电阻强制拉高,也就是说产生IRQ中断由于上拉电阻影响IRQ回一直置高(巨坑)。

补救方法:将io配合为浮空输入即可完美解决。

查阅资料得到:
通道0具有接收和发送能力,然而其他2~5智能接收(重点)
-----------------------------------------------------------------------------------------------------------------
模式配置(在配置模式的时候完成地址的配置和字段字的配置):
发送模式:
1.写入发送地址和接受应答通道地址
2.使能应答通道
3.使能接收地址
4.设置自动重发时间和重发次数
5.设置通信频道
6.设置发射参数(功率,增益等)
7.设置模式(发送还是接受)
注意在配置发送或者接受时候要先让其工作再待机模式即CE要先置0.
接受模式:
1.接收通道地址
2.接收通道有效数据宽度
3.使能通道自动应答
4.使能接受通道地址
5.设置通信频道
6.设置参数
7.配置工作模式
数据的发送和接受:
发送一包数据:
1.向fifo中写入数据,等待IRQ发送完成中断
2.读取状态寄存器中的值
3.将读取到的状态寄存器中的值写入状态寄存器
4,.判断之前读取到的状态寄存器中得值判断是发送完成还是发送失败
5.清空fifo寄存器
读取一包数据:
1.读取状态寄存器中的值
2.将读取到的状态寄存器中的值写入状态寄存器
4.判断状态寄存器中得值,是否接受成功(成功就读取fifo中的数据,并且清空fifo)总结:通信成功三个相同
1.发送接收应答地址相同(包括应答地址)
2.发送接收频道相同(信道)
3.发送接收频率相同
注意:这个芯片不光能以2.4Ghz的载波发射呢,它的带宽为2.4G----2.512G呢。

这中间有一百多M的频带,可以划分成2M一个的信道。

这个寄存器中的值就标明你想工作在哪个信道上啦,只有设置为同频的设备才能接收的到很容易理解吧。

比如你设为10信道,则10*2=20M即发送时所用的载波频率就是2400+20=2420MHz。

当然也只有设为2420M的接收设备才能接收的到了。

————————————————。

相关文档
最新文档