历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2020年10月30日 | 调试好的nRF24L01库文件 单片机源程序

2020-10-30 来源:51hei

单片机源程序如下:

#include "nRF24L01Drv.h"

#include "USART.h"

#include "stdio.h"

#include "config.h"

#include

#include "spi.h"


/**

* 1.改多路方法:

* NUM_USED_PIPE 改为使用的路数, RX_ADDRESS 分别指定 RX的地址,

* RX_PLOAD_WIDTH 改为每一路的PAYLOAD

* NRF24L01_RxPacket 里面知道是哪一路在接收

*

*

* 2. 发送时自动将CONFIG 备份,然后切换TX后再切换回去

*   并且备份RX_ADDR_P0

*

* 3. 通道0,1 支持40位地址写入, 但是通道2,3,4,5只支持1位写入,其他地址与1通道相同

*

* 4. NRF24L01_TxPacket 支持写入TX_PLOAD_WIDTH 个字节

*

* 5. NRF24L01_RxPacket 第一个参数是PIPE_NUMBER, 第二个参数是 读入的 buffer

*

*

* **/

#define NUM_USED_PIPE 3


const u8 TX_ADDRESS[TX_ADR_WIDTH] = {0x35, 0x30, 0x30, 0x30, 0x35};

const u8 RX_ADDRESS[6][RX_ADR_WIDTH] = {{0x33, 0x30, 0x30, 0x30, 0x33}, {0x34, 0x30, 0x30, 0x30, 0x33}, {0x35, 0x00, 0x00, 0x00, 0x00}};

u8 RX_PLOAD_WIDTH[6] = {0x02, 0x02, 0x02, 0x00, 0x00, 0x00};


u8 SPI_RW(u8 tr_data)

{

        u16 bit_ctr;

        for (bit_ctr = 0; bit_ctr < 8; bit_ctr++) // output 8-bit

        {

                NRF_MOSI = (tr_data & 0x80); // output 'uchar', MSB to MOSI

                tr_data = (tr_data << 1);         // shift next bit into MSB..

                NRF_SCK = 1;                                 // Set SCK high..

                tr_data |= NRF_MISO;                 // capture current MISO bit

                NRF_SCK = 0;                                 // ..then set SCK low again

        }

        return (tr_data); // return read uchar

}


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

/* 函数功能:给24L01的寄存器写值(一个字节) */

/* 入口参数:reg   要写的寄存器地址          */

/*           value 给寄存器写的值            */

/* 出口参数:status 状态值                   */

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

u8 NRF24L01_RW_Reg(u8 reg, u8 value)

{

        u16 status;


        NRF_CSN = 0;                  // CSN low, init SPI transaction

        status = SPI_RW(reg); // select register

        SPI_RW(value);                  // ..and write value to it..

        NRF_CSN = 1;                  // CSN high again


        return (status); // return nRF24L01 status uchar

}

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

/* 函数功能:读24L01的寄存器值 (一个字节)      */

/* 入口参数:reg  要读的寄存器地址               */

/* 出口参数:value 读出寄存器的值                */

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

u8 NRF24L01_Read_Reg(u8 reg)

{

        u8 reg_val;


        NRF_CSN = 0;                        // CSN low, initialize SPI communication...

        SPI_RW(reg);                        // Select register to read from..

        reg_val = SPI_RW(0xFF); // ..then read registervalue

        NRF_CSN = 1;                        // CSN high, terminate SPI communication


        return (reg_val); // return register value

}

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

/* 函数功能:读24L01的寄存器值(多个字节)   */

/* 入口参数:reg   寄存器地址                */

/*           *pBuf 读出寄存器值的存放数组    */

/*           len   数组字节长度              */

/* 出口参数:status 状态值                   */

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

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

{

        u16 status, uchar_ctr;


        NRF_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 < len; uchar_ctr++)

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


        NRF_CSN = 1;


        return (status); // return nRF24L01 status uchar

}

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

