nRF24L01无线模块在单片机_第1页
nRF24L01无线模块在单片机_第2页
nRF24L01无线模块在单片机_第3页
nRF24L01无线模块在单片机_第4页
nRF24L01无线模块在单片机_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、nRF24L01无线模块在单片机与FPGA 上的应用 先简单的介绍下nRF24L01无线模块(1) 2.4Ghz 全球开放ISM 频段免许可证使用(2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合(3) 126 频道,满足多点通信和跳频通信需要(4) 内置硬件CRC 检错和点对多点通信地址控制(5) 低功耗1.9 - 3.6V 工作,待机模式下状态为22uA;掉电模式下为900nA(6) 内置2.4Ghz 天线,体积小巧15mm X29mm(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便 通过S

2、PI方式完成数据的交换,包括数据的发送,数据的接收。说明一下,单片机中如果没有SPI的硬件电路,我们可以使用单片机的普通IO口进行SPI的时序模拟,只要符合无线模块的时序逻辑,一样能控制无线模块的通信。FPGA是可编程逻辑,最大的特点就是灵活,用户可根据需求加入所需要的逻辑器件,当然它所包含的逻辑单元也是相当的丰富,有SPI硬件模块。这样用户就省去了SPI方式的时序逻辑,可以更好的专注于功能的开发。下面将详细的介绍下nRF24L01无线模块在单片机与FPGA上的应用单片机:这里我们使用的单片机型号为PIC16F877。 图1.3 NRF24L01接入PIC的原理图 说明:从图1.3中可以看出,

3、主要是图1.1中的6个信号(还有2个是地与电源)接入单片机中。而那些引脚是普通的IO口,需要用户模仿SPI时序进行控制。无线模块进行数据的交换就是数据的发送与数据的接收,下面将从这2个方面进行介绍。不管是数据的发送还是数据的接收,要想控制好NRF24L01无线模块,先要通过SPI方式对无线模块进行配置,只需要往它对应的寄存器里写入数值便可。先定义一下PIC上的宏,下面我们就可以很方便的对PIC的引脚进行操作。1#define MISO RC22#define MOSI RC33#define SCK RD04#define CE RD25#define CSN RD16#define IRQ

4、RC17#define LED RD38#define KEY0 RB09#define KEY1 RB110#define KEY2 RB211#define KEY3 RB312#define KEY4 RB413#define KEY5 RB514#define KEY6 RB615#define KEY7 RB7 NRF24L01无线模块的寄存器1/*NRF24L01寄存器指令2#define READ_REG 0x00/ 读寄存器指令3#define WRITE_REG 0x20/ 写寄存器指令4#define RD_RX_PLOAD 0x61/ 读取接收数据指令5#define W

5、R_TX_PLOAD 0xA0/ 写待发数据指令6/*SPI(nRF24L01)寄存器地址7#define CONFIG 0x00 / 配置收发状态,8#define EN_AA 0x01 / 自动应答功能设置9#define EN_RXADDR 0x02 / 可用信道设置10#define SETUP_AW 0x03 / 收发地址宽度设置11#define SETUP_RETR 0x04 / 自动重发功能设置12#define RF_CH 0x05 / 工作频率设置13#define RF_SETUP 0x06 / 发射速率、功耗功能设置14#define STATUS 0x07 / 状态寄

6、存器15#define RX_ADDR_P0 0x0A / 频道0接收数据地址16#define TX_ADDR 0x10 / 发送地址寄存器17#define RX_PW_P0 0x11 / 接收频道0接收数据长度18#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置 有2类寄存器是用户可以根据自己的需求所确定的,那就是地址的长度以及内容、发送与接收数据的长度,但无线模块一次最多可以发送32个字节,这两类寄存器一般设置为34个字节。1#define TX_PLOAD_WIDTH 42#define RX_PLOAD_WIDTH 43unsignedchar

7、TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10;/本地地址4unsignedchar RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10;/接收地址 A 模拟SPI方式1/*2/*函数:uint SPI_RW(uint uchar)3/*功能:NRF24L01的SPI时序4/*/5unsignedchar SPI_RW(unsignedchar a)67unsignedchar i;8for(i=0;i<8;i+)910if(a&0x80)=0x80)11MOSI=1;12else MOSI=0;/ output '

8、uchar', MSB to MOSI13a=(a<<1);/ shift next bit into MSB.14SCK=1;/ Set SCK high.15if(MISO=1)16a|=0x01;17else a&=0xfe;/ capture current MISO bit18SCK=0;/ .then set SCK low again1920return(a);/ return read uchar21 B 以SPI方式对寄存器的操作1/*2/*函数:uchar SPI_Read(uchar reg)3/*功能:NRF24L01的SPI读操作4/*/5

9、unsignedchar SPI_Read(unsignedchar reg)67unsignedchar reg_val;8CSN=0;/ CSN low, initialize SPI communication.9SPI_RW(reg);/ Select register to read from.10reg_val=SPI_RW(0);/ .then read registervalue11CSN=1;/ CSN high, terminate SPI communication12return(reg_val);/ return register value1314/*/15/*功能

10、:NRF24L01读写寄存器函数16/*/17unsignedchar SPI_RW_Reg(unsignedchar reg, unsignedchar value)1819unsignedchar status;20CSN= 0;/ CSN low, init SPI transaction21status=SPI_RW(reg);/ select register22SPI_RW(value);/ .and write value to it.23CSN= 1;/ CSN high again24return(status);/ return nRF24L01 status uchar2

11、526/*/27/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)28/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数29/*/30unsignedchar SPI_Read_Buf(unsignedchar reg, unsignedchar *pBuf, unsignedchar uchars)3132unsignedchar status,uchar_ctr;33CSN= 0;/ Set CSN low, init SPI tranaction34status=SP

12、I_RW(reg);/ Select register to write to and read status uchar3536for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)3738pBufuchar_ctr=SPI_RW(0);3940CSN= 1;4142return(status);4344/*45/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)46/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数47/*/48unsig

