nRF24L01无线通信模块使用手册12_第1页
nRF24L01无线通信模块使用手册12_第2页
nRF24L01无线通信模块使用手册12_第3页
nRF24L01无线通信模块使用手册12_第4页
nRF24L01无线通信模块使用手册12_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 必须在 CSN为低时连续写入,而 TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少 10卩s,延迟130卩s后 发射数据;若自动应答开启,那么n RF24L01在发射数据后立即进入接收模式,接收应答信 号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除; 若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT )达到 上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低, 以便通知MCU。最后发射成功时,若 CE为低,则nRF24L01进入待机模式1 ;若发送堆栈 中有数据且

3、CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模 式2。 接收数据时,首先将 nRF24L01配置为接收模式,接着延迟130卩s进入接收状态等待 数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时 中断标志位RX_DR置高,IRQ变低,以便通知 MCU去取数据。若此时自动应答开启,接 收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入 空闲模式1。 、模块电气特性 参数 数值 单位 供电电压 5 V 最大发射功率 0 dBm 最大数据传输率 2 Mbps 电流消耗(发射模式,0dBm ) 11.3 mA 电

4、流消耗(接收模式,2Mbps) 12.3 mA 电流消耗(掉电模式) 900 nA 温度范围 -40+85 C 三、模块引脚说明 管脚 符号 功能 方向 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单片机接口电路 注:上图为示意连接,可根据自己实际需求进行更改;使用AT89S52MCU模块时,请将Nf24L01通 讯模块每个端口( MOSI、SCK、CSN和CE)接4.7K的

5、排阻上拉到 VCC增强其驱动能力(如下图:)。若 使用其它单片机与 Nf24L01通讯模块相连时请串联 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为空 待机模式1 1 - 0 无正在传输的数据 掉电模式 0 - - - 注1:进入此模式后,只要 CSN置高,在FIFO中的数据就会

6、立即发射岀去,直到所有数据数据发射 完毕,之后进入待机模式II。 注2:正常的发射模式,CE端的高电平应至少保持 10us。24L01将发射一个数据包,之后进入待机模 式I。 六、数据和控制接口 通过以下六个引脚,可实现模块的所有功能: IRQ (低电平有效,中断输出) CE (高电平有效,发射或接收模式控制) CSN (SPI信号) SCK (SPI信号) MOSI (SPI信号) MISO (SPI信号) 通过SPI接口,可激活在数据寄存器FIFO中的数据;或者通过 SPI命令(1个字节长 度)访问寄存器。 在待机或掉电模式下, 单片机通过SPI接口配置模块;在发射或接收模式下,单片机通

7、过SPI接口接收或发射数据。 1. SPI指令 所有的SPI指令均在当CSN由低到高开始跳变时执行;从MOSI写命令的同时,MISO 实时返回24L01的状态值;SPI指令由命令字节和数据字节两部分组成。 SPI命令字节表 指令名称 指令格式 (二进制) 字节数 操作说明 R_REGISTER 000A AAAA 15 读奇存器。AAAAA 表示奇存器地址。 W_REGISTER 001A AAAA 15 写寄存器。AAAAA 表示寄存器地址,只 能在掉电或待机模式下操作。 R_RX_PAYLOAD 0110 0001 132 在接收模式下读132字节RX有效断气。 从字节0开始,数据读完后,

8、FIFO寄存器 清空。 W_TX_PAYLOA D 1010 0000 132 在发射模式下写131字节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 空操作。可用于读状态

9、寄存器。 2. SPI时序 SPI读写时序见下面两图。在写寄存器之前,一定要进入待机模式或掉电模式。其中, Cn SPI指令位;Sn状态寄存器位;Dn数据位(低字节在前,高字节在后;每 个字节中高位在前) 厂 5ckrmiLnjuLTLTLJwmiLn_n_LrLnrmnn hLISO 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_T

10、X_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 ShockBurs

11、t? 使能“自动应答”功能 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

12、/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: 250u

13、s 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:

14、-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-10

15、1 :数据通道号 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 E7E7E7E 7E7 R/W 数据通道0接收地址。最大长 度为5个字节。 0B RX_A