/* 函数功能:给24L01的寄存器写值(多个字节)  */

/* 入口参数:reg  要写的寄存器地址            */

/*           *pBuf 值的存放数组               */

/*           len   数组字节长度               */

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

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

{

        u8 status, u8_ctr;

        NRF_CSN = 0;

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

        for (u8_ctr = 0; u8_ctr < len; u8_ctr++)

                SPI_RW(*pBuf++); //写入数据

        NRF_CSN = 1;

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

}


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

/* 函数功能:24L01接收数据                   */

/* 入口参数:rxbuf 接收数据数组              */

/* 返回值: 1   成功收到数据                 */

/*          0   没有收到数据                 */

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

u8 NRF24L01_RxPacket(u8 *pipe_num, u8 *rxbuf)

{

        u8 fifo_state;

        u8 state;

        u8 i;

        unsigned char revale = 0;


        fifo_state = NRF24L01_Read_Reg(FIFO_STATUS); //读取状态寄存器的值

        state = NRF24L01_Read_Reg(STATUS);                         //清除TX_DS或MAX_RT中断标志

        //TX1_write2buff(state);

        if (!(fifo_state & _BV(RX_EMPTY))) //接收到数据

        {

                NRF_CSN = 0;

                i = SPI_RW(RF24_NOP); // IRQ收发完成中断响应,16位CRC,主发送

                *pipe_num = (i >> RX_P_NO) & 0x07;

                NRF_CSN = 1;

                NRF_CE = 0;                                                                                                                  //SPI使能

                NRF24L01_Read_Buf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH[*pipe_num]); // read receive payload from RX_FIFO buffer

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

                NRF24L01_RW_Reg(WRITE_REG + STATUS, state);                                                  //清除TX_DS或MAX_RT中断标志

                NRF24L01_RW_Reg(FLUSH_RX, 0xFF);                                                                  //清除TX_DS或MAX_RT中断标志

                revale = RX_PLOAD_WIDTH[*pipe_num];

        }

        NRF_CE = 1;


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

}

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

/* 函数功能:设置24L01为发送模式              */

/* 入口参数:txbuf  发送数据数组              */

/* 返回值; 0x10    达到最大重发次数,发送失败*/

/*          0x20    成功发送完成              */

/*          0xff    发送失败                  */

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

u8 NRF24L01_TxPacket(u8 *txbuf)

