xs128和2401.docx

上传人:b****4 文档编号:5403569 上传时间:2022-12-16 格式:DOCX 页数:16 大小:457.98KB
下载 相关 举报
xs128和2401.docx_第1页
第1页 / 共16页
xs128和2401.docx_第2页
第2页 / 共16页
xs128和2401.docx_第3页
第3页 / 共16页
xs128和2401.docx_第4页
第4页 / 共16页
xs128和2401.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

xs128和2401.docx

《xs128和2401.docx》由会员分享,可在线阅读,更多相关《xs128和2401.docx(16页珍藏版)》请在冰豆网上搜索。

xs128和2401.docx

xs128和2401

CE:

使能发射或接收;

CSN,SCK,MOSI,MISO:

SPI引脚端,微处理器可通过此引脚配置nRF24L01:

IRQ:

中断;

VDD:

电源输入端;

VSS:

电源地:

XC2,XC1:

晶体振荡器引脚;

VDD_PA:

为功率放大器供电,输出为1.8V;

ANT1,ANT2:

天线接口;

IREF:

参考电流输入

使用IO口模拟SPI,以龙丘科技的无线模块为例,使用M口模拟SPI可如下定义

#defineNRFIRQPTM_PTM0

#defineNRFCEPTM_PTM1

#defineNRFMISOPTM_PTM2

#defineNRFCSNPTM_PTM3

#defineNRFMOSIPTM_PTM4

#defineNRFSCKPTM_PTM5

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:

接收缓冲区空

Ps:

接收到新数据,数据发送完毕,重传到达最大次数都会引起中断,通过读取状态字可查询中断事件。

中断由IRQ引脚低电平触发。

SPI写模式

/********************************************************************

SPI读写函数

写入一个字节并返回一个字节

ch:

需要写入的字节

*********************************************************************/

unsignedcharSPI_Byte_RW(unsignedcharch)

{

unsignedchari;

for(i=1;i<=8;i++)

{

if(ch&0x80)//如果ch最高位为1

NRFMOSI=1;

else

NRFMOSI=0;

NRFSCK=1;//时钟置高

ch<<=1;//左移一位

_asm(nop);

_asm(nop);

NRFSCK=0;//时钟置低

ch|=NRFMISO;

}

return(ch);

}

解释:

1、该函数作用为一次SPI数据交换,将ch中一个字节数据按照高位在前低位在后的顺序串行发送,每发送一个bit都读回一个bit,8个比特发送完毕,同时也和24L01完成一次数据交换。

2、该函数是spi通信的基本函数

3、注意spi通信中,可以一次读取或写入多个字节,顺序为低字节在前,高字节在后,每个字节是高位在前,低位在后。

4、参考SPI时序图,可见,上升沿写入1个bit,下降沿读入一个bit。

5、该SPI通信函数只涉及一个字节的读写,没有涉及CS信号线。

SPI_Byte_RW()函数应用举例,一次写入多个字节

/************************************************************************************************

函数:

byteSPI_Write_Buf(bytereg,byte*pBuf,bytelen)

功能:

用于写数据:

为寄存器地址,pBuf:

为待写入数据地址,len:

写入数据的个数

************************************************************************************************/

byteSPI_Write_Buf(bytereg,byte*pBuf,bytelen)