16、DDR_P1 39: 0 C2C2C2 C2C2 R/W 数据通道1接收地址。最大长 度为5个字节。 0C RX_ADDR_P2 7:0 C3 R/W 数据通道2接收地址。最低字 节可设置,高字节必须与 RX ADDR P139:8相等 0D RX_ADDR_P3 7:0 C4 R/W 数据通道3接收地址。最低字 节可设置,高字节必须与 RX ADDR P139:8相等 0E RX_ADDR_P4 7:0 C5 R/W 数据通道4接收地址。最低字 节可设置,高字节必须与 RX ADDR P139:8相等 OF RX_ADDR_P5 7:0 C6 R/W 数据通道5接收地址。最低字 节可设置,高

17、字节必须与 RX ADDR P139:8相等 10 TX_ADDR 39: 0 E7E7E7E 7E7 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个字节

18、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

19、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

20、 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. ShockBurst TM 发射模式 29 ShodkBtjTst cpeoticn T StafMsy-E mode p- vts MQ +1 RX me j 设置PRIM_

21、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 F

22、IFO中的数据不被移出。当 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. ShockBurst TM 接收模式 设置PRIM_RX为高,配置接收数据通道(EN_RXADDR )

23、、自动应答寄存器(EN_AA ) 和有效数据宽度寄存器(RX_PW_PX )。 置CE为高,启动接收模式。 130us后,模块检测空中信号, 接收到有效的数据包后 (地址匹配、CRC检验正确),数据储存在RX FIFO中,RX_DR 置高。 如果启动了自动应答功能,则发送应答信号。 MCU置CE为低,进入先机模式I。 MCU可通过SPI接口将数据读出 模块准备好进入发射模式或接收模式或待机模式。 N3 Rut sayad ir R D swE 讯潇盘A FO jnd 询削匚眞IRQ Set Tx :D5 I RQ c D billing TX niing 1 TX nwde 3 ransmit

24、 ACK TX iTtOdt Trans/ml ACK h Hy pad 九、RF通道频率 2.400GHz 到 RF通道频率指的是nRF24L01所使用的中心频率,该频率范围从 2.525GHz,以1MHz区分一个频点,故有 125个频点可使用。 由参数 RF_CH 确定,公式为:Fo = 2400 + RF_CH ( MHz) 十、示例程序 接收模块与发射模块大部分程序代码相同,如下: 1. SPI命令和寄存器配置头文件APl.h (根据第六、七两点编写) #ifndef _BYTE_DEF_ #define _BYTE_DEF. typedef unsigned char BYTE; #

25、endif / SPI命令 #define READ_REG #define WRITE_REG #define RD_RX_PLOAD #define WR_TX_PLOAD #define FLUSH_TX #define FLUSH_RX #define REUSE_TX_PL #define NOP / nRF24L01寄存器地址 #define CONFIG #define EN_AA #define EN_RXADDR #define SETUP_AW #define SETUP_RETR #define RF_CH #define RF_SETUP #define STATUS

26、#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 0 x00/读第0个寄存器 0 x20/写第0个寄存器 0 x61/在接收模式下使用,读有效数据 0 xA0 /在发送模式下使用,写有效数据 0 xE1 /在发送模式下使用,清T

27、X FIFO寄存器 0 xE2 /在接收模式下使用,清RX FIFO寄存器 0 xE3 /发送方使用,重复发送最后的数据 0 xFF /空操作,用于读状态寄存器STATUS的值 0 x00 /配置寄存器,8bit 0 x01 自动应答设置寄存器,8bit 0 x02 /接收地址设置寄存器,8bit 0 x03 /地址宽度设置寄存器,8bit 0 x04 自动重复发送设置寄存器,8bit 0 x05 /RF通道寄存器,8bit 0 x06 /RF设置寄存器,8bit 0 x07 /状态寄存器,8bit 0 x08 /发送观测寄存器,8bit 0 x09 /载波检测寄存器,8bit, 0 x0A

28、/接收地址数据通道0,40bit 0 x0B 0 x0C 0 x0D 0 x0E 0 x0F 0 x10 /发送地址.发送方使用,40bit 0 x11 通道0接收的有效数据字节长度(1-32字节),8bit 0 x12 0 x13 #define RX_PW_P3 0 x14 #define RX_PW_P4 0 x15 #define RX_PW_P5 0 x16 #define FIFO_STATUS 0 x17 /FIFO状态寄存器,8bit 2. SPI操作头文件 (与单片机的接口设置在此头文件中) #define uchar unsigned char #defineTX_ADR_

29、WIDTH5/地址长度为5个字节 #defineTX_PLOAD_WIDTH20 / 数据长度为 20 个字节 uchar const TX_ADDRESSTX_ADR_WIDTH = 0 xE7,0 xE7,0 xE7,0 xE7,0 xE7 char rx bufTX PLOAD WIDTH; 接收缓冲区 uchar flag; int test12; #define CE P0_0 #define CSN P0_1 #define SCK P1_2 #define MOSI P0_3 #define MISO P0_4 #define IRQ P3_2 uchar bdata sta;

30、sbit RX_DR =stay sbit TX_DS =stap sbit MAX RT =staA4; /标志位 /芯片使能:Chip Enable /片选信号:Chip Select Not /串行时钟信号:Serial Clock /主发从收:Master In Slave Out /主收从发:Master Out Slave In /中断查询:Interrupt Request uchar SPI_RW(uchar byte)/写一个字节到 nRF24L01,并返回此时nRF24L01的状态及数据 uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_c

31、t 叶+) /先写字节的高位,再写低位 MOSI = (byte byte = (byte 1); SCK = 1; /MOSI取byte最高位 /byte左移一位 /SCK从高到低时开始写入 byte |= MISO; 获取MISO位.从MOSI写命令的同时,MISO返回nRF24L01的状态及数据 SCK = 0; return(byte); uchar status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); uchar SPI_RW_Reg(BYTE reg, BYTE value)/ 将字节 value 写入寄存器 reg /CSN为

32、0时,才能进行SPI读写 选择寄存器reg /写字节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 b

33、ytes) /从寄存器reg读出数据,典型应用是读RX数据或RX/TXF地址 uchar status,byte_ctr; CSN = 0;/CSN为0时,才能进行SPI读写 status = SPI_RW(reg);/选择寄存器reg并返回其状态字 for(byte_ctr=0;byte_ctrbytes;byte_ct r+) pBufbyte_ctr = SPI_RW(0);从寄存器读数据 CSN = 1;/终止SPI读写 return(status);返回状态值 uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)/将数据写入寄存器

34、,如 TX 数据,RX/TX 地址等. uchar status,byte_ctr; CSN = 0;/CSN为0时,才能进行SPI读写 status = SPI_RW(reg);/选择寄存器reg并返回其状态字 for(byte_ctr=0; byte_ctrbytes; byte_ct 叶+) SPI_RW(*pBuf+);/写数据到寄存器 CSN = 1;/终止SPI读写 return(status);返回状态值 /接收模式初始化:设置RX地址,RX数据宽度,RF通道,速率,低噪声放大器增益 /设置完之后,将CE置高,准备好接收数据 void RX_Mode(void) SPI_RW_R

35、eg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写 TX_Address 至U nRF24L01 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0 x1a); / 自动重发延时:500us + 86us;重发次数:10 次 SPI_Write_Buf(WRITE_REG + RX_ADDR_PO, TX_ADDRESS, TX_ADR_WIDTH); /将地址TX_ADDRESS写入寄存器0的数据通道0 SP

36、I_RW_Reg(WRITE_REG + EN_AA, 0 x01);ENAA_P0=1,数据通道 0 自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01);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, 0 x0F); /速率为2Mbps,发送功率为0dBm

37、,低噪声放大器增益为1 SPI_RW_Reg(WRITE_REG + CONFIG , 0 x0f); 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 , 0 x0e); SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WID

38、TH); 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, 0 x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01); SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0 x1a); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG

39、 + RF_SETUP, 0 x0f); void show_status(void) f 显示状态寄存器的值 i test0 = SPI_Read(EN_AA); 0 x01 test1 = SPI_Read(EN_RXADDR); 0 x01 test2 = SPI_Read(SETUP_AW); 0 x03,5个字节 test3 = SPI_Read(SETUP_RETR); /0 x1a test4 = SPI_Read(RF_CH); 0 x28 test5 = SPI_Read(RF_SETUP); 0 x0f test6 = SPI_Read(RX_ADDR_P2); test7

40、 = SPI_Read(RX_ADDR_P3); test8 = SPI_Read(RX_ADDR_P4); test9 = SPI_Read(RX_ADDR_P5); test10 = SPI_Read(RX_PW_P0); 0 x14 test11 = SPI_Read(STATUS); void init_io(void) CE = 0; /待机 CSN = 1; /SPI禁止读写 SCK = 0; void Inituart(void)/设置串口工作模式 TMOD |= 0 x20; 定时器1工作在方式2,8位自动重装模式 TL1 = 0 xfd; /波特率为9600 TH1 = 0

