nRF24L01无线通信模块使用手册 - 图文

更新时间:2024-04-24 09:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

深圳市德普施科技有限公司

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。

二、模块电气特性

参数 供电电压 最大发射功率 最大数据传输率 电流消耗(发射模式,0dBm) 电流消耗(接收模式,2Mbps) 电流消耗(掉电模式) 温度范围

三、模块引脚说明

管脚 1 2 3 4 5 6

数值 5 0 2 11.3 12.3 900 -40~+85 单位 V dBm Mbps mA mA nA ℃ 符号 GND IRQ MISO MOSI SCK NC 1

功能 电源地 中断输出 SPI输出 SPI输入 SPI时钟 空 方向 O O I I 深圳市德普施科技有限公司

7 8 9 10 NC CSN CE +5V 空 芯片片选信号 工作模式选择 电源 I I

四、模块与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电阻。

2

深圳市德普施科技有限公司

五、工作模式控制 工作模式由CE和PWR_UP、PRIM_RX两寄存器共同控制: 模式 PWR_UP PRIM_RX CE FIFO寄存器状态 接收模式 发射模式 发射模式 待机模式II 待机模式I 掉电模式 1 1 1 1 1 0 1 0 0 0 - - 1 11 0→12 1 0 - - 数据存储在FIFO寄存器中,发射所有数据 数据存储在FIFO寄存器中,发射一个数据 TX FIFO为空 无正在传输的数据 - 注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命令字节表

指令名称 指令格式(二进制) 000A AAAA 001A AAAA 0110 0001 字节数 操作说明 R_REGISTER W_REGISTER R_RX_PAYLOAD 1~5 1~5 1~32 读寄存器。AAAAA表示寄存器地址。 写寄存器。AAAAA表示寄存器地址,只能在掉电或待机模式下操作。 在接收模式下读1~32字节RX有效断气。从字节0开始,数据读完后,FIFO寄存器清空。 W_TX_PAYLOAD FLUSH_TX

1010 0000 1110 0001 1~32 0 3

在发射模式下写1~31字节TX有效数据。从字节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 MASK_RX_DR 6 0 R/W 寄存器 CONFIG Reserved 位 7 复位值 0 类型 R/W 配置寄存器 默认为0 可屏蔽中断RX_RD 1:中断产生时对IRQ没影响 0:RX_RD中断产生时,IRQ引脚为低 可屏蔽中断TX_RD MASK_TX_DS 5 0 R/W 1:中断产生时对IRQ没影响 0:TX_RD中断产生时,IRQ引脚为低 MASK_MAX_RT 可屏蔽中断MAX_RT 4 0 R/W 1:中断产生时对IRQ没影响 0:MAX_RT中断产生时,IRQ引脚为低 说明 4

深圳市德普施科技有限公司

EN_CRC 3 1 R/W CRC使能。如果EN_AA中任意一位为高,则EN_CRC为高。 CRC校验值: 0:1字节 1:2字节 0:掉电 1:上电 0:发射模式 1:接收模式 使能“自动应答”功能 7:6 5 4 3 2 1 0 7:6 5 4 3 2 1 0 7:2 00 1 1 1 1 1 1 00 0 0 0 0 1 1 000000 R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W 默认为00 数据通道5自动应答使能位 数据通道4自动应答使能位 数据通道3自动应答使能位 数据通道2自动应答使能位 数据通道1自动应答使能位 数据通道0自动应答使能位 接收地址允许 默认为00 数据通道5接收数据使能位 数据通道4接收数据使能位 数据通道3接收数据使能位 数据通道2接收数据使能位 数据通道1接收数据使能位 数据通道0接收数据使能位 设置地址宽度(所有数据通道) 默认为00000 接收/发射地址宽度: 00:无效 01:3字节 10:4字节 11:5字节 自动重发 自动重发延时时间: 0000:250us 0001:500us ?? 1111:4000us CRCO 01 02 03 AW 1:0 11 R/W PWR_UP PRIM_RX EN_AA Enhanced ShockBurst? Reserved ENAA_P5 ENAA_P4 ENAA_P3 ENAA_P2 ENAA_P1 ENAA_P0 EN_RXADDR Reserved ERX _P5 ERX _P4 ERX _P3 ERX _P2 ERX _P1 ERX _P0 SETUP_AW Reserved 2 1 0 0 0 0 R/W R/W R/W 04 SETUP_RETR ARD 7:4 0000 R/W ARC 3:0 0011 R/W 自动重发计数: 0000:禁止自动重发 0001:自动重发1次 5

深圳市德普施科技有限公司