{

bytestatus,cnt;

NRFCSN=0;//SPI使能

status=SPI_Byte_RW(reg);//第一个字节返回状态字

for(cnt=0;cnt

SPI_Byte_RW(*pBuf++);

NRFCSN=1;//关闭SPI

return(status);//

}

PS:

该函数完成多个字节的写入,返回状态字

本函数举例:

例:

我们要设置本机地址,24L01的地址为5个字节,假设地址放在一个5字节的数组中

byteconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址

写寄存器的指令字为001AAAAA,AAAAA用于表示写入的寄存器地址,各个寄存器地址可查阅数据手册

TX_ADDR寄存器在24L01中的地址为00010000,那么完整的指令字应该为00110000,可用如下定义和调用方法

//***********************NRF24L01指令字*******************************************************

#defineREAD_REG0x00//读寄存器指令

#defineWRITE_REG0x20//写寄存器指令

#defineRD_RX_PLOAD0x61//读取接收数据指令

#defineWR_TX_PLOAD0xA0//写待发数据指令

#defineFLUSH_TX0xE1//冲洗发送FIFO指令

#defineFLUSH_RX0xE2//冲洗接收FIFO指令

#defineREUSE_TX_PL0xE3//定义重复装载数据指令

#defineNOP0xFF//保留

//*****************SPI(nRF24L01)寄存器地址****************************************************

#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式

#defineEN_AA0x01//自动应答功能设置

#defineEN_RXADDR0x02//可用信道设置

#defineSETUP_AW0x03//收发地址宽度设置

#defineSETUP_RETR0x04//自动重发功能设置

#defineRF_CH0x05//工作频率设置

#defineRF_SETUP0x06//发射速率、功耗功能设置

#defineSTATUS0x07//状态寄存器

#defineOBSERVE_TX0x08//发送监测功能

#defineCD0x09//地址检测

#defineRX_ADDR_P00x0A//频道0接收数据地址

#defineRX_ADDR_P10x0B//频道1接收数据地址

#defineRX_ADDR_P20x0C//频道2接收数据地址

#defineRX_ADDR_P30x0D//频道3接收数据地址

#defineRX_ADDR_P40x0E//频道4接收数据地址

#defineRX_ADDR_P50x0F//频道5接收数据地址

#defineTX_ADDR0x10//发送地址寄存器

#defineRX_PW_P00x11//接收频道0接收数据长度

#defineRX_PW_P10x12//接收频道0接收数据长度

#defineRX_PW_P20x13//接收频道0接收数据长度

#defineRX_PW_P30x14//接收频道0接收数据长度

#defineRX_PW_P40x15//接收频道0接收数据长度

#defineRX_PW_P50x16//接收频道0接收数据长度

#defineFIFO_STATUS0x17//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模式。

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)

{

NRFCE=0;

SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ收发完成中断响应,16位CRC,主接收

NRFCE=1;

Dly_10us(15);//oldis'130'

}

将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:

powerup0:

powerdown

PRIM_RX:

1:

PRX0:

PTX

24L01的工作模式和寄存器及IO口的关系如下

CE引脚的作用

增强型Shockburst模式时序图

一个ESB(EnhancedShockBurst)周期,发送一个字节连带收到ACK大约339us

从powerdown状态需要先进入standyby状态,该状态转换需要1.5ms延迟,从standyby状态进入rx/tx状态,需要130us

置高CE维持最少10us,启动EnhancedShockBurst发射

直接传送模式发送

1.CONFIG寄存器:

地址00

保留,为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:

powerup0:

powerdown

PRIM_RX:

1:

PRX0:

PTX

2.EN_AA寄存器:

地址01

保留,0

保留,0

ENAA_P5

ENAA_P4

ENAA_P3

ENAA_P2

ENAA_P1

ENAA_P0

是否启用各datapipe的自动应答功能,1启用,0,不启用,复位默认为启用

3.EN_RXADDR寄存器:

地址02

保留,0

保留,0

ERX_P5

ERX_P4

ERX_P3

ERX_P2

ERX_P1

ERX_P0

是否启用各datapipe,1启用,0,不启用,复位为00000011,即默认启用datapipe1和datapipe0

4.SETUP_AW寄存器:

地址03

保留,0

保留,0

保留,0

保留,0

保留,0

保留,0

AW1

AW0

地址宽度,所有datapipe都一样

AW1,AW0=00,非法,01,3字节地址,10,4字节地址,11,5字节地址,默认为11,即5字节地址

5.SETUP_RETR寄存器:

地址04(设置自动重传参数)

ARD(复位为0000)

