历史上的今天
返回首页

历史上的今天

今天是:2025年01月18日(星期六)

正在发生

2020年01月18日 | AVR单片机的nRF24L01发送接收设计

2020-01-18 来源:elecfans

#include “iom16v.h”

#include “macros.h”

#include “12864.h”

//spi标志

#define DDR_SPI DDRB

#define DD_MOSI 5

#define DD_MISO 6

#define DD_SCK 7

#define DD_SS 4

#define CE PB3

#define IRQ PB2

AVR单片机的nRF24L01发送接收设计

//#define NRF24L01_MISOPB6//输入0

#defineHign_24L01_MISOPORTB|=(1 《《 PB6)

#defineLow_24L01_MISOPORTB &= ~(1 《《 PB6)

#defineRead_24L01_MISOPINB & (1 《《 PB6)

//#define NRF24L01_MOSIPB5//输出1

#defineHign_24L01_MOSIPORTB |= (1 《《 PB5)

#defineLow_24L01_MOSIPORTB &= ~(1 《《 PB5)

#defineRead_24L01_MOSIPINB & (1 《《 PB5)

//#define NRF24L01_SCKPB7//输出1

#defineHign_24L01_SCKPORTB |= (1 《《 PB7)

#defineLow_24L01_SCKPORTB &= ~(1 《《 PB7)

#defineRead_24L01_SCKPINB & (1 《《 PB7);

//#define NRF24L01_CSNPB4//输出1

#defineLow_24L01_CSNPORTB &= ~(1 《《 PB4)

#defineHign_24L01_CSNPORTB |= (1 《《 PB4)

//#define NRF24L01_CEPB3//输出1

#defineHign_24L01_CEPORTB |= (1 《《 PB3)

#defineLow_24L01_CEPORTB &= ~(1 《《 PB3)

#defineRead_24L01_CEPINB & (1 《《 PB3)

//*********************************************NRF24L01*************************************

#define TX_ADR_WIDTH5// 发送地址长度,最大长度为5 5*8=40 bit

#define RX_ADR_WIDTH5// 接收地址长度

#define TX_PLOAD_WIDTH32// 发送字节长度,

#define RX_PLOAD_WIDTH32// 接收字节长度

uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//发送地址

uchar RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址

//***************************************NRF24L01寄存器指令*******************************************************

#define READ_REG0x00// 读寄存器指令

#define WRITE_REG0x20// 写寄存器指令

#define RD_RX_PLOAD0x61// 读取接收数据指令

#define WR_TX_PLOAD0xA0// 写待发数据指令

#define FLUSH_TX0xE1// 冲洗发送 FIFO指令

#define FLUSH_RX0xE2// 冲洗接收 FIFO指令

#define REUSE_TX_PL0xE3// 定义重复装载数据指令

#define NOP0xFF// 保留

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG0x00// 配置收发状态,CRC校验模式以及收发状态响应方式

#define EN_AA0x01// 自动应答功能设置

#define EN_RXADDR0x02// 可用信道设置

#define SETUP_AW0x03// 收发地址宽度设置

#define SETUP_RETR0x04// 自动重发功能设置

#define RF_CH0x05// 工作频率设置

#define RF_SETUP0x06// 发射速率、功耗功能设置

#define STATUS0x07// 状态寄存器

#define OBSERVE_TX0x08// 发送监测功能

#define CD0x09// 地址检测

#define RX_ADDR_P00x0A// 频道0接收数据地址

#define RX_ADDR_P10x0B// 频道1接收数据地址

#define RX_ADDR_P20x0C// 频道2接收数据地址

#define RX_ADDR_P30x0D// 频道3接收数据地址

#define RX_ADDR_P40x0E// 频道4接收数据地址

#define RX_ADDR_P50x0F// 频道5接收数据地址

#define TX_ADDR0x10// 发送地址寄存器

#define RX_PW_P00x11// 接收频道0接收数据长度

#define RX_PW_P10x12// 接收频道0接收数据长度

#define RX_PW_P20x13// 接收频道0接收数据长度

#define RX_PW_P30x14// 接收频道0接收数据长度

#define RX_PW_P40x15// 接收频道0接收数据长度

#define RX_PW_P50x16// 接收频道0接收数据长度

#define FIFO_STATUS0x17// FIFO栈入栈出状态寄存器设置

//*************************************************************

//*************************************************

//*******void spi_init()初始化SPI

//**************************************************

void spi_init()