?? 1111:自动重发15次 05 06 RF_DR RF_PWR 2:1 11 R/W 3 1 R/W RF_CH Reserved RF_CH RF_SETUP Reserved PLL_LOCK 7 6:0 7:5 4 0 0000010 000 0 R/W R/W R/W R/W 射频通道 默认为0 设置工作通道频率 射频寄存器 默认为000 锁相环使能,测试下使用 数据传输率: 0:1Mbps 1:2Mbps 发射功率: 00:-18dBm 01:-12dBm 10:-6dBm 11:0dBm 07 RX_DR TX_DS 5 0 R/W 6 0 R/W LNA_HCURR STATUS Reserved 0 7 1 0 R/W R/W 低噪声放大器增益 状态寄存器 默认值为0 接收数据中断位。当收到有效数据包后置1。 写‘1’清除中断 发送数据中断。如果工作在自动应答模式下,只有当接收到应答信号后置1。 写‘1’ 清除中断 重发次数溢出中断。 写‘1’清除中断。 如果MAX_RT中断产生,则必须清除后才能继续通讯 接收数据通道号: 000-101:数据通道号 110:未使用 111:RX FIFO寄存器为空 08 TX_FULL OBSERVE_TX 0 0 R TX FIFO寄存器满标志位 发送检测寄存器 数据包丢失计数器。当写RF_CH寄存器时,此寄存器复位。当丢失15个数据包后,此寄存器重启。 09

MAX_RT 4 0 R/W RX_P_NO 3:1 111 R PLOS_CNT 7:4 0 R ARC_CNT CD Reserved 3:0 7:1 0 000000 6

R R 重发计数器。当发送新数据包时,此寄存器复位。 载波检测 深圳市德普施科技有限公司

0A 0B CD RX_ADDR_P0 RX_ADDR_P1 0 39:0 39:0 7:0 0 E7E7E7E7E7 C2C2C2C2C2 C3 R R/W R/W 数据通道0接收地址。最大长度为5个字节。 数据通道1接收地址。最大长度为5个字节。 数据通道2接收地址。最低字节可设置,高字节必须与RX_ADDR_P1[39:8]相等 数据通道3接收地址。最低字节可设置,高字节必须与RX_ADDR_P1[39:8]相等 数据通道4接收地址。最低字节可设置,高字节必须与RX_ADDR_P1[39:8]相等 数据通道5接收地址。最低字节可设置,高字节必须与RX_ADDR_P1[39:8]相等 发送地址。在ShockBurst模式,设置RX_ADDR_P0与此地址相等来接收应答信号 默认为00 数据通道0接收数据有效宽度: 0:无效 1:1个字节 ?? 32:32个字节 TM0C RX_ADDR_P2 R/W 0D RX_ADDR_P3 7:0 C4 R/W 0E RX_ADDR_P4 7:0 C5 R/W 0F RX_ADDR_P5 7:0 39:C6 E7E7E7E7E7 00 R/W 10 11 TX_ADDR RX_PW_P0 Reserved 0 7:6 R/W R/W RX_PW_P0 5:0 0 R/W 12 RX_PW_P1 Reserved 7:6 00 R/W 默认为00 数据通道1接收数据有效宽度: RX_PW_P1 5:0 0 R/W 0:无效 1:1个字节 ?? 32:32个字节 默认为00 数据通道2接收数据有效宽度: 0:无效 1:1个字节 ?? 32:32个字节 13 RX_PW_P2 Reserved 7:6 00 R/W RX_PW_P2 5:0 0 R/W 7

深圳市德普施科技有限公司

14 RX_PW_P3 Reserved 7:6 00 R/W 默认为00 数据通道3接收数据有效宽度: 0:无效 1:1个字节 ?? 32:32个字节 默认为00 数据通道4接收数据有效宽度: 0:无效 1:1个字节 ?? 32:32个字节 RX_PW_P3 5:0 0 R/W 15 RX_PW_P4 Reserved 7:6 00 R/W RX_PW_P4 5:0 0 R/W 16 RX_PW_P5 Reserved 7:6 00 R/W 默认为00 数据通道5接收数据有效宽度: 0:无效 1:1个字节 ?? 32:32个字节 FIFO状态寄存器 默认为0 若TX_REUSE=1,则当CE置高时,不断发送上一数据包。TX_REUSE通过SPI指令REUSE_TX_PL设置;通过W_TX_PALOAD FLUSH_TX复位 或 RX_PW_P5 5:0 0 R/W 17 FIFO_STATUS Reserved 7 0 R/W TX_REUSE 6 0 R TX_FULL TX_EMPTY RX_FULL 1 0 R Reserved 4 3:2 1 00 R R/W 5 0 R TX_FIFO寄存器满标志 1:寄存器满 0:寄存器未满,有可用空间 TX_FIFO寄存器空标志 1:寄存器空 0:寄存器非空 默认为00 RX FIFO寄存器满标志 1:寄存器满 0:寄存器未满,有可用空间 8

