1、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为低时持续写入,而
2、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为高,
3、则进入待机模式2。 接受数据时,一方面将nRF24L01配备为接受模式,接着延迟130μs进入接受状态等待数据到来。当接受方检测到有效地址和CRC时,就将数据包存储在接受堆栈中,同步中断标志位RX_DR置高,IRQ变低,以便告知MCU去取数据。若此时自动应答启动,接受方则同步进入发射状态回传应答信号。最后接受成功时,若CE变低,则nRF24L01进入空闲模式1。 二、模块电气特性 参数 数值 单位 供电电压 5 V 最大发射功率 0 dBm 最大数据传播率 2 Mbps 电流消耗(发射模式,0dBm) 11.3 mA 电流消耗(接受模式,2Mbps)
4、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
5、 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
6、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。
7、 六、数据和控制接口 通过如下六个引脚,可实现模块所有功能: ①IRQ(低电平有效,中断输出) ②CE(高电平有效,发射或接受模式控制) ③CSN(SPI信号) ④SCK(SPI信号) ⑤MOSI(SPI信号) ⑥MISO(SPI信号) 通过SPI接口,可激活在数据寄存器FIFO中数据;或者通过SPI命令(1个字节长度)访问寄存器。 在待机或掉电模式下,单片机通过SPI接口配备模块;在发射或接受模式下,单片机通过SPI接口接受或发射数据。 1.SPI指令 所有SPI指令均在当CSN由低到高开始跳变时执行;从MOSI写命令同步,MISO实时返回24L
8、01状态值;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有
9、效数据。从字节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读写时序见下面两图。在写寄存器之前,一定要进入待机模式或掉
10、电模式。其中,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:中断产生
11、时对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 Enhan
12、ced 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
13、 接受地址容许 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 设立地址宽度(所有数据通道)
14、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 射频通
15、道 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
16、 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 接受数据通道号: 00
17、0-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_AD
18、DR_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接受地址
19、最低字节可设立,高字节必要与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个字
20、节 …… 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
21、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接受
22、数据有效宽度: 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寄存器空标志
23、 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)和有效数
24、据(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
25、置高时,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
26、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 = 240
27、0 + 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 //在接受模式下使用,读有效数据 #de
28、fine 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
29、 //配备寄存器,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设立寄存器
30、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 R
31、X_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 R
32、X_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_P
33、LOAD_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
34、 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); /
35、/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;
36、 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
37、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读写
38、
status = SPI_RW(reg); //选取寄存器reg并返回其状态字
for(byte_ctr=0;byte_ctr 39、数据,RX/TX地址等.
{
uchar status,byte_ctr;
CSN = 0; //CSN为0时,才干进行SPI读写
status = SPI_RW(reg); //选取寄存器reg并返回其状态字
for(byte_ctr=0;byte_ctr 40、
//接受模式初始化:设立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 + 8 41、6us;重发次数: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_ 42、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通道,速率等,与接受类似
voi 43、d 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 44、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 45、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(R 46、X_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 = 47、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 48、 49、 //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) //如接 50、受到数据,则中断
{
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