ARC(复位为0011)

ARD=0000,重传间隔为250+86us

0001,重传间隔为500+86us

…………………………….

1111,重传间隔为4000+86us

ARC=0000,禁止自动重传

0001,重传1次

……………………………..

1111,重传15次

6.RF_CH寄存器:

地址0x05,设置频道

保留,0

RF_CH

7个bit用于设置通信频道,共126个频道,复位为00000010,频道2

7.RF_SETUP寄存器:

地址0x06

保留,0

保留,0

保留,0

PLL_LOCK

RF_DR

RF_PWR

LNA_HCURR

PLL_LOCK:

RF_DR:

速率,0:

1M1:

2M

RF_PWR:

0018dbm

0112dbm

106dbm

110dbm

8.STATUS寄存器:

地址0x07

保留0

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:

接收缓冲区空

Ps:

接收到新数据,数据发送完毕,重传到达最大次数都会引起中断,通过读取状态字可查询中断事件。

中断由IRQ引脚低电平触发。

9.OBSERVE_TX寄存器:

地址0x08(发送观察寄存器,用于观察发送状态)

PLOS_CNT

ARC_CNT

PLOS_CNT:

丢包计数器,最大到15,写RF_CH寄存器可清除计数值

ARC_CNT:

重发次数计数

10.CD寄存器:

地址0x09(载波检测寄存器)

保留0

保留0

保留0

保留0

保留0

保留0

保留0

CD

CD:

检测到载波则置1,否则为0

11.RX_ADDR_P0寄存器:

地址0x0A(datapipe0接收地址)

共5个字节,低字节在前,高字节在后默认为0xe7e7e7e7e7

12.RX_ADDR_P1寄存器:

地址0x0B(datapipe1接收地址)

共5个字节,低字节在前,高字节在后默认为0xC2C2C2C2C2

13.RX_ADDR_P2寄存器:

地址0x0C(datapipe2接收地址)

共5个字节,低字节在前,高字节在后0xC2C2C2C2C3

14.RX_ADDR_P3寄存器:

地址0x0D(datapipe3接收地址)

共5个字节,低字节在前,高字节在后0xC2C2C2C2C4

15.RX_ADDR_P4寄存器:

地址0x0E(datapipe4接收地址)

共5个字节,低字节在前,高字节在后0xC2C2C2C2C5

16.RX_ADDR_P5寄存器:

地址0x0F(datapipe5接收地址)

共5个字节,低字节在前,高字节在后0xC2C2C2C2C6

17.TX_ADDR寄存器:

地址0x10(发送地址寄存器,对发送端而言,相当于源地址,也是接收端发回确认的目的地址)

共5个字节,默认为0xe7e7e7e7e7

18.RX_PW_P0寄存器:

地址0x11

保留0

保留0

RX_PW_P0

RX_PW_P0:

DATAPIPE0的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

19.RX_PW_P1寄存器:

地址0x12

保留0

保留0

RX_PW_P1

RX_PW_P1:

DATAPIPE1的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

20.RX_PW_P2寄存器:

地址0x13

保留0

保留0

RX_PW_P2

RX_PW_P2:

DATAPIPE2的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

21.RX_PW_P3寄存器:

地址0x14

保留0

保留0

RX_PW_P3

RX_PW_P3:

DATAPIPE3的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

22.RX_PW_P4寄存器:

地址0x15

保留0

保留0

RX_PW_P4

RX_PW_P4:

DATAPIPE4的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

23.RX_PW_P5寄存器:

地址0x16

保留0

保留0

RX_PW_P5

RX_PW_P5:

DATAPIPE5的接收数据载荷长度

0:

非法

1:

1个字节

…………………..

32:

32个字节

24.FIFO_STATUS寄存器:

地址0x17

保留0

TX_REUSE

TX_FULL

TX_EMPTY

保留0

保留0

RX_FULL

RX_EMPTY

TX_REUSE:

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指示这个应该接收

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1