nRF24L01无线介绍
CE:RX或TX模式选择
CSN:SPI片选信号
SCK:SPI时钟
MOSI:SPI数据输入
MISO:SPI数据输出
IRQ:可屏蔽中断脚
51测试程序
实测可用!
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
#define MAX_TX 0x10 //达到最大发送次数中断
#define TX_OK 0x20 //TX发送完成中断
#define RX_OK 0x40 //接收到数据中断
const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xEE,0xDD,0xCC,0xBB,0xAA}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xAA,0xBB,0xCC,0xDD,0xEE};
sbit CE = P2^7;
sbit CSN = P2^6;
sbit MISO = P2^3;
sbit MOSI = P2^4;
sbit SCK = P2^5;
sbit IRQ = P2^2;
sbit LED=P1^0;
void delay_us(uchar num)
{
uchar i;
for(i=0;i>num;i++)
_nop_();
}
void delay(uint t)
{
uchar k;
while(t--)
for(k=0;k<200;k++);
}
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (byte & 0x80); // output 'byte', MSB to MOSI
byte = (byte << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
byte |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(byte); // return read byte
}
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar 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 byte
}
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all
SPI_RW(*pBuf++);
CSN = 1; // Set CSN high again
return(status); // return nRF24L01 status byte
}
void RX_Mode_Init(void)
{
CE=0;
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_Write_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_Write_Reg(WRITE_REG + RF_CH, 0);
SPI_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable
CE = 1; // Set CE pin high to enable RX device
}
uchar SPI_Read_Reg(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
}
uchar NRF24L01_TxPacket(uchar *txbuf)
{
uchar state;
CE=0;
SPI_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); //写数据到TX_BUF
CE=1;
while(IRQ==1); //等待发送完成
LED = ~LED;
state=SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,state); //清除中断标志TX_DS或MAX_RT
if(state&MAX_TX) //达到最多重发中断
{
SPI_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器
return MAX_TX;
}
if(state&TX_OK) //发送完成
{
return TX_OK;
}
return 0xff; //发送失败
}
void Send_Buf(uchar *buf)
{
CE=0;
SPI_Write_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
delay_us(15);
NRF24L01_TxPacket(buf);
CE=0;
SPI_Write_Reg(WRITE_REG+CONFIG, 0x0f);
CE=1;
}
int main()
{
uchar buf[TX_PLOAD_WIDTH];
RX_Mode_Init();
buf[0]=2; //无线串口模块需要第一位标识长度(忽略)
buf[1]=0xaa;
buf[2]=0x55;
while(1)
{
Send_Buf(buf);
delay(1000);
}
}
模块不能自发自收
TX_ADDR和RX_ADDR_P0地址可以相同。但是TX_ADDR是目标板地址,RX_ADDR_P0是本模块地址。只有收发地址配置正确才能收发成功
最主要是RX_Mode_Init中寄存器的配置:
RF_CH,射频通道频率。收发必须一致(F0= 2400 + RF_CH [MHz])
RF_SETUP,射频寄存器。数据传输速率、发射功率、低噪声放大增益,收发必须一致
CRCO,校验方式。收发必须一致
nRF24L01无线介绍的更多相关文章
- STC8H开发(五): SPI驱动nRF24L01无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 【Espruino】NO.15 nRF24L01+无线收发器
http://blog.csdn.net/qwert1213131/article/details/35853747 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espru ...
- STM32+NRF24L01无线(转)
源:STM32+NRF24L01无线 硬件SPI和模拟SPI源码: nrf24发送(模拟SPI)BHS-STM32.rar nrf24接收(模拟SPI)BHS-STM32.rar nrf24发送(硬件 ...
- NRF24L01无线通讯模块驱动
NRF24L01 无线模块,采用的芯片是 NRF24L01,该芯片的主要特点如下: )2.4G 全球开放的 ISM 频段,免许可证使用. )最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力 ...
- [Micropython]TPYBoard v10x NRF24L01无线通讯模块使用教程
1.实验目的: • 学习使用NRF24L01无线通讯模块 2.所需原器件: • TPYBoard v10X开发板两块 • NRF24L01无线通讯模块两个 • ...
- nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)
俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...
- nRF24L01无线模块笔记
nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据 ...
- [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制
哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...
- [51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯
>_<!概述: 这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013. ...
随机推荐
- [AI] 深度数学 - Bayes
数学似宇宙,韭菜只关心其中实用的部分. scikit-learn (sklearn) 官方文档中文版 scikit-learn Machine Learning in Python 一个新颖的onli ...
- c#操作json数据使用newtonsoft.json
开源项目提供的一个读取示例 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...
- 移动架构-手写ButterKnife框架
ButterKnife在实际开发中有着大量运用,其强大的view绑定和click事件处理,使得开发效率大大提高,同时增加了代码的阅读性又不影响其执行效率 注解的分类 注解主要有两种分类,一个是运行时, ...
- springboot集成elk 一: springboot + Elasticsearch
1.ELK介绍 1> Elasticsearch是实时全文搜索和分析引擎, 提供搜集.分析.存储数据三大功能: 是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统. ...
- 控制台程序转化为windows服务
首先我们创建一个控制台应用程序WriteLog,然后添加windows服务LogService 新增的windows服务切换到代码视图,我这边用log4net进行的日志的记录 OnStart方式是服务 ...
- spring boot 2.x版本:java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBinder
标题 ##搭建spring boot 2.0.3版本 使用alibaba的druid数据库连接池,com.github.pagehelper的分页插件,启动项目报错. 错误提示:java.lang.C ...
- Word 写论文插入参考文献的正确操作
1. 引言 一般我们写论文插入参考文献的标号都是手动输入的,这样造成的问题有以下几个: 手动输入标号比较麻烦: 如果参考文献顺序变了,需要一个一个重新更改标号数值,及其麻烦: 标号无法和末尾的参考文献 ...
- Python 中集合使用
集合在使用中由于自动虑重,而且效率特高,故在提取数据时用上,但是由于集合没有切片功能没有取第几个元素的功能,但是一直使用集合切片不报错,但是执行不下去,导致一直存在问题. 修改为list后正常 例如: ...
- python学习-15 基本数据类型4
1.range a = range(0 ,100 , 5) #创建>=0,<100的连续数字,步长为5 for b in a: print(b) 运算结果: 0 5 10 15 20 25 ...
- VMware安装windows7系统
1.进入VMware系统,选择创建新的虚拟机 2.进入安装页面,选择自定义安装 3.选择虚拟机硬件兼容性,选择与自己软件相匹配的硬件兼容性 4.选择下一步后,选择稍后安装操作系统 5.选择客户机操作系 ...