{

Hign_24L01_CSN;

DDR_SPI = (1《

DDR_SPI&=~((1《

SPCR=(1《

SPSR=0;

}

//**************************************************

//*******uchar SPI_RW(uchar date)读写SPI

//**************************************************

uchar SPI_RW(uchar date)

{

SPDR=date;

while(!(SPSR&(1《

return SPDR;

}

//**************************************************

//*******uchar SPI_Read(uchar reg)读24L01寄存器

//**************************************************

uchar SPI_Read(uchar reg)

{

uchar reg_val;

Low_24L01_CSN;

SPI_RW(reg);

reg_val = SPI_RW(0);

Hign_24L01_CSN;

return(reg_val);

}

//**************************************************

//*******uchar SPI_RW_Reg(uchar reg, uchar value)

//写24L01寄存器

//**************************************************

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

Low_24L01_CSN;

status = SPI_RW(reg);

SPI_RW(value);

Hign_24L01_CSN;

return(status);

}

//**************************************************

//*******uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites)

//读24L01 寄存器BUFF

//**************************************************

uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites)

{

uint status1,uchar_ctr;

Low_24L01_CSN;

status1 = SPI_RW(reg);

for(uchar_ctr=0;uchar_ctr

pBuf[uchar_ctr] = SPI_RW(0);

Hign_24L01_CSN;

return(status1);

}

//**************************************************

//*******uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites)

//写24L01 寄存器BUFF

//**************************************************

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites)

{

uchar status1,uchar_ctr;

Low_24L01_CSN;//SPI使能

status1 = SPI_RW(reg);

for(uchar_ctr=0; uchar_ctr

SPI_RW(*pBuf++);

Hign_24L01_CSN;//关闭SPI

return(status1);//

}

//**************************************************

//*******void SetRX_Mode(void)

//接收模式设置

//**************************************************

void SetRX_Mode(void)

{

Low_24L01_CE;

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //写接收地址

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);//0通道自动应答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//数据通道0

SPI_RW_Reg(WRITE_REG + RF_CH,0);//射频通道

SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//写通道0 接受数据长度

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //0db 1M

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //接收模式

Hign_24L01_CE;//开始接收

delayus(200);//注意不能太小

}

//**************************************************

//*******uchar nRF24L01_RxPacket(uchar* rx_buf)

//接收数据包

//**************************************************

uchar nRF24L01_RxPacket(uchar* rx_buf)

{

uchar sta,flag=0;

sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况

if(sta&0x40)// 判断是否接收到数据RX_DR==1?

{

Low_24L01_CE;// StandBy I模式

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

flag =1;//读取数据完成标志

}

SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志

return (flag);

}

//**************************************************

//*******void nRF24L01_TxPacket(uchar * tx_buf)

//发送数据包

//**************************************************

void nRF24L01_TxPacket(uchar * tx_buf)

{

uchar sta=0;

uchar flag=0;

Low_24L01_CE;//StandBy I模式

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);

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, 0x01);//

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); //500+86us

SPI_RW_Reg(WRITE_REG + RF_CH, 0);//

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);// IRQ收发完成中断响应,16位CRC,主发送

delayms(2);

Hign_24L01_CE;//置高CE,激发数据发送

delayus(10);

Low_24L01_CE;

}

void init_NRF24L01(void)

{

spi_init();

Low_24L01_CE;// 空闲模式

Hign_24L01_CSN;// SPI 关闭

Low_24L01_SCK;// 关闭时钟

}

推荐阅读

史海拾趣

Communications公司的发展小趣事

在全球化的大背景下,一家名为“全球通信”的公司积极实施国际化发展战略,成功拓展了海外市场。他们不仅将产品和技术推向全球,还积极参与国际标准和规范的制定,提升了公司在国际通信行业的影响力。

通过与海外企业的合作与交流,“全球通信”不断吸收国际先进技术和管理经验,提升了自身的竞争力。同时,他们还积极参与国际公益事业,树立了良好的企业形象。

Bel Power Solutions公司的发展小趣事

Bel Power Solutions的创立源于对电源转换和管理技术的深刻理解和创新追求。公司创始人们看到了电力电子技术在各个行业领域的广阔应用前景,并决心打造一个专业、高效的电源解决方案提供商。然而,在创立初期,公司面临着资金短缺、技术难题以及市场竞争的严峻挑战。但创始人们凭借坚定的信念和不懈的努力,逐步攻克了技术难关,推出了首款电源转换产品,初步在市场上站稳了脚跟。

极海半导体(Geehy)公司的发展小趣事

在国内市场取得一定成绩后,Bel Power Solutions开始积极拓展国际市场。公司通过与全球知名企业的合作,成功将产品打入国际市场,并赢得了良好的声誉。同时,公司还积极寻求与系统集成商、分销商等建立长期稳定的合作关系,共同开拓市场。这些合作伙伴关系的建立,不仅为公司带来了更多的商业机会,还提升了公司的品牌影响力和市场份额。

Excel-Display Corporation公司的发展小趣事

Excel-Display Corporation(以下简称EDC)成立于XX世纪初,由一群富有远见的电子工程师和企业家共同创立。他们看到了当时显示技术领域的巨大潜力,决定成立一家专注于研发和生产高质量显示器的公司。

EDC在创立初期就注重技术研发和产品质量,投入大量资金引进先进的生产设备和技术人才。经过几年的努力,EDC成功推出了一系列性能稳定、画质优良的显示器产品,逐渐在市场上崭露头角。

与此同时,EDC也积极开拓国际市场,与多家国际知名企业建立了合作关系。这些合作不仅为EDC带来了技术上的支持,也为其产品的国际化推广奠定了坚实的基础。

Eby Company公司的发展小趣事

1995年,皮埃尔·奥米迪亚(Pierre Omidyar)以AuctionWeb的名字推出了eBay,最初只是一个在线拍卖个人物品的平台。随着互联网的普及和用户对在线交易需求的增长,eBay迅速吸引了大量用户。其独特的商业模式和用户友好的界面使eBay成为在线拍卖市场的领军者。1998年,eBay成功上市,成为当时最成功的互联网公司之一。

Electro-Term/Hollingsworth公司的发展小趣事

在快速发展的过程中,Electro-Term公司始终重视人才培养和团队建设。公司建立了完善的人才选拔和培训体系,为员工提供广阔的发展空间和良好的福利待遇。同时,公司还鼓励员工积极参与创新实践和技术交流,营造了浓厚的学术氛围和团队合作精神。这些举措为公司的发展提供了有力的人才保障。

问答坊 | AI 解惑

王越院士畅谈2009年NEC电子杯出题理念

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 在5月22日新闻发布会上,王越院士表示“今年我们开始强调两个方面的应用。第一个就是做出来的产品的性能价格比应该是比较好的。不能为完成一个比较简单的任务,用一个非常复杂,非常昂贵的小系统合和 ...…

查看全部问答>

TC下如何生成lib文件

各位高手,我想在TC下,写一个LIB文件,但不知如何下手,LIB文件的格式是什么样的?还望各位指点迷津,如有例子最好,在此先行谢过。…

查看全部问答>

用pb生成wince时,报如下错,请高手指点!

edimechn dlgmgr dlgmnem gwectrl btnctl stcctl edctl msgbox msgbox_hpc dlgmgr_hpc menu_hpc EditControlOs startup oomui oom startui cmbctl cdlctl imgctl lbctl scbctl sbcmnview nclientview gcacheview btnctlview stcctlview cmbctlview ...…

查看全部问答>

请问,cpld中也能设定rom嘛?

请问,cpld中也能设定rom嘛?    看过 fpga的可以,不知道cpld的怎么样啊  …

查看全部问答>

iar442不能设置断点是怎么回事啊?

                                 rt…

查看全部问答>

LPC1100大家族

LPC1100家族不断庞大,期待未来更多的型号。 …

查看全部问答>

求救:字附型驱动write函数传入的char×型数据有问题

//驱动中write函数 对物理地址WR_ADDR写 0x1234abcd ssize_t regs_op_write( struct file *filp, char *buf,                 size_t count, loff_t *f_pos) {         char *tmp; ...…

查看全部问答>

STM32 用AD 实现TFT彩屏的触摸

上次看到论坛上说STM32有一种可以用AD采集实现触摸,可是找不到资料,请问有谁知道的,共享一下。…

查看全部问答>

verilog的语言系统学习(序)

大家好,这篇是我正式发表的第一篇博客,作为微时代的人们,大家现在已经没有时间来看冗长的博客文章了。可是要说到学习,那必须有个积累的过程。那么静下心来阅读有内容的文章(博客或者是书籍)依然是系统学习一门知识的不二之选。 现在大家在某 ...…

查看全部问答>

关于msp430的问题

最近在学msp430f5438,装了IAR后发现头文件里没有5438的头文件,比如 TACTL,TAR等这些寄存器不能识别,是没有头文件这个原因导致的吗?如果是可以把5438的头文件发给我吗?或者是其他什么原因?求各位大神赐教…

查看全部问答>