{

        u8 state;

推荐阅读

史海拾趣

Hirect公司的发展小趣事
使用万用表等工具检查变压器的输入输出电压和电流是否正常,确认变压器是否损坏。
Essentra Components公司的发展小趣事

Essentra Components公司自创立之初,就深知技术创新在电子行业的重要性。公司通过不断投入研发资源,成功开发出了一系列具有创新性的塑料注塑成型、乙烯基浸塑成型技术,这些技术不仅提高了产品的性能和质量,还大大降低了生产成本。随着技术的不断升级和完善,Essentra Components的产品逐渐在市场上占据了重要地位,公司也因此迅速发展壮大。

成都振芯/国腾(CORPRO)公司的发展小趣事

2003年,成都国腾微电子有限公司(后更名为成都振芯科技股份有限公司)正式成立,标志着CORPRO的起点。公司由成都国腾电子集团投资设立,创始人团队汇聚了来自中国物资储运集团、电子科技大学等单位的精英。在成立之初,CORPRO就致力于集成电路、微波组件及相关电子器件的设计、开发与销售,奠定了其在电子行业的基础。

Hitachi Chemical Co America Ltd公司的发展小趣事

70年代,随着电子技术的飞速发展,导热材料行业迎来了前所未有的机遇。Bergquist Company敏锐地捕捉到了这一机遇,开始涉足导热材料领域。公司投入大量资金进行研发,成功开发出了一系列具有创新性的导热产品。这些产品不仅性能卓越,而且价格合理,深受市场欢迎。凭借这些优势,Bergquist Company逐渐在导热材料行业崭露头角,成为了行业的领军企业。

Hosiden Corporation公司的发展小趣事

近年来,Hosiden在技术创新方面取得了显著成果。特别是在汽车市场,公司积极参与并推动了MIPI A-PHY标准的验证与应用。Hosiden与Valens Semiconductor等领先企业合作,完成了其连接器和电缆对Valens VA7000芯片组的验证,这是市场上首个符合MIPI A-PHY的芯片组。这一里程碑式的成就不仅展示了Hosiden在技术创新方面的实力,也进一步巩固了其在汽车电子市场中的领先地位。

福斯特半导体(Foster)公司的发展小趣事

随着全球市场的不断扩展,Hosiden积极实施全球化战略,以满足全球客户对高质量电子产品的需求。公司不仅在日本本土拥有强大的生产基地和销售网络,还通过设立海外分支机构、与国际知名企业建立战略合作关系等方式,不断拓宽其全球市场版图。例如,Hosiden在中国市场通过投资豪熙电电子(上海)有限公司等方式,加强了其在中国及亚太地区的业务布局。

问答坊 | AI 解惑

单片机在交通灯控制系统中的应用

求一篇关于这个题目的毕业论文 谢谢! 邮箱yixianfeng-1987@163.com [ 本帖最后由 yixianfeng 于 2009-5-17 17:59 编辑 ]…

查看全部问答>

明天我们要加油

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 明天我们一定能行  …

查看全部问答>

未来无限好 智能家居前景浅析

智能家居开始流行于上世纪七十年代的美国,并且在欧洲有很大的应用。近几年来智能家居产品像普通商品一样被摆在超市里销售。进入二十一世纪,在新加坡、韩国、日本及我国香港、澳门等地也开始应用。什么是智能家居?    一、概念解析 ...…

查看全部问答>

各位帮我看看下面的电路啊

Y1为超声波探头 去掉D3 Y1两端的电压为15v方便 没有去掉时 Y1在示波器上显示没有信号 怎么回事:L…

查看全部问答>

evc 如何弹出另一窗口界面???

各位大侠,我想在一个界面上按一个按钮,弹出另一界面,请问应该使用什么函数去调用产生另一个界面呢?…

查看全部问答>

关于无线网络的设计

小弟现在接到上头一份任务,就是设计一个无线网络协议出来。 可能有几百个节点(Node),每个结点之间要能互相通信,网络使用无线电波作为传输的介质。在同一时刻只能有一个节点发送数据。 小弟以前都是做软件的,TCP/IP网络协议倒是研究过,但是 ...…

查看全部问答>

如何实现内核空间一个函数在后台一直运行!

大家好! 现在正在做一个通过无线网络进行文件传输方面的项目,想让内核空间的接收函数在后台一直运行,然后数据到来时用netlink通过用户态接收,然后写入文件。 主要问题:如何实现内核空间一个函数在后台一直运行,而又不影响用户态的操作。 ...…

查看全部问答>

LPC1788开发板制作

请问有哪位大侠做过关于LPC1788的开发板,能不能给点建议,由于本人是第一次做这样的系统板,请多多帮助,不知道有没有什么参考资料!谢谢…

查看全部问答>

matlab很好的教程(我当做一本工具书用)

M AT L A B是一个可视化的计算程序,被广泛地使用于从个人计算机到超级计算机范围内的各种计算机上。 M AT L A B包括命令控制、可编程,有上百个预先定义好的命令和函数。这些函数能通过用户自定义函数进一步扩展。M AT L A B有许多强有力的命令。 ...…

查看全部问答>

谁可以写个这样的程序给我来参考参考啊

有哪位大虾帮我这个新手编一下面的程序,小弟感觉不尽。 要求:1用msp430g2553.h实现。            2实现如下功能,每十秒钟灯光闪烁一次,每2秒灯光亮度变化一次,按键按一次延时时间增加5秒灯光亮度变 ...…

查看全部问答>