13、nedchar SPI_Write_Buf(unsignedchar reg, unsignedchar *pBuf, unsignedchar uchars)4950unsignedchar status,uchar_ctr;5152CSN= 0;/SPI使能53status=SPI_RW(reg);54for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr+)5556SPI_RW(*pBuf+);5758CSN= 1;/关闭SPI59return(status);60 这样就可以对NRF24L01无线模块进行初始化工作,以及数据发送、数据接收。让无线

14、模块是处于接收状态还是处于发送状态,初始化的工作有所不同,但区别不大,主要是CONFIG寄存器,可详细参考它的datesheet。 NRF24L01发送的初始化以及发送时序1void init_NRF24L01_send(void)23delay(30);4CE=0;/ chip enable5CSN=1;/ Spi disable6SCK=0;/ Spi clock line init high7delay(30);8SPI_Write_Buf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);/ 写本地地址9SPI_Write_Buf(WRITE_

15、REG+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);/ 写接收端地址10SPI_RW_Reg(WRITE_REG+ EN_AA,0x01);/ 频道0自动 ACK应答允许11SPI_RW_Reg(WRITE_REG+ EN_RXADDR,0x01);/ 允许接收地址只有频道0,如果需要多频道可以参考Page2112SPI_RW_Reg(WRITE_REG+ SETUP_RETR,0x1a);/ 500us + 86us, 10 retrans.13SPI_RW_Reg(WRITE_REG+ RF_CH,40);/ 设置信道工作为2.4GHZ,收发必须一致14S

16、PI_RW_Reg(WRITE_REG+ RX_PW_P0, RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为4字节15SPI_RW_Reg(WRITE_REG+ RF_SETUP,0x07);/设置发射速率为1MHZ,发射功率为最大值0dB16SPI_RW_Reg(WRITE_REG+ CONFIG,0x0e);/ IRQ收发完成中断响应,16位CRC,主发送17/ CE=1;/ chip enable18delay(30);192021/*22/*函数:void nRF24L01_TxPacket(unsigned char *tx_buf)23/*功能:发送 tx_buf中

17、数据24/*/25void nRF24L01_TxPacket(unsignedchar *tx_buf)2627CE=0;/StandBy I模式28SPI_Write_Buf(WRITE_REG+ RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);/ 装载接收端地址29SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);/ 装载数据30SPI_RW_Reg(WRITE_REG+ CONFIG,0x0e);/ IRQ收发完成中断响应,16位CRC,主发送31CE=1;/置高CE,激发数据发送32delay(100);

18、33CE=0;34 NRF24L01接收的初始化以及接收时序1void init_NRF24L01_receive(void)23delay(30);4CE=0;/ chip enable5CSN=1;/ Spi disable6SCK=0;/ Spi clock line init high7delay(30);8SPI_Write_Buf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);/ 写本地地址9SPI_Write_Buf(WRITE_REG+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);/ 写接收端地址10

19、SPI_RW_Reg(WRITE_REG+ EN_AA,0x01);/ 频道0自动 ACK应答允许11SPI_RW_Reg(WRITE_REG+ EN_RXADDR,0x01);/ 允许接收地址只有频道0,如果需要多频道可以参考Page2112SPI_RW_Reg(WRITE_REG+ RF_CH,40);/ 设置信道工作为2.4GHZ,收发必须一致13SPI_RW_Reg(WRITE_REG+ RX_PW_P0, RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为32字节14SPI_RW_Reg(WRITE_REG+ RF_SETUP,0x07);/设置发射速率为1MHZ,发射功

20、率为最大值0dB15SPI_RW_Reg(WRITE_REG+ CONFIG,0x0f);/ IRQ收发完成中断响应,16位CRC,主接受16CE=1;17delay(40);18192021/*/22/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)23/*功能:数据读取后放如rx_buf接收缓冲区中24/*/25unsignedchar nRF24L01_RxPacket(unsignedchar* rx_buf)2627unsignedchar revale=0;28sta=SPI_Read(STATUS);/ 读取状态

21、寄存其来判断数据接收状况29if(RX_DR)/ 判断是否接收到数据3031CE= 0;/SPI使能32SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO buffer33revale=1;/读取数据完成标志3435SPI_RW_Reg(WRITE_REG+STATUS,0xff);36return revale;37 下面总结一下NRF24L01在FPGA的应用。由于FPGA自带SPI硬件,只需要在SOPC Bulider中添加SPI模块即可,在顶层图中我们就可以看到图1.4,

22、另外,我们再添加两个IO口,这样我们就不必再模拟SPI方式,在FPGA中,有一个很好的API函数alt_avalon_spi_command();其函数原型为:1int alt_avalon_spi_command(alt_u32base,alt_u32slave,2alt_u32write_length,3constalt_u8*wdata,4alt_u32read_length,5alt_u8*read_data,6alt_u32flags) 该函数执行以下功能: 1、 SPI 从机片选信号有效(拉低) ; 2、 从 wdata 指针读取数据,通过 SPI 接口传输总共 write_len

23、gth 字节的数据,丢弃 MISO接口输入的数据; 3、 读 read_length 个字节的数据,存储到 read_data 指针指向的地址。读传输过程中 MOSI 被置为 0; 4、 撤销 SPI 从机片选信号(拉高)。 头文件<altera_avalon_spi.h>,该头文件定义了 SPI 核的寄存器映射和访问硬件可用的一些特征常量。这个函数的最大缺点就是不可以在中断中使用,但这并不影响对它的使用。NRF24L01在单片机和FPGA上的应用的本质是一样的,主要区别就是对上面的A、B SPI方式进行改写。A 就是用alt_avalon_spi_command();代替,是不是

24、很方便呢。:-DB 以SPI方式对寄存器的操作1/*2* 函数名称: void SPI_RW_Reg(unsigned char reg, unsigned char value)()3* 函数功能: 访问无线模块寄存器,并也对其写数值控制4* 参数:2个,第一个为寄存器地址,第二个为向寄存器写的数值5*/6void SPI_RW_Reg ( unsignedchar reg, unsignedchar value )78alt_avalon_spi_command ( SPI_BASE,0,1,&reg,0,NULL,1 );/ select register9alt_avalon_spi_command ( SPI_BASE,0,1,&value,0,NULL,0 );101112/*13* 函数名称: void SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)14* 函数功能: 访问寄存器,并向其写入bytes字节的数值15* 参数:3个,寄存器地址,数据、长度16*/17void SPI_Write_Buf ( unsignedchar reg, unsignedchar

温馨提示

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

评论

0/150

提交评论