RX_EMPTY 0 N/A TX_PLD 255:0 N/A RX_PLD 255:0

八、模块编程控制

1.ShockBurstTM发射模式

深圳市德普施科技有限公司

RX FIFO寄存器空标志 1 R 1:寄存器空 0:寄存器非空 X W X R 9

深圳市德普施科技有限公司

①设置PRIM_RX为低。

②通过SPI接口,将接收节点地址(TX_ADDR)和有效数据(TX_PLD)写入模块,

写TX_PLD时,CSN必须一直置低。 ③置CE为高,启动发射。CE高电平持续时间至少为10us。 ④ShockBurstTM发射模式:

10

深圳市德普施科技有限公司

系统上电

启动内部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接口将数据读出

⑧模块准备好进入发射模式或接收模式或待机模式。

11

深圳市德普施科技有限公司

12

深圳市德普施科技有限公司

九、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 #define WRITE_REG #define RD_RX_PLOAD #define FLUSH_TX

0x00 //读第0个寄存器 0x20 //写第0个寄存器

0x61 //在接收模式下使用,读有效数据 0xA0 //在发送模式下使用,写有效数据 0xE1 //在发送模式下使用,清TX FIFO寄存器 0xE2 //在接收模式下使用,清RX FIFO寄存器 0xE3 //发送方使用,重复发送最后的数据 0xFF //空操作,用于读状态寄存器STATUS的值

#define WR_TX_PLOAD #define FLUSH_RX #define REUSE_TX_PL #define NOP

// nRF24L01寄存器地址 #define CONFIG #define EN_AA #define SETUP_AW #define SETUP_RETR #define RF_CH #define RF_SETUP #define STATUS #define OBSERVE_TX #define CD #define RX_ADDR_P0 #define RX_ADDR_P1 #define RX_ADDR_P2 #define RX_ADDR_P3 #define RX_ADDR_P4 #define RX_ADDR_P5 #define TX_ADDR #define RX_PW_P0 #define RX_PW_P1 #define RX_PW_P2

0x00 //配置寄存器,8bit

0x01 //自动应答设置寄存器,8bit 0x03 //地址宽度设置寄存器,8bit 0x04 //自动重复发送设置寄存器,8bit 0x05 //RF通道寄存器,8bit 0x06 //RF设置寄存器,8bit 0x07 //状态寄存器,8bit 0x08 //发送观测寄存器,8bit 0x09 //载波检测寄存器,8bit, 0x0A //接收地址数据通道0,40bit 0x0B 0x0C 0x0D 0x0E 0x0F

0x10 //发送地址.发送方使用,40bit

0x11 //通道0接收的有效数据字节长度(1-32字节),8bit 0x12 0x13

#define EN_RXADDR 0x02 //接收地址设置寄存器,8bit

13

深圳市德普施科技有限公司

#define RX_PW_P3 #define RX_PW_P4 #define RX_PW_P5 #define FIFO_STATUS

0x14 0x15 0x16

0x17 //FIFO状态寄存器,8bit

2.SPI操作头文件(与单片机的接口设置在此头文件中)

uchar unsigned char TX_ADR_WIDTH TX_PLOAD_WIDTH

5 //地址长度为5个字节 20 //数据长度为20个字节

//接收缓冲区 //标志位

#define #define #define char uchar #define

uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0xE7};

rx_buf[TX_PLOAD_WIDTH]; flag; CE

int test[12];

P0_0 P0_1 P1_2 P0_3 P0_4 P3_2 = sta^6; = sta^5;

//芯片使能:Chip Enable //片选信号:Chip Select Not //串行时钟信号:Serial Clock //主发从收:Master In Slave Out //主收从发:Master Out Slave In //中断查询:Interrupt Request

#define CSN #define SCK #define #define uchar sbit sbit sbit

uchar SPI_RW(uchar byte)//写一个字节到nRF24L01,并返回此时nRF24L01的状态及数据 {

uchar bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) //先写字节的高位,再写低位 { }

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到该寄存器

MOSI = (byte & 0x80); //MOSI取byte最高位 byte = (byte << 1); //byte左移一位

SCK = 1; //SCK从高到低时开始写入 byte |= MISO; SCK = 0;

//获取MISO位.从MOSI写命令的同时,MISO返回nRF24L01的状态及数据

MOSI IRQ bdata sta; RX_DR TX_DS

#define MISO

MAX_RT = sta^4;

14

深圳市德普施科技有限公司

}

CSN = 1; return(status);

//终止SPI读写

BYTE SPI_Read(BYTE reg)//读寄存器reg状态字 { }

uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)

//从寄存器reg读出数据,典型应用是读RX数据或RX/TXF地址

