引脚图
引脚1:GND,接地端;引脚2:VCC,1.9V~3.6V
引脚3:CE, NRF24L01模式控制端
引脚4:CSN,片选信号
引脚5:SCK,SPI时钟输入端
引脚6:MOSI,SPI数据输入端
引脚7:MISO,SPI数据输出端
引脚8:IRQ,中断输出端,低电平使能,即中断输出低电平
对于电源不要超过3.6V,否则可能损坏芯片
对于端口引脚,可以耐压5V,即可以接TTL端口
发送端
#include #define uchar unsigned char #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址 uchar RX_BUF[TX_PLOAD_WIDTH]; uchar TX_BUF[TX_PLOAD_WIDTH]; uchar flag; uchar DATA = 0x01; uchar bdata sta; sbit RX_DR = sta^6; sbit TX_DS = sta^5; sbit MAX_RT = sta^4; sbit CE = P1^5; sbit CSN= P1^4; sbit SCK= P1^3; sbit MOSI= P1^2; sbit MISO= P1^1; sbit IRQ = P1^0; // SPI(nRF24L01) commands #define READ_REG 0x00 // Define read command to register #define WRITE_REG 0x20 // Define write command to register #define RD_RX_PLOAD 0x61 // Define RX payload register address #define WR_TX_PLOAD 0xA0 // Define TX payload register address #define FLUSH_TX 0xE1 // Define flush TX register command #define FLUSH_RX 0xE2 // Define flush RX register command #define REUSE_TX_PL 0xE3 // Define reuse TX payload register command #define NOP 0xFF // Define No Operation, might be used to read status register // SPI(nRF24L01) registers(addresses) #define CONFIG 0x00 // 'Config' register address #define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address #define EN_RXADDR 0x02 // 'Enabled RX addresses' register address #define SETUP_AW 0x03 // 'Setup address width' register address #define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address #define RF_CH 0x05 // 'RF channel' register address #define RF_SETUP 0x06 // 'RF setup' register address #define STATUS 0x07 // 'Status' register address #define OBSERVE_TX 0x08 // 'Observe TX' register address #define CD 0x09 // 'Carrier Detect' register address #define RX_ADDR_P0 0x0A // 'RX address pipe0' register address #define RX_ADDR_P1 0x0B // 'RX address pipe1' register address #define RX_ADDR_P2 0x0C // 'RX address pipe2' register address #define RX_ADDR_P3 0x0D // 'RX address pipe3' register address #define RX_ADDR_P4 0x0E // 'RX address pipe4' register address #define RX_ADDR_P5 0x0F // 'RX address pipe5' register address #define TX_ADDR 0x10 // 'TX address' register address #define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address #define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address #define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address #define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address #define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address #define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address #define FIFO_STATUS 0x17 // 'FIFO Status Register' register address /************************************************** 函数: init_io() 描述: 初始化IO /**************************************************/ void init_io(void) { CE = 0; // 待机 CSN = 1; // SPI禁止 SCK = 0; // SPI时钟置低 IRQ = 1; // 中断复位 LED = 1; // 关闭指示灯 } /**************************************************/ /************************************************** 函数:delay_ms() 描述: 延迟x毫秒 /**************************************************/ void delay_ms(uchar x) { uchar i, j; i = 0; for(i=0; i j = 250; while(--j); j = 250; while(--j); } } /**************************************************/ /************************************************** 函数:SPI_RW() 描述: 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节 /**************************************************/ uchar SPI_RW(uchar byte) { uchar i; for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 } return(byte); // 返回读出的一字节 } /**************************************************/ /************************************************** 函数:SPI_RW_Reg() 描述: 写数据value到reg寄存器 /**************************************************/ uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**************************************************/ /************************************************** 函数:SPI_Read() 描述: 从reg寄存器读一字节 /**************************************************/ uchar SPI_Read(uchar reg) { uchar reg_val; CSN = 0; // CSN置低,开始传输数据 SPI_RW(reg); // 选择寄存器 reg_val = SPI_RW(0); // 然后从该寄存器读数据 CSN = 1; // CSN拉高,结束数据传输 return(reg_val); // 返回寄存器数据 } /**************************************************/ /************************************************** 函数:SPI_Read_Buf() 描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道 数据或接收/发送地址 /**************************************************/ uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**************************************************/ /************************************************** 函数:SPI_Write_Buf() 描述: 把pBuf缓存中的数据写入到nRF24L01,通常用来写入发 射通道数据或接收/发送地址 /**************************************************/ uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**************************************************/ /************************************************** 函数:RX_Mode() 描述: 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包 /**************************************************/ void RX_Mode(void) { CE = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 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, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
上一篇:51单片机 矩阵键盘
下一篇:51单片机 LCD1602显示
推荐阅读
史海拾趣
随着全球市场的不断扩张,Accuride公司也积极实施全球化战略。其在北美地区拥有多个生产基地和销售网络,同时在加拿大和墨西哥也设有子公司。这些子公司在各自的区域内开展业务,为Accuride公司的全球化战略提供了有力支撑。通过全球化布局,Accuride公司能够更好地满足全球客户的需求,提升品牌影响力和市场竞争力。
虽然这些故事并非直接涉及电子行业,但它们展示了Accuride公司在商用车零部件行业的发展历程、经营策略和市场表现。作为一家具有实力和影响力的企业,Accuride公司通过不断创新、拓展市场、优化资源配置等方式,实现了稳健的发展。
作为电子行业的领军企业之一,宇阳科技始终坚持以创新为驱动的发展战略。公司不断投入研发资金,加强技术团队建设,积极引进先进技术和管理经验。通过持续创新和技术升级,宇阳科技成功推出了多款具有自主知识产权的新型电子元器件产品,并引领了行业潮流。同时,公司还积极参与行业标准制定和技术交流合作等活动,为推动电子行业的发展做出了积极贡献。
以上五个故事梗概概述了宇阳科技在电子行业中的发展历程和主要成就。这些故事不仅展现了公司的技术实力和市场地位,也体现了公司不断创新、追求卓越的发展理念。
Big-Sun Electronics Co Ltd公司自成立以来,始终致力于技术研发和产品创新。在成立初期,公司便投入大量资源于研发部门,通过不断试验和改进,成功研发出了一款具有高效能、低能耗特点的电子芯片,这一技术突破迅速在市场上引起了广泛关注。随着产品线的不断扩展,Big-Sun的电子产品逐渐在行业内树立起了技术领先的形象。
Centellax深知人才是公司发展的核心动力。因此,公司一直致力于打造一支高素质、专业化的团队。通过招聘优秀的研发、销售、管理等人才,为公司的长期发展提供有力的人才保障。
在团队建设方面,Centellax注重培养员工的团队协作精神和创新能力。通过定期举办团队建设活动、培训课程等,提升员工的凝聚力和归属感。同时,公司还鼓励员工积极参与创新项目,为公司的技术进步和业务发展贡献智慧和力量。
在集成电路设计领域,技术的突破是赢得市场的关键。成都华微科技始终坚持以技术研发为核心,不断投入巨资进行技术研发和创新。经过多年的努力,公司在可编程逻辑器件、系统级芯片、存储器和模数/数模转换器(AD/DA)芯片等领域取得了重大突破,产品性能达到了国内领先水平。这些技术突破不仅为公司赢得了市场的认可,也提升了中国集成电路设计行业的国际地位。
为了进一步提升自身实力和市场竞争力,杜因特积极寻求与国内外一流芯片代工厂、封装测试代工厂的合作。通过紧密的合作关系,杜因特不仅获得了先进的技术支持,还实现了产品质量的稳步提升。同时,公司还积极与国内外知名电子企业建立战略合作关系,共同开拓市场,实现共赢发展。
我的VS2005 安装后没找到remote kernel viewer,怎么回事? 如题,在开始-〉程序-〉vs—〉vs remote tools 里面没找到,remote kernel viewer。打开vs,在菜单中也没找到。奇怪了,是我安装的时候漏了,还是躲的太深没找对地方?PB 和 EVC玩过都有这个东西的,网上查了一下,好像VS2005也应该有的阿。 … 查看全部问答∨ |
|
我想让两个MODEM通过串口连接到两台电脑上,实现GPRS通信! 由于没有公网IP,两个MODEM均是动态IP,想通过短信形式发送各自的IP地址,可以么?还有没有公网IP,怎样获得动态IP? 各位兄弟帮忙哈!… 查看全部问答∨ |
lut1lut的"STR71x的UART进行IAP"为何需要手动再次拷贝 在lut1lut的“如何利用STR71x的UART进行IAP 补充说明 版本1.0”的方法中,用户程序要使用中断必须手动拷贝用户程序的异常向量表、启动代码和中断处理函数。(使用的是api_segment_init.c)。而在用户程序的lnkarm.xcl文件里可以看到 ...… 查看全部问答∨ |
MSP430F149做GPRS驱动,发送字符多后老是莫名的重启? 用MSP430的串口1驱动GPRS模块SIM300DZ,发送短信,发送124个字符,正常工作,发送150个字符,单片机会重启动,莫名奇妙的原因,请问,430可以查出是什么原因引起复位的吗,比如说复位中断函数有没有,还请朋友多帮帮忙,想个法子。… 查看全部问答∨ |
|
求各位大侠帮忙,相信这个问题难不倒你们,小弟在此衷心地谢谢各位了!! 求各位大侠帮忙,相信这个问题难不倒你们,关于8051单片机设计一个实例的,小弟在此衷心地谢谢各位了!!在Proteus软件中完成所有操作!!!! 本人是初学者,老师布置了一道作业, 题目如下: 1:用8051设计控制一台电机正转(P1.0)和反 ...… 查看全部问答∨ |
各位朋友: 本人最近开发的28027板子总是出现“软中断 s/w breakpoint, 在default isr里面总是停留在 interrupt void ILLEGAL_ISR(void) // Illegal operation TRAP { // Insert ISR Code here &nbs ...… 查看全部问答∨ |
首先是EZDSP2808的原理图,大家要小心,图里面的上电顺序错啦 我在下面有详述。https://bbs.eeworld.com.cn/thread-317125-1-1.html 接着是controlcard的图。这是最正确不过的,TI原厂的原理图。 最后是controlc ...… 查看全部问答∨ |
简介:MSP430是超级低功耗单片机的代表产品。他有灵活的时钟系统,多种深度的低功耗模式,以及高度智能化的外设。通过充分应用MSP430的特性和内部模块,可以实现理想的低功耗特性。 $(\'swf_OfU\').innerHTML=AC_FL_RunContent(\'width\', ...… 查看全部问答∨ |