先简单的介绍下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) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便
通过spi方式完成数据的交换,包括数据的发送,数据的接收。说明一下,单片机中如果没有spi的硬件电路,我们可以使用单片机的普通io口进行spi的时序模拟,只要符合无线模块的时序逻辑,一样能控制无线模块的通信。fpga是可编程逻辑,最大的特点就是灵活,用户可根据需求加入所需要的逻辑器件,当然它所包含的逻辑单元也是相当的丰富,有spi硬件模块。这样用户就省去了spi方式的时序逻辑,可以更好的专注于功能的开发。
单片机:这里我们使用的单片机型号为pic16f877。
图1.3 nrf24l01接入pic的原理图
说明:从图1.3中可以看出,主要是图1.1中的6个信号(还有2个是地与电源)接入单片机中。而那些引脚是普通的io口,需要用户模仿spi时序进行控制。
无线模块进行数据的交换就是数据的发送与数据的接收,下面将从这2个方面进行介绍。不管是数据的发送还是数据的接收,要想控制好nrf24l01无线模块,先要通过spi方式对无线模块进行配置,只需要往它对应的寄存器里写入数值便可。
先定义一下pic上的宏,下面我们就可以很方便的对pic的引脚进行操作。
1 #define miso rc2
2 #define mosi rc3
3 #define sck rd0
4 #define ce rd2
5 #define csn rd1
6 #define irq rc1
7 #define led rd3
8 #define key0 rb0
9 #define key1 rb1
10 #define key2 rb2
11 #define key3 rb3
12 #define key4 rb4
13 #define key5 rb5
14 #define key6 rb6
15 #define key7 rb7
nrf24l01无线模块的寄存器
1 //*******************nrf24l01寄存器指令
2 #define read_reg 0x00 // 读寄存器指令
3 #define write_reg 0x20 // 写寄存器指令
4 #define rd_rx_pload 0x61 // 读取接收数据指令
5 #define wr_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 // 状态寄存器
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个字节,这两类寄存器一般设置为3~4个字节。
1 #define tx_pload_width 4
2 #define rx_pload_width 4
3 unsigned char tx_address[tx_adr_width]= {0x34,0x43,0x10}; //本地地址
4 unsigned char rx_address[rx_adr_width]= {0x34,0x43,0x10}; //接收地址
a 模拟spi方式
1 /****************************************************************************************************
2 /*函数:uint spi_rw(uint uchar)
3 /*功能:nrf24l01的spi时序
4 /****************************************************************************************************/
5 unsigned char spi_rw(unsigned char a)
6 {
7 unsigned char i;
8 for(i=0;i《8;i++)
9 {
10 if((a&0x80)==0x80)
11 mosi=1;
12 else mosi=0; // output ‘uchar’, msb to mosi
13 a=(a《《1); // shift next bit into msb.。
14 sck=1; // set sck high.。
15 if(miso==1)
16 a|=0x01;
17 else a&=0xfe; // capture current miso bit
18 sck=0; // 。.then set sck low again
19 }
20 return(a); // return read uchar
21 }
b 以spi方式对寄存器的操作
1 /****************************************************************************************************
2 /*函数:uchar spi_read(uchar reg)
3 /*功能:nrf24l01的spi读操作
4 /****************************************************************************************************/
5 unsigned char spi_read(unsigned char reg)
6 {
7 unsigned char reg_val;
8 csn=0; // csn low, initialize spi communication.。.
9 spi_rw(reg); // select register to read from.。
10 reg_val=spi_rw(0); // 。.then read registervalue
11 csn=1; // csn high, terminate spi communication
12 return(reg_val); // return register value
13 }
14 /****************************************************************************************************/
15 /*功能:nrf24l01读写寄存器函数
16 /****************************************************************************************************/
17 unsigned char spi_rw_reg(unsigned char reg, unsigned char value)
18 {
19 unsigned char status;
20 csn = 0; // csn low, init spi transaction
21 status=spi_rw(reg); // select register
22 spi_rw(value); // 。.and write value to it.。
23 csn = 1; // csn high again
24 return(status); // return nrf24l01 status uchar
25 }
26 /****************************************************************************************************/
27 /*函数:uint spi_read_buf(uchar reg, uchar *pbuf, uchar uchars)
28 /*功能: 用于读数据,reg:为寄存器地址,pbuf:为待读出数据地址,uchars:读出数据的个数
29 /****************************************************************************************************/
30 unsigned char spi_read_buf(unsigned char reg, unsigned char *pbuf, unsigned char uchars)
31 {
32 unsigned char status,uchar_ctr;
33 csn = 0; // set csn low, init spi tranaction
34 status=spi_rw(reg); // select register to write to and read status uchar
35
36 for(uchar_ctr=0;uchar_ctr
37 {
38 pbuf[uchar_ctr]=spi_rw(0);
39 }
40 csn = 1;
41
42 re
手机加个NFC芯片到底难不难
欧洲央行行长:数字欧元将在 2-4 年内推出
机器学习算法入门 机器学习算法介绍 机器学习算法对比
手机充电器用电源变换器电路分析,Simple DC power supply
苹果要推5G iPhone,为何第一波要先敲定PCB供应链?
nRF24L01无线模块在PIC16F877单片机上的应用解析
电动机寿命长短跟什么有关系?
等离子电视机常见故障_等离子电视使用寿命
变焦镜头-变焦范围及焦距详细资料
专注智能停车的IPS集团推出AR停车方案
NS4220 D类立体声音频功率放大器的详细介绍
“冰屏”机器人透明的显示面板_2022年相约北京
显卡的核心频率,时钟周期和DDR以及超频都是什么意思
CO2气调技术通过二氧化碳传感器进行监测
诺基亚8什么时候上市?诺基亚8最新消息汇总:诺基亚8发布会时间确定,骁龙835+蔡司镜头
广和通Cat 1安防监控解决方案
大疆Mavic 3,配置全面升级,拍摄无与伦比
物联网当前面临的安全形势和存在的安全风险分析
云仕达智能家居瞄准的是高科技概念家居消费
LM3886功率放大器,LM3886 power amplifier