无线通信NRF24L01-接收

发布者:CyberJolt最新更新时间:2012-08-15 来源: 51hei关键字:无线通信  NRF24L01  接收 手机看文章 扫描二维码
随时随地手机看文章
#include
#include
//接收
typedef unsigned char uchar;
typedef unsigned char uint;
//****************************************NRF24L01端口定义***************************************
sbit  MISO =P0^4;
sbit  MOSI =P0^3;
sbit SCK     =P0^2;
sbit CE     =P0^0;
sbit CSN  =P0^1;
sbit IRQ  =P0^5;
//******************************************************************************************
#define TX_ADR_WIDTH    5    // 5 uints TX address width
#define RX_ADR_WIDTH    5    // 5 uints RX address width
#define TX_PLOAD_WIDTH  2   // 2 uints TX payload
#define RX_PLOAD_WIDTH  2    // 2 uints RX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x20,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x20,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG        0x00   // 读寄存器指令
#define WRITE_REG       0x20  // 写寄存器指令
#define RD_RX_PLOAD     0x61   // 读取接收数据指令
#define WR_TX_PLOAD     0xA0   // 写待发数据指令
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
#define NOP             0xFF   // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测          
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************长延时*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i for(i=0; i}
//******************************************************************************************
uint  bdata sta;   //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延时函数
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
  _nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
    inerDelay_us(100);
  CE=0;    // chip enable
  CSN=1;   // Spi disable
  SCK=0;   // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21 
SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收发完成中断响应,16位CRC ,主接收
}
/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
  MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  uchar = (uchar << 1);           // shift next bit into MSB..
  SCK = 1;                      // Set SCK high..
  uchar |= MISO;           // capture current MISO bit
  SCK = 0;                // ..then set SCK low again
    }
    return(uchar);               // return read uchar
}
/****************************************************************************************************
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0;                // CSN low, initialize SPI communication...
SPI_RW(reg);            // Select register to read from..
reg_val = SPI_RW(0);    // ..then read registervalue
CSN = 1;                // CSN high, terminate SPI communication

return(reg_val);        // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0;                   // CSN low, init SPI transaction
status = SPI_RW(reg);      // select register
SPI_RW(value);             // ..and write value to it..
CSN = 1;                   // CSN high again

return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0;                      // Set CSN low, init SPI tranaction
status = SPI_RW(reg);         // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr  pBuf[uchar_ctr] = SPI_RW(0);    //

CSN = 1;                          

return(status);                    // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据, reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0;            //SPI使能      
status = SPI_RW(reg);  
for(uchar_ctr=0; uchar_ctr  SPI_RW(*pBuf++);
CSN = 1;           //关闭SPI
return(status);    //
}
/****************************************************************************************************/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
    unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR)    // 判断是否接收到数据
{
     CE = 0;    //SPI使能
  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  revale =1;   //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0;   //StandBy I模式
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 + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
CE=1;   //置高CE,激发数据发送
inerDelay_us(10);
}
//************************************主函数************************************************************
void main(void)
{
uchar RxBuf;           //接收数据缓存
    init_NRF24L01();          //初始化
    while(1)
{
  P2=RxBuf;
  SetRX_Mode();        //设置为接收状态
     while(!nRF24L01_RxPacket(&RxBuf));     //接收数据
  Delay(120);
  nRF24L01_TxPacket(&RxBuf);     // Transmit Tx buffer data   设置为发送状态并发送数据数据
  SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清除中断标志位,准备下一次的发送   
}
}
关键字:无线通信  NRF24L01  接收 引用地址:无线通信NRF24L01-接收

上一篇:CH451驱动的数码管+按键+电子表+温度程序
下一篇:QC12864液晶屏串行时序驱动程序解

推荐阅读最新更新时间:2024-03-16 13:05

MIMO通信系统的射频测试
随着每一代技术的进步,无线通信系统不断实现比以前更高的数据吞吐量。从历史上看,这个成绩是通过更宽的通道带宽、频谱利用技术(如正交频分复用 (OFDM)),以及更复杂的调制类型来实现的。 增加无线通道带宽的最近创新技术之一是多输入多输出(MIMO)系统。这种技术在许多无线标准中得到了实现,包括IEEE 802.11n、WiMAX和长期演进(LTE)等。 实现MIMO通信系统的前提,是可以通过使用相同物理频谱内的多个“通道”来提高使用有限频谱带宽的通信系统的数据速率。为做到这一点,发射机需要使用多个发射天线,每个天线发射一个独特的经过调制的信号。 接收机也使用多个天线,并且只需少量信号处理就能分离和解码各个通道,这种技术被称为空间复用。
[测试测量]
MIMO通信系统的射频测试
单片集成的可变增益可见光接收机方案
  近年来,随着社会信息化程度不断提高,信息交换量呈爆炸性增长,而人们也不再局限于对无线局域网传输速率的追求,开始在应用领域以及安全性问题上进行更广泛的探索研究。可见光通信就是近几年发展火热的通信方式之一。与目前使用的无线局域网相比,“可见光通信”系统具有安全性高的特点。用窗帘遮住光线,信息就不会外泄至室外,同时使用多台电脑也不会影响通信速度。由于不使用无线电波通信,对电磁信号敏感的医院、飞机等场所也可以自由使用该系统。在设计工艺方面,以往多采用砷化镓或者双极性硅工艺来实现,但它们有成本高、功耗大、集成度低的缺点。近几年来,高成品率、低成本的CMOS工艺已被广泛应用于光通信系统芯片的设计中。本文即采用0.18 μm CMOS工艺实现