41、xfd; SCON = 0 x50; /模式1,8位数据 TR1 = 1; 启动定时器1 TI=1; void init_intO(void) 外部中断设置 EA=1; /允许全局中断 ES=1; /开串行口中断 EX0=1; /允许外部中断0 void delay_ms(unsigned int x) /毫秒级延时 unsigned int i,j; i=0; for(i=0;ix;i+) j=108; while。-); 3发送模块主函数(向接收模块发射数据“ abcdefg”,中断方式) void main(void) int i; init_io(); /IO端口设置 Inituart

42、(); 串口设置 init_int0(); /外部中断0设置 for(i=0;i7;i+) 待发的数据tx_buf,发送的数据为abcdefg七个字母 tx_bufi = 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_intO(void) interrupt 0 sta=SPI_R

43、ead(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) int i

44、; init_io(); /IO端口设置 Inituart(); 串口设置 init_int0(); 外部中断0设置 CE=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);读取接收的数据 for(i=0;i7;i+) printf(%c ,rx_bufi);通过串口发送接收到的数据 printf(n); show_status(); for(i=0;i12;

45、i+) /输岀状态寄存器的值,可不用此操作 /重发中断达到最大数 /清除TX FIFO寄存器 /清除 RX_DR,TX_DS 和 MAX. 中断标志位 printf(%x ,testi); printf(n); delay_ms(10); if(MAX_RT) SPI_RW_Reg(FLUSH_TX,0); SPI_RW_Reg(WRITE_REG+STATUS,sta); 最近项目基本都做完了,闲着没事了,过来整理下博客,分享下自己的程序!这是几个月前调通的程序,2 4L01无线收发芯片,mcu用的是msp430f2274 !该程序花费了我大量心血!算是我学起单片机来攻克的第 一块芯片吧!注

46、释相当详细! #include #define uint unsigned int #define uchar unsigned char nRF24L01的数据宽度,地址宽度,以及数据定义 #define TX_ADR_WIDTH 4 #define RX_PLOAD_WIDTH 4 #define TX_PLOAD_WIDTH 4 uchar TX_ADDRESS=0 xe7,0 xe7,0 xe7,0 xe7; uchar data4=zhou; uchar rx_buf4; /引脚定义2274 #define CSN_HIGH P3OUT|=BIT1/P3.1 控制 SPI 使能 #d

47、efine CSN_LOW P3OUT /*/SPI初始化程序2274 void SPI_INIT() master UCA0CTL0 |=UCMSB + UCMST + UCSYNC;/ 3-pin, 8-bit SPI UCA0CTL1 |= UCSSEL_1; / ACLK UCA0BR0 |= 0 x03;/ 波特率 9600 UCA0BR1 = 0; UCA0MCTL = 0X91; UCA0CTL1 P3SEL|=BIT0+BIT4+BIT5; /正宗SPI写一字节数据到24L01,同时返回一个自己的数据 2274 uchar SPI_RW(uchar byte) while (!

48、(IFG2 UCA0TXBUF=byte; delay_us(200); return UCA0RXBUF; */ /模拟SPI方式 uchar SPI_RW(uchar byte) uchar bit_ctr; uchar a,b; for(bit_ctr=0;bit_ctr8;bit_ct 叶+) a=(byte if(a!=0) MOSI_HIGH; else MOSI_LOW; byte=(byte1); SCK_HIGH; b=P3IN if(b!=0) byte+=1; else; SCK_LOW; return byte; /向寄存器写一字节的数据,同时返回状态字 uchar S

49、PI_RW_Reg(uchar reg,uchar value) uchar status; CSN_LOW; status=SPI_RW(reg); SPI_RW(value); CSN_HIGH; return(status); /向寄存器读岀一字节的数据 uchar SPI_Read(uchar reg) uchar byte; CSN_LOW; SPI_RW(reg); byte=SPI_RW(0 x00); 写入一个 0 x00,读出数据 CSN_HIGH; return byte; /读出bytes字节的数据 uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) uchar status,byte_ctr; CSN_LOW; status=SPI_RW(reg); 选择寄存器,并返回状态 for(byte_ctr=0;byte_ctrbytes;byte_ct r+) pBufbyte_ctr=SPI_RW(O); CSN_HIGH; return(status); /写入bytes字节的数据 uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes) uchar status,byte_ctr; CSN_LOW; status=S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论