{ }

uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)//将数据写入寄存器,如TX数据,RX/TX地址等. { }

//接收模式初始化:设置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次 uchar status,byte_ctr;

CSN = 0; //CSN为0时,才能进行SPI读写 status = SPI_RW(reg);

//选择寄存器reg并返回其状态字 //写数据到寄存器 //终止SPI读写 //返回状态值

for(byte_ctr=0; byte_ctr

//CSN为0时,才能进行SPI读写 //选择寄存器reg并返回其状态字

status = SPI_RW(reg); BYTE reg_val;

CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return(reg_val);

//CSN为0时,才能进行SPI读写 //选择寄存器reg

//写0,什么操作也不进行,仅仅为了读寄存器状态 //终止SPI读写

for(byte_ctr=0;byte_ctr

pBuf[byte_ctr] = SPI_RW(0); //从寄存器读数据

SPI_RW(*pBuf++);

15

深圳市德普施科技有限公司

}

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);

//将地址TX_ADDRESS写入寄存器0的数据通道0 //ENAA_P0=1,数据通道0自动应答

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);

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);

//数据通道0的RX数据长度为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) { }

void show_status(void) {

test[0] = SPI_Read(EN_AA);

//0x01 //0x01

//0x03,5个字节 //0x1a //0x28 //0x0f

test[1] = SPI_Read(EN_RXADDR); test[2] = SPI_Read(SETUP_AW); test[3] = SPI_Read(SETUP_RETR); test[4] = SPI_Read(RF_CH);

test[5] = SPI_Read(RF_SETUP); 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); test[11] = SPI_Read(STATUS); }

//0x14

//显示状态寄存器的值

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);

16

深圳市德普施科技有限公司

void init_io(void) { }

void Inituart(void)//设置串口工作模式 { }

void init_int0(void)//外部中断设置 { }

void delay_ms(unsigned int x) {

unsigned int i,j; i=0;

for(i=0;i

//毫秒级延时

EA=1; ES=1; EX0=1;

//允许全局中断 //开串行口中断 //允许外部中断0

TMOD |= 0x20; TL1 = 0xfd; TH1 = 0xfd; SCON = 0x50; TR1 = 1; TI=1;

//模式1,8位数据 //启动定时器1

//定时器1工作在方式2,8位自动重装模式 //波特率为9600

CE = 0; SCK = 0;

//待机

//SPI禁止读写

CSN = 1;

{

3.发送模块主函数(向接收模块发射数据“abcdefg”,中断方式)

void main(void)

int i; init_io(); Inituart(); init_int0();

//IO端口设置 //串口设置 //外部中断0设置

//待发的数据tx_buf,发送的数据为”abcdefg”七个字母

for(i=0;i<7;i++)

tx_buf[i] = 'a'+i;

17

深圳市德普施科技有限公司

}

while(1) { }

CE = 0; CE = 1; CE = 0;

//Standby-1模式 //发送设置 //启动发送模式 //Standby-1模式

TX_Mode(); delay_ms(20); delay_ms(1000);

//中断函数

//如果RX_DR=1,则读取数据,之后清除标志位; //如果TX_DS或MAX_RT为1,则仅清除中断标志位 void ISR_int0(void) interrupt 0 { }

sta=SPI_Read(STATUS); if(RX_DR) { }

if(MAX_RT)

//重发中断达到最大数

//清除TX FIFO寄存器

SPI_RW_Reg(FLUSH_TX,0);

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接收的数据 flag=1;

//标志位置高

//读状态寄存器STATUS //如接收到数据,则中断

SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除RX_DR,TX_DS和MAX_RT中断标志位

{

4.接收模块主函数(接收并在串口输出,同时输出状态寄存器的值,使用查询方式)

void main(void)

int i; init_io(); Inituart(); init_int0(); CE=0;

//IO端口设置 //串口设置 //外部中断0设置 //Standby-1模式 //设置接收模式 //准备接收数据

RX_Mode(); CE = 1; while(1) {

sta=SPI_Read(STATUS); if(RX_DR) {

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接收的数据

//接收到数据

18

深圳市德普施科技有限公司

}

}

}

for(i=0;i<7;i++)

printf(\

//通过串口发送接收到的数据

printf(\show_status(); for(i=0;i<12;i++)

printf(\ \printf(\delay_ms(10);

//重发中断达到最大数 //清除TX FIFO寄存器

//清除RX_DR,TX_DS和MAX_RT中断标志位

//输出状态寄存器的值,可不用此操作

if(MAX_RT)

SPI_RW_Reg(FLUSH_TX,0);

SPI_RW_Reg(WRITE_REG+STATUS,sta);

19

本文来源:https://www.bwwdw.com/article/q3rp.html

Top