[单片机]
单片集成的可变增益可见光<font color='red'>接收</font>机方案
基于PIC32嵌入式智能家居系统的设计与实现
引言 想象一下:在酷热的夏天或寒冷的严冬,当您工作一整天后带着疲惫的身躯在回家的路上时,空调已经开启并调节到了舒适的温度,柔缓的轻音乐已经为您播放,通风装置已经接通,室内的光线已经调节好,把您预先准备好的食物用微波炉加热。这样,您一回来就可以享受到清新的空气、美妙的音乐、舒适的环境,或许还有一杯热茶 这并不是在科幻电影里面出现的场景。事实上这样的生活已经近在咫尺。随着 IT产业的发展和人们生活水平的提高, 智能住宅 、 家庭自动化 等技术的发展正受到人们的密切关注,相关产品也在逐渐成熟。 设计概述 整个系统包含以下四个子系统: 安防子系统:该子系统中包括红外发射端,红外接收端。 家电控制子系统:该子系
[单片机]
基于PIC32嵌入式智能家居系统的设计与实现
无线通信驱动(STM32) 增加FIFO扩展模式,可以发送超大数据包
A7139 拥有电磁波唤醒以及10mW的发射功率,非常容易实现长距离通信,目前 测试 有障碍物可以轻松达到300m以上. 通过几天的调试,目前可以发送任意大小的数据包,大小为1-16KB,全部使用中断收发,效率极高。 增加波特率设置2Kbps-100Kbps任意设置 增加通信信道设置0-255 增加发送功率设置0-7 底层代码 /************************************************************************************************************* * 文件名: A7139.c * 功能: STM32 A7139
[单片机]
<font color='red'>无线通信</font>驱动(STM32) 增加FIFO扩展模式,可以发送超大数据包
基于无线通信技术的智能公交系统设计
引言 公共交通具有个体交通无法比拟的强大优势,优先发展城市公共交通系统是解决大、中城市交通问题的最佳途径。近年来, 城市公交系统的智能化已成为公共交通研究领域的主要方向。国内现有试运行的智能公交系统大部分都采用GPS全球定位系统进行定位, 同时采用GPRS网络进行数据传输。车载GPS模块可以实时获取位置、方向、时间等导航定位数据, 然后通过车载GPRS模块将数据传至监控中心, 从而实现车辆的定位和监控。监控中心则可将车辆的实时信息或公告信息通过电子站牌的GPRS模块发送给电子站牌,以估算到站时间和距离, 然后显示在电子站牌上。尽管现有试运行的智能公交系统定位覆盖面广、精度高, 可以实现车辆的全范围定位和监控。但在实际运行过
[模拟电子]
基于<font color='red'>无线通信</font>技术的智能公交系统设计
小米蓝牙音频接收器天猫上架 10点开卖
   此前小米商城预告将在7月7日发布新品,宣称“秒变无线,自由随行!”,现在这款小米蓝牙音频接收器已经在小米天猫旗舰店中上架,售价99元,明天7月7日上午10点开卖。   小米蓝牙音频接收器支持一键操控,内置专业耳放芯片,支持蓝牙4.2传输,自带电池即插即用。在具体参数上,支持4-5小时音频播放,电池容量97mAh,重量10克,支持3.5mm音频接口。
[手机便携]
基于嵌入式USB主机和ZigBee无线通信技术的音响系统解决方案
1 引言 近几年来,随着嵌入式系统技术、网络通讯技术以及家电产业的迅猛发展,信息技术正逐渐渗透到人们的生活当中,智能家居设计也渐渐进入视野。然而,现阶段的智能家居设计,多采用有线设计,存在着系统结构复杂、不易改动等缺点。 本文设计了一种基于嵌入式USB 主机的家用无线音响系统,可以实现在不连接PC 机的情况下直接读取U盘或MP3 中的音频数据,并通过ZigBee 无线网络传输给家庭内部各个位置上的分节点,实现家庭音响的无线播放mp3 的功能,将人们从繁杂的布线中解放出来。 2 系统结构 系统主要由嵌入式USB 主机和ZigBee 分节点播放器组成。而USB 主机又是系统设计的关键,主要由USB接口、MCU 控制器、
[单片机]
基于嵌入式USB主机和ZigBee<font color='red'>无线通信</font>技术的音响系统解决方案
深圳地面数字电视信号全国首播
           融合方案应用体现产业链成熟 一个现实已经摆在数字电视从业者的面前:无论是各省运营商,还是诸多终端厂商,都深深认识到,整个数字电视产业正在进入一个新旧交替的时期,“地面数字电视”将在07~08年达到高潮。 地面数字电视深圳首播 金秋十月,当BIRTV展会的余温还未冷却,第九届高交会在深圳如约而至。高交会开幕式后立即上演了最为热门的重头戏:国标地面数字电视信号在万众瞩目下进行了全国首播,也宣告了深圳成为我国第一个正式执行该国家标准的城市。 地面数字电视信号播出后,深圳市民可以通过地面数字电视一体机、高清机顶盒、多媒体电视接收设备、车载设备、以及电脑相关的接收设备来收看免费高清数字电视,充分满足消费者不断增
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved