历史上的今天
返回首页

历史上的今天

今天是:2025年08月10日(星期日)

正在发生

2019年08月10日 | stm32 NRF24L01

2019-08-10 来源:eefocus

include "24l01.h"

#include "lcd.h"

#include "delay.h"

#include "spi.h"

#include "usart.h"



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

const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};


//初始化24L01的IO口

void NRF24L01_Init(void)

{   

    GPIO_InitTypeDef GPIO_InitStructure;

  SPI_InitTypeDef  SPI_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE);   //使能PB,G端口时钟



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;               //PB12上拉 防止W25X的干扰

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化指定IO

    GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉                



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8;    //PG8 7 推挽    

    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO


    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;   

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG6 输入  

    GPIO_Init(GPIOG, &GPIO_InitStructure);


    GPIO_ResetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);//PG6,7,8上拉                   


  SPI2_Init();          //初始化SPI     


    SPI_Cmd(SPI2, DISABLE); // SPI外设不使能


    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;       //SPI主机

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;     //发送接收8位帧结构

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;      //时钟悬空低

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;    //数据捕获于第1个时钟沿

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;       //NSS信号由软件控制

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;     //定义波特率预分频的值:波特率预分频值为16

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //数据传输从MSB位开始

    SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式

    SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器


    SPI_Cmd(SPI2, ENABLE); //使能SPI外设


    NRF24L01_CE=0;          //使能24L01

    NRF24L01_CSN=1;         //SPI片选取消  


}

//检测24L01是否存在

//返回值:0,成功;1,失败 

u8 NRF24L01_Check(void)

{

    u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};

    u8 i;

    SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)        

    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.    

    NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址  

    for(i=0;i<5;i++)if(buf[i]!=0XA5)break;                                 

    if(i!=5)return 1;//检测24L01错误    

    return 0;        //检测到24L01

}        

//SPI写寄存器

//reg:指定寄存器地址

//value:写入的值

u8 NRF24L01_Write_Reg(u8 reg,u8 value)

{

    u8 status;  

    NRF24L01_CSN=0;                 //使能SPI传输

    status =SPI2_ReadWriteByte(reg);//发送寄存器号 

    SPI2_ReadWriteByte(value);      //写入寄存器的值

    NRF24L01_CSN=1;                 //禁止SPI传输      

    return(status);                 //返回状态值

}

//读取SPI寄存器值

//reg:要读的寄存器

u8 NRF24L01_Read_Reg(u8 reg)

{

    u8 reg_val;     

    NRF24L01_CSN = 0;          //使能SPI传输        

    SPI2_ReadWriteByte(reg);   //发送寄存器号

    reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容

    NRF24L01_CSN = 1;          //禁止SPI传输            

    return(reg_val);           //返回状态值

}   

//在指定位置读出指定长度的数据

//reg:寄存器(位置)

//*pBuf:数据指针

//len:数据长度

//返回值,此次读到的状态寄存器值 

u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)

{

    u8 status,u8_ctr;          

    NRF24L01_CSN = 0;           //使能SPI传输

    status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值         

    for(u8_ctr=0;u8_ctr    NRF24L01_CSN=1;       //关闭SPI传输

    return status;        //返回读到的状态值

}

//在指定位置写指定长度的数据

//reg:寄存器(位置)

//*pBuf:数据指针

//len:数据长度

//返回值,此次读到的状态寄存器值

u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)

