24l01经验.docx
- 文档编号:17444416
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:12
- 大小:20.83KB
24l01经验.docx
《24l01经验.docx》由会员分享,可在线阅读,更多相关《24l01经验.docx(12页珍藏版)》请在冰点文库上搜索。
24l01经验
24L01经验谈
(一)
2011-05-1509:
31
NRF24L01经验谈
作者:
盛多铮
单位:
安徽师范大学电子创新实验室
时间:
2010年12月
接触无线模块已有一段时间了,还记得第一次调通2个节点的兴奋呵。
。
。
前段时间用24L01做的一件作品也在院创新本比赛中拿到了不错的成绩,自己当然也是很高兴的。
难得今晚有空,就把无线模块的经验好好总结一番,一来是方便自己以后阅读,二来嘛,让后来的人少走些弯路吧。
。
。
另外,关于寄存器的说明,在本文中谈得很少,因为文档中已经有很详细的说明了。
闲话少说,进入正题:
24L01是Nordic公司的一款无线芯片,其引脚如下:
CE:
使能发射或接收;
CSN,SCK,MOSI,MISO:
SPI引脚端,微处理器可通过此引脚配置nRF24L01:
IRQ:
中断;
VDD:
电源输入端;
VSS:
电源地:
XC2,XC1:
晶体振荡器引脚;
VDD_PA:
为功率放大器供电,输出为1.8V;
ANT1,ANT2:
天线接口;
IREF:
参考电流输入
其中跟单片机通信时要用到的引脚有:
CE,CSN,SCK,MOSI,MISO以及IRQ。
注意硬件上的电源不要超过3.3V,
下面是24L01的时序图
SPI读模式
SPI写模式
由图可知,发送时高位在前,低位在后,每写一个bit,返回一个状态字位,每次写操作都可读回一个完整的状态字。
以下是读回的状态字
Status(地址:
0x07)
保留
RX_DR
TX_DS
MAX_RT
RX_P_NO
TX_FULL
RX_DR:
接收数据准备好,接收缓冲区有新的数据到达时被置为1,向该位写1可清除该位
TX_DS:
缓冲区数据被发送完后被置为1,如果自动应答启用的话,只有在对方应答到达后才会置1,向该位写1可清除该位
MAX_RT:
若没有收到对方确认,24L01会自动超时重传,当到达最大重传次数后,该位被置1,向该位写1可清除该位。
若不清除该位则无法进一步通信。
RX_P_NO:
3bit,表示正在读取缓冲区数据载荷的数据管道编号。
000~101:
数据管道编号。
110:
没有使用
111:
接收缓冲区空
注意:
接收到新数据,数据发送完毕,重传到达最大次数都会引起中断,通过读取状态字可查询中断事件。
中断由IRQ引脚低电平触发。
/********************************************************************
SPI读写函数
写入一个字节并返回一个字节
ch:
需要写入的字节
*********************************************************************/
/*****************************模拟SPI时序****************************/
ucharSPI_RW(ucharch)
{
ucharbit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(ch&0x80);
ch=(ch<<1);
SCK=1;
ch|=MISO;
SCK=0;
}
return(ch);
}解释:
1、 该函数作用为一次SPI数据交换,将ch中一个字节数据按照高位在前低位在后的顺序串行发送,每发送一个bit都读回一个bit,8个比特发送完毕,同时也和24L01完成一次数据交换。
2、 该函数是spi通信的基本函数
3、 注意spi通信中,可以一次读取或写入多个字节,顺序为低字节在前,高字节在后,每个字节是高位在前,低位在后。
4、 参考SPI时序图,可见,上升沿写入1个bit,下降沿读入一个bit。
5、 该SPI通信函数只涉及一个字节的读写,没有涉及CS信号线。
SPI_RW_Reg()函数应用举例,一次写入多个字节
/*************************************************************************/
/*reg:
待写入的寄存器;value:
待写入的值*/
ucharSPI_RW_Reg(ucharreg,ucharvalue)
{
ucharstatus;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
函数:
SPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
功能:
用于写数据:
为寄存器地址,pBuf:
为待写入数据地址,len:
写入数据的个数
************************************************************************************************/
***********************************/
ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
{
ucharstatus,uchar_ctr;
CSN=0; //SPI使能
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr SPI_RW(*pBuf++); CSN=1; //关闭SPI return(status); } PS: 该函数完成多个字节的写入,返回状态字 本函数举例: 例: 我们要设置本机地址,24L01的地址为5个字节,假设地址放在一个5字节的数组中 ucharconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //本地地址 写寄存器的指令字为001AAAAA, AAAAA用于表示写入的寄存器地址,各个寄存器地址可查阅数据手册 TX_ADDR寄存器在24L01中的地址为00010000,那么完整的指令字应该为00110000,可用如下定义和调用方法 //***********************NRF24L01指令字******************************************************* #defineREAD_REG 0x00 //读寄存器指令 #defineWRITE_REG 0x20 //写寄存器指令 #defineRD_RX_PLOAD 0x61 //读取接收数据指令 #defineWR_TX_PLOAD 0xA0 //写待发数据指令 #defineFLUSH_TX 0xE1//冲洗发送FIFO指令 #defineFLUSH_RX 0xE2 //冲洗接收FIFO指令 #defineREUSE_TX_PL 0xE3 //定义重复装载数据指令 #defineNOP 0xFF //保留 //*****************SPI(nRF24L01)寄存器地址**************************************************** #defineCONFIG 0x00 //配置收发状态,CRC校验模式以及收发状态响应方式 #defineEN_AA 0x01 //自动应答功能设置 #defineEN_RXADDR 0x02 //可用信道设置 #defineSETUP_AW 0x03 //收发地址宽度设置 #defineSETUP_RETR 0x04 //自动重发功能设置 #defineRF_CH 0x05 //工作频率设置 #defineRF_SETUP 0x06 //发射速率、功耗功能设置 #defineSTATUS 0x07 //状态寄存器 #defineOBSERVE_TX 0x08 //发送监测功能 #defineCD 0x09 //地址检测 #defineRX_ADDR_P0 0x0A //频道0接收数据地址 #defineRX_ADDR_P1 0x0B //频道1接收数据地址 #defineRX_ADDR_P2 0x0C //频道2接收数据地址 #defineRX_ADDR_P3 0x0D //频道3接收数据地址 #defineRX_ADDR_P4 0x0E //频道4接收数据地址 #defineRX_ADDR_P5 0x0F //频道5接收数据地址 #defineTX_ADDR 0x10 //发送地址寄存器 #defineRX_PW_P0 0x11 //接收频道0接收数据长度 #defineRX_PW_P1 0x12 //接收频道0接收数据长度 #defineRX_PW_P2 0x13 //接收频道0接收数据长度 #defineRX_PW_P3 0x14 //接收频道0接收数据长度 #defineRX_PW_P4 0x15 //接收频道0接收数据长度 #defineRX_PW_P5 0x16 //接收频道0接收数据长度 #defineFIFO_STATUS 0x17 //FIFO栈入栈出状态寄存器设置 可用以下语句调用 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写本地地址 24L01被设置为接收模式后,可通过6个不同的数据通道(datapipe)接收数据。 每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的。 这意味着可以有6个被配置成发送状态的nRF24L01可以和一个配置成接收状态的nRF24L01通信,并且接收方可以区分。 数据通道0有一个唯一的40bit的可设置的地址。 其余的通道1到通道5则地址前32位相同,而后8位不同。 所有的数据通道都可以实现EnhancedShockBurst模式。 24L01经验谈 (二) 2011-05-1509: 31 NRF24L01使用数据通道的地址对接收的包进行确认。 这意味着24L01在返回ACK的时候使用相同的地址。 在发送端,数据通道0被用来接收确认信息,因此通道0的地址必须等于发送地址,这样才能收到确认信息。 当一个24L01发送结束后,它会打开接收器并等待确认。 如果没有收到确认,则重发,直到收到确认。 当重发超过一定次数则发出中断并改变状态寄存器。 重发次数的限制在SETUP_RETR_ARC寄存器中设置。 无论何时收到确认,都会认为上一个数据包发送成功,这个数据包将被从发送缓冲区清除,并且把TX_DSIRQ置为高。 每次开始spi写,读回来的都是状态字。 射频收发工作在2.4~2.4835G 收发共用天线接口 GFSK调制 250k,1M,2M的空中速率 发射输出功率最高0dBm,即1mW 6路1对6星型网络(使用6个datapipe) 增强型ShockBurst包格式 前置域1byte 地址域3-5byte 包控制域9bit 载荷0-32字节 CRC1-2字节 地址域是接收机地址 包控制域 载荷长度6bit Pid2bit NO_ACK1bit 载荷长度6bit说明最多32字节 Pid用于包编号,用于确定是重发包还是新包 NO_ACK用于表示是否自动应答,如为1则表示无需自动应答 自动应答的延时和重发次数是可编程的。 /********************************************************************************/ /*函数: voidSetRX_Mode(void) /*功能: 数据接收配置 /********************************************************************************/ voidSetRX_Mode(void) { CE=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); //IRQ收发完成中断响应,16位CRC ,主接收 CE=1; Delay_us(15); //适当的延时 将00001111写入config寄存器 以下是config寄存器说明 保留,为0 MASK_RX_DR MASK_TX_DS MASK_MAX_RT EN_CRC CRCO PWR_UP PRIM_RX MASK_RX_DR 和MASK_TX_DS和MASK_MAX_RT主要用于设置status寄存器中的这三位表示的事件发生时是否通过IRQ引脚来反映,1,不反映在IRQ上,0反映在IRQ上。 EN_CRC: 1,启用CRC校验,0不启用 CRCO: 0: 1个字节crc,1: 两个字节crc PWR_UP: 1: powerup 0: powerdown PRIM_RX: 1: PRX 0: PTX 24L01的工作模式和寄存器及IO口的关系如下 CE引脚的作用 一个ESB(EnhancedShockBurst)周期,发送一个字节连带收到ACK大约339us 从powerdown状态需要先进入standyby状态,该状态转换需要1.5ms延迟,从standyby状态进入rx/tx状态,需要130us 置高CE维持最少10us,启动EnhancedShockBurst发送 EnhancedShockBurst™模式下发送数据流程 1. 配置config寄存器,将PRIM_RX置为0,表示发送模式 2. 当需要发送数据时,首先需要配置地址TX_ADDR,这个地址应该是接收端地址,即应该是接收端6个datapipe地址中的一个即可保证对方收到。 如果要使用自动应答,当对方进行自动应答时也会使用这个地址,应答消息由发送端的datapipe0接收,所以发送的datapipe0的地址应等于TX_ADDR,若需要自动应答则。 (若是和上一次发送是相同地址,则可不用重写地址) 3. 配置TX_PLD,将需要发送的数据送入nrf24L01,通过SPI连续写入数据载荷时,nrf24L01将自动对字节数计数。 (数据载荷必须在cs为低的时候连续写入) 4. 将CE置高并维持最少10us,这个脉冲将启动ShockBurst发送 5. NRF24L01: a) 打开射频 b) 启动晶振 c) 数据打包 d) 发送 6. 如果启动了自动应答(且重传次数未达到最大值),NRF24L01将自动转入接收状态。 若在规定时间内收到了应答包,则这是一次成功的发送,TXFIFO中的数据被清除,同时置高status寄存器中的TX_DS位。 如果在规定时间内未收到应答包则自动重传(当启用自动重传时,由SETUP_RETR寄存器中的ARC位指定重传次数)。 当重传次数到达最大值依然没有收到应答,则status寄存器中的MAX_RT被置高,TXFIFO缓冲区中的数据并不被移除。 MAX_RT或TX_DS被置高都会在IRQ引脚上引起中断(低电平有效,重写status寄存器中的对应位可清除)。 在到达最大重传次数并引发中断后,在没有清除MAX_RT之前,任何数据都不能发送。 每次发生MAX_RT中断,PLOS_CNT计数器都会加1,用于统计丢包数。 7. CE置低以后,设备进入STANDBY_I状态。 否则TXFIFO缓冲区中的下一个数据载荷将被发送。 如果数据缓冲区空,而CE仍然为高,设备将进入STANDBY-II模式。 8. 如果设备处于STANDBY-II模式,当CE置低后,设备将进入STANDBY-I模式。 (STANDBY模式可减少电流的消耗,在该模式下,SPI通信仍然可以完成) EnhancedShockBurst™模式下接收数据流程 1. 设置config寄存器中的PRIM_RX为1,且置CE为高 2. 130us之后,NRF24L01开始监视射频信号 3. 当合法的包被接收到(地址匹配),数据被存储到RX-FIFO缓冲区中,status寄存器中的RX_DR被置高,IRQ引脚同时发出中断信号(如果未屏蔽该信号)。 Status寄存器中的RX_P_NO指示这个应该接收该数据的DATAPIPE号。 4. 如果自动应答启用的话,一个应答信号将被发出 5. MCU将CE置为低将进入STANDBY-I模式 6. MCU可通过SPI读出接收到的数据 另外: 关于24L01组网想说明几点应注意的地方: (1)注意地址的分配 文档中明确说明只有通道0具有5个字节的可配置地址,其他的5个节点都只有1字节可自由配置地址, 比如可以在接收节点这样配置: uintconstRXADR0[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址 uintconstRXADR1[RX_ADR_WIDTH]={0xc1,0xc2,0xc2,0xc2,0xc2}; //通道1地址 uintconstRXADR2[1]={0xc2}; //通道2地址 uintconstRXADR3[1]={0xc3}; //通道3地址 uintconstRXADR4[1]={0xc4}; //通道4地址 uintconstRXADR5[1]={0xc5}; //通道5地址 然后将各发送节点地址与接收端相应通道地址设置相同即可 (2)接收节点对各发送节点进行区分 这个就是判断状态寄存器的1-3位即可达到区分的目的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24 l01 经验