资源描述
nRF24L01无线通信模块使用手册
一、模块简介
该射频模块集成了NORDIC公司生产无线射频芯片nRF24L01:
1.支持2.4GHz全球开放ISM频段,最大发射功率为0dBm
2.2Mbps,传播速率高
3.功耗低,等待模式时电流消耗仅22uA
4.多频点(125个),满足多点通信及跳频通信需求
5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线)
6.工作原理简介:
发射数据时,一方面将nRF24L01配备为发射模式,接着把地址TX_ADDR和数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必要在CSN为低时持续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答启动,那么nRF24L01在发射数据后及时进入接受模式,接受应答信号。如果收到应答,则以为本次通信成功,TX_DS置高,同步TX_PLD从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已启动),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便告知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。
接受数据时,一方面将nRF24L01配备为接受模式,接着延迟130μs进入接受状态等待数据到来。当接受方检测到有效地址和CRC时,就将数据包存储在接受堆栈中,同步中断标志位RX_DR置高,IRQ变低,以便告知MCU去取数据。若此时自动应答启动,接受方则同步进入发射状态回传应答信号。最后接受成功时,若CE变低,则nRF24L01进入空闲模式1。
二、模块电气特性
参数
数值
单位
供电电压
5
V
最大发射功率
0
dBm
最大数据传播率
2
Mbps
电流消耗(发射模式,0dBm)
11.3
mA
电流消耗(接受模式,2Mbps)
12.3
mA
电流消耗(掉电模式)
900
nA
温度范畴
-40~+85
℃
三、模块引脚阐明
管脚
符号
功能
方向
1
GND
电源地
2
IRQ
中断输出
O
3
MISO
SPI输出
O
4
MOSI
SPI输入
I
5
SCK
SPI时钟
I
6
NC
空
7
NC
空
8
CSN
芯片片选信号
I
9
CE
工作模式选取
I
10
+5V
电源
四、模块与AT89S52单片机接口电路
VCC
P1.0
P1.1
CN
CN
P1.2
P1.3
P1.4
P3.2
GND
AT89S52MCU模块
+5V
CE
CSN
CN
CN
SCK
MOSI
MISO
IRQ
GND
Nrf24L01通讯模块
注:上图为示意连接,可依照自己实际需求进行更改;使用AT89S52MCU模块时,请将Nrf24L01通讯模块每个端口(MOSI、SCK、CSN和CE)接4.7K排阻上拉到VCC增强其驱动能力(如下图:)。若使用其他单片机与Nrf24L01通讯模块相连时请串联2K电阻。
五、工作模式控制
工作模式由CE和PWR_UP、PRIM_RX两寄存器共同控制:
模式
PWR_UP
PRIM_RX
CE
FIFO寄存器状态
接受模式
1
1
1
-
发射模式
1
0
11
数据存储在FIFO寄存器中,发射所有数据
发射模式
1
0
0→12
数据存储在FIFO寄存器中,发射一种数据
待机模式II
1
0
1
TX FIFO为空
待机模式I
1
-
0
无正在传播数据
掉电模式
0
-
-
-
注1:进入此模式后,只要CSN置高,在FIFO中数据就会及时发射出去,直到所有数据数据发射完毕,之后进入待机模式II。
注2:正常发射模式,CE端高电平应至少保持10us。24L01将发射一种数据包,之后进入待机模式I。
六、数据和控制接口
通过如下六个引脚,可实现模块所有功能:
①IRQ(低电平有效,中断输出)
②CE(高电平有效,发射或接受模式控制)
③CSN(SPI信号)
④SCK(SPI信号)
⑤MOSI(SPI信号)
⑥MISO(SPI信号)
通过SPI接口,可激活在数据寄存器FIFO中数据;或者通过SPI命令(1个字节长度)访问寄存器。
在待机或掉电模式下,单片机通过SPI接口配备模块;在发射或接受模式下,单片机通过SPI接口接受或发射数据。
1.SPI指令
所有SPI指令均在当CSN由低到高开始跳变时执行;从MOSI写命令同步,MISO实时返回24L01状态值;SPI指令由命令字节和数据字节两某些构成。
SPI命令字节表
指令名称
指令格式(二进制)
字节数
操作阐明
R_REGISTER
000A AAAA
1~5
读寄存器。AAAAA表达寄存器地址。
W_REGISTER
001A AAAA
1~5
写寄存器。AAAAA表达寄存器地址,只能在掉电或待机模式下操作。
R_RX_PAYLOAD
0110 0001
1~32
在接受模式下读1~32字节RX有效断气。从字节0开始,数据读完后,FIFO寄存器清空。
W_TX_PAYLOAD
1010 0000
1~32
在发射模式下写1~31字节TX有效数据。从字节0开始。
FLUSH_TX
1110 0001
0
在发射模式下,清空TX FIFO寄存器。
FLUSH_RX
1110 0010
0
在接受模式下,清空RX FIFO寄存器。在传播应答信号时不应执行此操作,否则不能传播完整应答信号。
REUSE_TX_PL
1110 0011
0
应用于发射端。重新使用上一次发射有效数据,当CE=1时,数据将不断重新发射。在发射数据包过程中,应禁止数据包重用功能。
NOP
1111 1111
0
空操作。可用于读状态寄存器。
2.SPI时序
SPI读写时序见下面两图。在写寄存器之前,一定要进入待机模式或掉电模式。其中,Cn——SPI指令位;Sn——状态寄存器位;Dn——数据位(低字节在前,高字节在后;每个字节中高位在前)
SPI读时序
SPI写时序
七、寄存器内容及阐明
地址
(十六进制)
寄存器
位
复位值
类型
阐明
00
CONFIG
配备寄存器
Reserved
7
0
R/W
默以为0
MASK_RX_DR
6
0
R/W
可屏蔽中断RX_RD
1:中断产生时对IRQ没影响
0:RX_RD中断产生时,IRQ引脚为低
MASK_TX_DS
5
0
R/W
可屏蔽中断TX_RD
1:中断产生时对IRQ没影响
0:TX_RD中断产生时,IRQ引脚为低
MASK_MAX_RT
4
0
R/W
可屏蔽中断MAX_RT
1:中断产生时对IRQ没影响
0:MAX_RT中断产生时,IRQ引脚为低
EN_CRC
3
1
R/W
CRC使能。如果EN_AA中任意一位为高,则EN_CRC为高。
CRCO
2
0
R/W
CRC校验值:
0:1字节
1:2字节
PWR_UP
1
0
R/W
0:掉电 1:上电
PRIM_RX
0
0
R/W
0:发射模式 1:接受模式
01
EN_AA Enhanced ShockBurst™
使能“自动应答”功能
Reserved
7:6
00
R/W
默以为00
ENAA_P5
5
1
R/W
数据通道5自动应答使能位
ENAA_P4
4
1
R/W
数据通道4自动应答使能位
ENAA_P3
3
1
R/W
数据通道3自动应答使能位
ENAA_P2
2
1
R/W
数据通道2自动应答使能位
ENAA_P1
1
1
R/W
数据通道1自动应答使能位
ENAA_P0
0
1
R/W
数据通道0自动应答使能位
02
EN_RXADDR
接受地址容许
Reserved
7:6
00
R/W
默以为00
ERX _P5
5
0
R/W
数据通道5接受数据使能位
ERX _P4
4
0
R/W
数据通道4接受数据使能位
ERX _P3
3
0
R/W
数据通道3接受数据使能位
ERX _P2
2
0
R/W
数据通道2接受数据使能位
ERX _P1
1
1
R/W
数据通道1接受数据使能位
ERX _P0
0
1
R/W
数据通道0接受数据使能位
03
SETUP_AW
设立地址宽度(所有数据通道)
Reserved
7:2
000000
R/W
默以为00000
AW
1:0
11
R/W
接受/发射地址宽度:
00:无效
01:3字节
10:4字节
11:5字节
04
SETUP_RETR
自动重发
ARD
7:4
0000
R/W
自动重发延时时间:
0000:250us
0001:500us
……
1111:4000us
ARC
3:0
0011
R/W
自动重发计数:
0000:禁止自动重发
0001:自动重发1次
……
1111:自动重发15次
05
RF_CH
射频通道
Reserved
7
0
R/W
默以为0
RF_CH
6:0
0000010
R/W
设立工作通道频率
06
RF_SETUP
射频寄存器
Reserved
7:5
000
R/W
默以为000
PLL_LOCK
4
0
R/W
锁相环使能,测试下使用
RF_DR
3
1
R/W
数据传播率:
0:1Mbps
1:2Mbps
RF_PWR
2:1
11
R/W
发射功率:
00:-18dBm
01:-12dBm
10:-6dBm
11:0dBm
LNA_HCURR
0
1
R/W
低噪声放大器增益
07
STATUS
状态寄存器
Reserved
7
0
R/W
默认值为0
RX_DR
6
0
R/W
接受数据中断位。当收到有效数据包后置1。
写‘1’清除中断
TX_DS
5
0
R/W
发送数据中断。如果工作在自动应答模式下,只有当接受到应答信号后置1。
写‘1’ 清除中断
MAX_RT
4
0
R/W
重发次数溢出中断。
写‘1’清除中断。
如果MAX_RT中断产生,则必要清除后才干继续通讯
RX_P_NO
3:1
111
R
接受数据通道号:
000-101:数据通道号
110:未使用
111:RX FIFO寄存器为空
TX_FULL
0
0
R
TX FIFO寄存器满标志位
08
OBSERVE_TX
发送检测寄存器
PLOS_CNT
7:4
0
R
数据包丢失计数器。当写RF_CH寄存器时,此寄存器复位。当丢失15个数据包后,此寄存器重启。
ARC_CNT
3:0
0
R
重发计数器。当发送新数据包时,此寄存器复位。
09
CD
载波检测
Reserved
7:1
000000
R
CD
0
0
R
0A
RX_ADDR_P0
39:0
E7E7E7E7E7
R/W
数据通道0接受地址。最大长度为5个字节。
0B
RX_ADDR_P1
39:0
C2C2C2C2C2
R/W
数据通道1接受地址。最大长度为5个字节。
0C
RX_ADDR_P2
7:0
C3
R/W
数据通道2接受地址。最低字节可设立,高字节必要与RX_ADDR_P1[39:8]相等
0D
RX_ADDR_P3
7:0
C4
R/W
数据通道3接受地址。最低字节可设立,高字节必要与RX_ADDR_P1[39:8]相等
0E
RX_ADDR_P4
7:0
C5
R/W
数据通道4接受地址。最低字节可设立,高字节必要与RX_ADDR_P1[39:8]相等
0F
RX_ADDR_P5
7:0
C6
R/W
数据通道5接受地址。最低字节可设立,高字节必要与RX_ADDR_P1[39:8]相等
10
TX_ADDR
39:0
E7E7E7E7E7
R/W
发送地址。在ShockBurstTM模式,设立RX_ADDR_P0与此地址相等来接受应答信号
11
RX_PW_P0
Reserved
7:6
00
R/W
默以为00
RX_PW_P0
5:0
0
R/W
数据通道0接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
12
RX_PW_P1
Reserved
7:6
00
R/W
默以为00
RX_PW_P1
5:0
0
R/W
数据通道1接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
13
RX_PW_P2
Reserved
7:6
00
R/W
默以为00
RX_PW_P2
5:0
0
R/W
数据通道2接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
14
RX_PW_P3
Reserved
7:6
00
R/W
默以为00
RX_PW_P3
5:0
0
R/W
数据通道3接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
15
RX_PW_P4
Reserved
7:6
00
R/W
默以为00
RX_PW_P4
5:0
0
R/W
数据通道4接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
16
RX_PW_P5
Reserved
7:6
00
R/W
默以为00
RX_PW_P5
5:0
0
R/W
数据通道5接受数据有效宽度:
0:无效
1:1个字节
……
32:32个字节
17
FIFO_STATUS
FIFO状态寄存器
Reserved
7
0
R/W
默以为0
TX_REUSE
6
0
R
若TX_REUSE=1,则当CE置高时,不断发送上一数据包。TX_REUSE通过SPI指令REUSE_TX_PL设立;通过W_TX_PALOAD 或 FLUSH_TX复位
TX_FULL
5
0
R
TX_FIFO寄存器满标志
1:寄存器满
0:寄存器未满,有可用空间
TX_EMPTY
4
1
R
TX_FIFO寄存器空标志
1:寄存器空
0:寄存器非空
Reserved
3:2
00
R/W
默以为00
RX_FULL
1
0
R
RX FIFO寄存器满标志
1:寄存器满
0:寄存器未满,有可用空间
RX_EMPTY
0
1
R
RX FIFO寄存器空标志
1:寄存器空
0:寄存器非空
N/A
TX_PLD
255:0
X
W
N/A
RX_PLD
255:0
X
R
八、模块编程控制
1.ShockBurstTM发射模式
①设立PRIM_RX为低。
②通过SPI接口,将接受节点地址(TX_ADDR)和有效数据(TX_PLD)写入模块,写TX_PLD时,CSN必要始终置低。
③置CE为高,启动发射。CE高电平持续时间至少为10us。
④ShockBurstTM发射模式:
系统上电
启动内部16MHz时钟
数据打包
数据发射
⑤若启动了自动应答模式(ENAA_P0=1),则模块及时进入接受模式(NO_ACK已设立)。如果接受到应答信号,则表达发射成功,TX_DS置高且TX FIFO中有效数据被移出;如果没有接受到应答信号,则自动重发(自动重发已设立);如果自动重发次数超过最大值(ARC),MAX_RT置高,在TX FIFO中数据不被移出。当MAX_RT和TX_DS置高时,IRQ激活。只有重新写状态寄存器(STATUS)才干关闭IRQ。如果重发次数达到最大后,仍没有接受到应答信号,在MAX_RT中断清除之前,不会再发射数据。PLOS_CNT计数器会增长,每当有一种MAX_RT中断产生。
⑥如果CE置低,则系统进行待机模式I,否则发送TX FIFO寄存器中下一种数据包。当TX FIFO中数据发射完,CE仍为高时,系统进入待机模式II。
⑦在待机模式II下,CE置低,则进入待机模式I。
2.ShockBurstTM接受模式
①设立PRIM_RX为高,配备接受数据通道(EN_RXADDR)、自动应答寄存器(EN_AA)和有效数据宽度寄存器(RX_PW_PX)。
②置CE为高,启动接受模式。
③130us后,模块检测空中信号,
④接受到有效数据包后(地址匹配、CRC检核对的),数据储存在RX FIFO中,RX_DR置高。
⑤如果启动了自动应答功能,则发送应答信号。
⑥MCU置CE为低,进入先机模式I。
⑦MCU可通过SPI接口将数据读出
⑧模块准备好进入发射模式或接受模式或待机模式。
九、RF通道频率
RF通道频率指是nRF24L01所使用中心频率,该频率范畴从2.400GHz到2.525GHz,以1MHz区别一种频点,故有125个频点可使用。
由参数RF_CH拟定,公式为:F0 = 2400 + RF_CH(MHz)
十、示例程序
接受模块与发射模块大某些程序代码相似,如下:
1.SPI命令和寄存器配备头文献API.h(依照第六、七两点编写)
#ifndef _BYTE_DEF_
#define _BYTE_DEF_
typedef unsigned char BYTE;
#endif
// SPI命令
#define READ_REG 0x00 //读第0个寄存器
#define WRITE_REG 0x20 //写第0个寄存器
#define RD_RX_PLOAD 0x61 //在接受模式下使用,读有效数据
#define WR_TX_PLOAD 0xA0 //在发送模式下使用,写有效数据
#define FLUSH_TX 0xE1 //在发送模式下使用,清TX FIFO寄存器
#define FLUSH_RX 0xE2 //在接受模式下使用,清RX FIFO寄存器
#define REUSE_TX_PL 0xE3 //发送方使用,重复发送最后数据
#define NOP 0xFF //空操作,用于读状态寄存器STATUS值
// nRF24L01寄存器地址
#define CONFIG 0x00 //配备寄存器,8bit
#define EN_AA 0x01 //自动应答设立寄存器,8bit
#define EN_RXADDR 0x02 //接受地址设立寄存器,8bit
#define SETUP_AW 0x03 //地址宽度设立寄存器,8bit
#define SETUP_RETR 0x04 //自动重复发送设立寄存器,8bit
#define RF_CH 0x05 //RF通道寄存器,8bit
#define RF_SETUP 0x06 //RF设立寄存器,8bit
#define STATUS 0x07 //状态寄存器,8bit
#define OBSERVE_TX 0x08 //发送观测寄存器,8bit
#define CD 0x09 //载波检测寄存器,8bit,
#define RX_ADDR_P0 0x0A //接受地址数据通道0,40bit
#define RX_ADDR_P1 0x0B
#define RX_ADDR_P2 0x0C
#define RX_ADDR_P3 0x0D
#define RX_ADDR_P4 0x0E
#define RX_ADDR_P5 0x0F
#define TX_ADDR 0x10 //发送地址.发送方使用,40bit
#define RX_PW_P0 0x11 //通道0接受有效数据字节长度(1-32字节),8bit
#define RX_PW_P1 0x12
#define RX_PW_P2 0x13
#define RX_PW_P3 0x14
#define RX_PW_P4 0x15
#define RX_PW_P5 0x16
#define FIFO_STATUS 0x17 //FIFO状态寄存器,8bit
2.SPI操作头文献(与单片机接口设立在此头文献中)
#define uchar unsigned char
#define TX_ADR_WIDTH 5 //地址长度为5个字节
#define TX_PLOAD_WIDTH 20 //数据长度为20个字节
uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0xE7};
char rx_buf[TX_PLOAD_WIDTH]; //接受缓冲区
uchar flag; //标志位
int test[12];
#define CE P0_0 //芯片使能:Chip Enable
#define CSN P0_1 //片选信号:Chip Select Not
#define SCK P1_2 //串行时钟信号:Serial Clock
#define MOSI P0_3 //主发从收:Master In Slave Out
#define MISO P0_4 //主收从发:Master Out Slave In
#define IRQ P3_2 //中断查询:Interrupt Request
uchar bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
uchar SPI_RW(uchar byte)//写一种字节到nRF24L01,并返回此时nRF24L01状态及数据
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) //先写字节高位,再写低位
{
MOSI = (byte & 0x80); //MOSI取byte最高位
byte = (byte << 1); //byte左移一位
SCK = 1; //SCK从高到低时开始写入
byte |= MISO;
//获取MISO位.从MOSI写命令同步,MISO返回nRF24L01状态及数据
SCK = 0;
}
return(byte);
}
uchar SPI_RW_Reg(BYTE reg,BYTE value)//将字节value写入寄存器reg
{
uchar status;
CSN = 0; //CSN为0时,才干进行SPI读写
status = SPI_RW(reg); //选取寄存器reg
SPI_RW(value); //写字节value到该寄存器
CSN = 1; //终结SPI读写
return(status);
}
BYTE SPI_Read(BYTE reg)//读寄存器reg状态字
{
BYTE reg_val;
CSN = 0; //CSN为0时,才干进行SPI读写
SPI_RW(reg); //选取寄存器reg
reg_val = SPI_RW(0); //写0,什么操作也不进行,仅仅为了读寄存器状态
CSN = 1; //终结SPI读写
return(reg_val);
}
uchar SPI_Read_Buf(BYTE reg,BYTE *pBuf,BYTE bytes)
//从寄存器reg读出数据,典型应用是读RX数据或RX/TXF地址
{
uchar status,byte_ctr;
CSN = 0; //CSN为0时,才干进行SPI读写
status = SPI_RW(reg); //选取寄存器reg并返回其状态字
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); //从寄存器读数据
CSN = 1; //终结SPI读写
return(status); //返回状态值
}
uchar SPI_Write_Buf(BYTE reg,BYTE *pBuf,BYTE bytes)//将数据写入寄存器,如TX数据,RX/TX地址等.
{
uchar status,byte_ctr;
CSN = 0; //CSN为0时,才干进行SPI读写
status = SPI_RW(reg); //选取寄存器reg并返回其状态字
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
SPI_RW(*pBuf++); //写数据到寄存器
CSN = 1; //终结SPI读写
return(status); //返回状态值
}
//接受模式初始化:设立RX地址,RX数据宽度,RF通道,速率,低噪声放大器增益
//设立完之后,将CE置高,准备好接受数据
void RX_Mode(void)
{
SPI_RW_Reg(WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);
SPI_Write_Buf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
// 写 TX_Address 到 nRF24L01
SPI_RW_Reg(WRITE_REG + SETUP_RETR,0x1a);// 自动重发延时:500us + 86us;重发次数:10次
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
//将地址TX_ADDRESS写入寄存器0数据通道0
SPI_RW_Reg(WRITE_REG + EN_AA,0x01); //ENAA_P0=1,数据通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x01); //ERX_P0=1,使能
SPI_RW_Reg(WRITE_REG + RF_CH,40); //40个通信频段
SPI_RW_Reg(WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);
//数据通道0RX数据长度为TX_PLOAD_WIDTH,要与发送一致
SPI_RW_Reg(WRITE_REG + RF_SETUP,0x0F);
//速率为2Mbps,发送功率为0dBm,低噪声放大器增益为1
SPI_RW_Reg(WRITE_REG + CONFIG,0x0f);
//PRIM_RX=1,接受方;PWR_UP=1;CRC检查字为2字节;
}
//发送模式初始化:设立发送地址,设立发送数据,设立接受方地址,RF通道,速率等,与接受类似
void TX_Mode(void)
{
SPI_RW_Reg(WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + CONFIG,0x0e);
SPI_Write_Buf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
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 + EN_AA,0x01);
SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG + SETUP_RETR,0x1a);
SPI_RW_Reg(WRITE_REG + RF_CH,40);
SPI_RW_Reg(WRITE_REG + RF_SETUP,0x0f);
}
void show_status(void) //显示状态寄存器值
{
test[0] = SPI_Read(EN_AA); //0x01
test[1] = SPI_Read(EN_RXADDR); //0x01
test[2] = SPI_Read(SETUP_AW); //0x03,5个字节
test[3] = SPI_Read(SETUP_RETR); //0x1a
test[4] = SPI_Read(RF_CH); //0x28
test[5] = SPI_Read(RF_SETUP); //0x0f
test[6] = SPI_Read(RX_ADDR_P2);
test[7] = SPI_Read(RX_ADDR_P3);
test[8] = SPI_Read(RX_ADDR_P4);
test[9] = SPI_Read(RX_ADDR_P5);
test[10] = SPI_Read(RX_PW_P0); //0x14
test[11] = SPI_Read(STATUS);
}
void init_io(void)
{
CE = 0; //待机
CSN = 1; //SPI禁止读写
SCK = 0;
}
void Inituart(void)//设立串口工作模式
{
TMOD |= 0x20; //定期器1工作在方式2,8位自动重装模式
TL1 = 0xfd; //波特率为9600
TH1 = 0xfd;
SCON = 0x50; //模式1,8位数据
TR1 = 1; //启动定期器1
TI=1;
}
void init_int0(void)//外部中断设立
{
EA=1; //容许全局中断
ES=1; //开串行口中断
EX0=1; //容许外部中断0
}
void delay_ms(unsigned int x) //毫秒级延时
{
unsigned int i,j;
i=0;
for(i=0;i<x;i++)
{
j=108;
while(j--);
}
}
3.发送模块主函数(向接受模块发射数据“abcdefg”,中断方式)
void main(void)
{
int i;
init_io(); //IO端口设立
Inituart(); //串口设立
init_int0(); //外部中断0设立
for(i=0;i<7;i++) //待发数据tx_buf,发送数据为”abcdefg”七个字母
tx_buf[i] = 'a'+i;
while(1)
{
CE = 0; //Standby-1模式
TX_Mode(); //发送设立
CE = 1; //启动发送模式
delay_ms(20);
CE = 0; //Standby-1模式
delay_ms(1000);
}
}
//中断函数
//如果RX_DR=1,则读取数据,之后清除标志位;
//如果TX_DS或MAX_RT为1,则仅清除中断标志位
void ISR_int0(void) interrupt 0
{
sta=SPI_Read(STATUS); //读状态寄存器STATUS
if(RX_DR) //如接受到数据,则中断
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接受数据
flag=1; //标志位置高
}
if(MAX_RT) //重发中断达到最大数
SPI_RW_Reg(FLUSH_TX,0); //清除TX FIFO寄存器
SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除RX_DR,TX_DS和MAX_RT中断标志位
}
4.接受模块主函数(接受并在串口输出,同步输出状态寄存器值,使用查询方式)
void main(void)
{
i
展开阅读全文