{

    u8 status,u8_ctr;       

    NRF24L01_CSN = 0;          //使能SPI传输

    status = SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值

    for(u8_ctr=0; u8_ctr    NRF24L01_CSN = 1;       //关闭SPI传输

    return status;          //返回读到的状态值

}                  

//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:发送完成状况

u8 NRF24L01_TxPacket(u8 *txbuf)

{

    u8 sta;

    SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   

    NRF24L01_CE=0;

    NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节

    NRF24L01_CE=1;//启动发送       

    while(NRF24L01_IRQ!=0);//等待发送完成

    sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值    

    NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志

    if(sta&MAX_TX)//达到最大重发次数

    {

        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 

        return MAX_TX; 

    }

    if(sta&TX_OK)//发送完成

    {

        return TX_OK;

    }

    return 0xff;//其他原因发送失败

}

//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:0,接收完成;其他,错误代码

u8 NRF24L01_RxPacket(u8 *rxbuf)

{

    u8 sta;                                        

    SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   

    sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值      

    NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志

    if(sta&RX_OK)//接收到数据

    {

        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据

        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 

        return 0; 

    }      

    return 1;//没收到任何数据

}                       

//该函数初始化NRF24L01到RX模式

//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR

//当CE变高后,即进入RX模式,并可以接收数据了          

void NRF24L01_RX_Mode(void)

{

    NRF24L01_CE=0;    

    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址


    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    

    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置RF通道为40          

    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度        

    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 

    NRF24L01_CE = 1; //CE为高,进入接收模式 

}                        

//该函数初始化NRF24L01到TX模式

//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR

//PWR_UP,CRC使能

//当CE变高后,即进入RX模式,并可以接收数据了          

//CE为高大于10us,则启动发送.  

void NRF24L01_TX_Mode(void)

{                                                        

    NRF24L01_CE=0;      

    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 

    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK   


    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  

    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次

    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40

    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

推荐阅读

史海拾趣

GSN Electronics公司的发展小趣事

GSN Electronics公司在电子行业中的发展可以追溯到多个方面,以下是五个关于其发展的故事,每个故事均基于事实进行描述:

1. 创立与初期发展

故事背景:GSN Electronics(深圳)有限公司成立于2012年11月27日,由GSN Electronics (Hong Kong) Limited全资控股,注册资本为100万元人民币,后增至当前规模。公司自成立以来,便专注于电子连接器和线束的生产经营,以及电子产品和电子零件的研发、批发、进出口及相关配套业务。初期,GSN Electronics凭借其专业技术和敏锐的市场洞察力,在深圳这一中国重要的电子产业聚集地迅速站稳脚跟。

发展亮点:公司通过不断优化产品结构和提升技术实力,逐步在电子行业中建立了自己的品牌影响力。

2. 技术创新与专利积累

故事背景:GSN Electronics深知技术创新是企业发展的核心驱动力。因此,公司不断加大研发投入,致力于新产品的开发和旧产品的升级换代。截至目前,公司已获得多项实用新型专利授权,如耐折弯的微型连接器、方便插入的电连接器、端口防水防尘结构的连接器等,这些专利技术的应用极大地提升了产品的竞争力和市场占有率。

发展亮点:技术创新和专利积累不仅巩固了GSN Electronics在电子连接器领域的领先地位,还为其拓展新市场、开发新客户提供了有力支持。

3. 市场拓展与国际认证

故事背景:随着公司实力的不断增强,GSN Electronics开始积极拓展国内外市场。公司通过参加各类行业展会、建立海外销售网络等方式,不断提升品牌知名度和市场占有率。同时,公司还积极申请并获得了多项国际认证,如IATF 16949和ISO 9001等,这些认证不仅证明了公司的产品质量和管理水平达到了国际标准,还为其进入高端市场提供了有力保障。

发展亮点:市场拓展和国际认证的成功实施,使GSN Electronics在电子行业中树立了良好的企业形象和品牌形象。

4. 团队建设与企业文化

故事背景:GSN Electronics深知人才是企业发展的根本。因此,公司一直注重团队建设和企业文化建设。公司拥有一支高素质的研发团队和销售团队,他们不仅具备丰富的专业知识和实践经验,还具备强烈的创新意识和团队精神。同时,公司还积极营造开放、包容、创新的企业文化氛围,鼓励员工勇于尝试、敢于创新。

捷茂微(GATEMODE)公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视与外部信号源的关键设备,其专业性与科普性并重。作为现代家庭娱乐不可或缺的一部分,机顶盒不仅实现了数模转换功能,让用户在模拟电视机上也能观看数字电视,还通过不断的技术创新,丰富了用户的视听体验。

从广义上讲,机顶盒涵盖了从模拟频道增补器到数字卫星综合接收解码器(IRD)、有线电视数字机顶盒等多种类型。而从狭义上看,主要聚焦于数字设备,如数字卫星机顶盒(DVB-S)、数字地面机顶盒(DVB-T)及IPTV机顶盒等。这些机顶盒能接收来自有线电缆、卫星天线、宽带网络及地面广播的信号,并将其转换为电视机可识别的音视频格式,实现高清甚至4K超高清的播放效果。

随着互联网的普及,网络机顶盒更是成为连接电视与互联网的桥梁。它不仅提供传统的电视节目服务,还通过集成智能技术,实现了语音助手、智能推荐等功能,极大提升了用户体验。此外,网络机顶盒还能接入各种流媒体平台,让用户在电视上观看在线视频、玩游戏、浏览网页等,实现了电视功能的多元化和智能化。

综上所述,机顶盒以其强大的功能和不断的技术创新,成为现代家庭娱乐的重要组成部分,为用户带来了更为丰富、便捷、智能的视听享受。

FerriShield公司的发展小趣事

随着技术的成熟和市场的认可,FerriShield开始拓展产品线。公司研发团队不断改进和优化原始的铁磁屏蔽材料,并推出了针对不同应用场景的系列产品。例如,针对智能手机和平板电脑的轻薄型电磁屏蔽膜,以及针对大型数据中心的高效电磁屏蔽板。这些新产品的推出,使得FerriShield的市场份额逐步扩大。

Gamma Microelectronics ( APM )公司的发展小趣事

G24i的成立可以追溯到2006年,它自称是世界上首家生产商业化应用等级DSSC的公司。公司的技术根基源自瑞士洛桑联邦理工学院的M. Gratzel团队,该团队是DSSC技术的先驱。G24i由美国Kanorka Technologies公司投资,而Kanorka则得到了美国军方的资助。这一强大的技术背景为G24i的商业化之路奠定了坚实的基础。公司成立后不久,便致力于将实验室级别的DSSC技术推向市场,开启了其商业化探索的征程。

C&K Components公司的发展小趣事

进入新时代,C&K继续坚持创新驱动的发展战略,不断加大在研发和创新方面的投入。公司紧跟行业趋势,积极探索新技术、新工艺和新应用,推出了一系列具有创新性和领先性的开关产品。同时,C&K也注重与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案和优质的服务。这些举措使C&K在激烈的市场竞争中始终保持领先地位,并赢得了更多客户的认可和支持。

这些故事展示了C&K Components公司在电子行业中的发展历程和取得的成就。从初创时期的坚持与探索,到60年代的转型与突破,再到90年代的行业领先地位确立,以及千禧年代的并购与融合和新时代的创新与发展,C&K始终保持着对技术的热爱和对市场的敏锐洞察,不断推动公司向前发展。

Diamond SA公司的发展小趣事

随着技术的不断成熟,Diamond SA公司开始积极拓展市场。他们与全球知名的电子产品制造商建立了合作关系,将自己的芯片技术应用于各种电子设备中。同时,公司还加大了品牌推广力度,通过一系列营销活动提升了品牌知名度和美誉度。随着市场份额的逐步扩大,Diamond SA公司成为了电子行业中的领军企业。

问答坊 | AI 解惑

优化应用

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 优化应用 matlab求最小值最大值 等等 减小计算压力啊[free][/free] [ 本帖最后由 yushiqian 于 2009-8-15 23:13 编辑 ]  …

查看全部问答>

ARM7(44b0)开发板原理图和PCB图

ARM7(44b0)开发板原理图和PCB图 很不错的资料哦!…

查看全部问答>

悲剧啊,明天开卷考,找不到题目答案,在线等各位大虾帮忙

第一章         嵌入式系统的定义;工业特点和要求         行业硬件软件特征、产品特征(根据行业特点来说、共性、目前市场)价格、客户         市场(家用、通讯、商业、医疗、 ...…

查看全部问答>

想买个开发板玩wince,请大家推介一下那家的产品比较好价格又不太贵!

想买个开发板玩wince,请大家推介一下那家的产品比较好价格又不太贵!价格最好不要高个800块,提供wincei的学习资料比较多。曾经看过周立功的网站,那家伙,开发板太贵了,但是看上写的资料倒是很多的!…

查看全部问答>

紧急求助!对vxworks/tornado开发比较熟悉的大牛帮帮忙!

选了vxworks的课,结果忙了一学期其他的事情,还有几天交作业了,着急,诚征大牛帮忙。价格面议。手机:13718106015    实验1. 哲学家的晚餐(30%)    实验2. TCP双机通信(40%)    实验内容:安装Tornado UL ...…

查看全部问答>

有关RTL视图的一个符号?

这是我在做一个有关数码管实验时,观察RTL视图遇到的问题,我不知道图中红色标记的符号代表什么意思?麻烦大家给解释一下。 …

查看全部问答>

IAR4.42A安装不了了

                                 在笔记本上安装的时候抽取完文件后连主安装界面都没出来就没了,在台式机安装时抽取完文件后提示C盘空间不够,不能 ...…

查看全部问答>

【LaunchPad】TI给我的CCS4下载下来怎么找不到430G223这个器件啊?

前两天买了一个LanuchPad小板,就是25元的那个 在TI公司申请了一个CCS4的安装连接,安好后就一直找不到G系列的器件 是怎么回事呢? 或者有人能给我一个可以开发LaunchPad板子的CCS下载连接吗?谢谢大家了…

查看全部问答>

毕业出售未开封launchpad 和 msp430f2619开发板

封贴,已出 [ 本帖最后由 zhongxia2009 于 2011-12-24 13:57 编辑 ]…

查看全部问答>

C2000听课,刚好60分,呵呵,可以得板板啦

我今天查了下,课程进度69%,考试得分60分,应该是可以得到板子了吧,呵呵…

查看全部问答>