欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Nrf24L01发送程序.pdf

    • 资源ID:85896316       资源大小:365.31KB        全文页数:15页
    • 资源格式: PDF        下载积分:19.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要19.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Nrf24L01发送程序.pdf

    /*头文件:NRF24L01.h*文件名:NRF24L01.c*创建人:动车组*日期:2012-8-21 *功能描述:用 NRF24L01 发送一定字节数的数据或者接收数据 *占用资源:四位控制 SPI 总线的 IO 线和 1 位 NRF24L01 模式控制引脚 *占用一个中段*/#includenrf24l01.h uchar code TX_ADDRESSTX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/本地地址 uchar code RX_ADDRESS_0RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/为了应答 接收设备,接收通道 0 地址和发送地址相同/uchar code RX_ADDRESS_1RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 1 地址/通道 1-5 最有最低字节不一样 /uchar code RX_ADDRESS_2RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 2 地址/且写地址的时候是低字节先写/uchar code RX_ADDRESS_3RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 3 地址/uchar code RX_ADDRESS_4RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 4 地址/uchar code RX_ADDRESS_5RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 5 地址 bit RX_OK=0;/接收数据完成标志,在中断中置位 bit TX_OK=1;/数据发送完毕标志,在中断置位 由于第一次要可以发送 所以 初值为 1 bit MAX_RT_OK=0;/发送次数超过设置的次数的标志 在中断置位 uchar bdata sta=0 x00;/状态标志 sbit RX_DR=sta6;sbit TX_DS=sta5;sbit MAX_RT=sta4;/*以下是 SPI 的读写函数 */*/*函数:uchar SPI_RW(uchar date)/*功能:SPI 一个字节写时序/*/uchar SPI_RW(uchar byte)uchar i;SCK=0;for(i=0;i8;i+)/循环 8 次 MOSI=(byte&0 x80);/byte 最高位输出到 MOSI byte=1;/低一位移位到最高位 SCK=1;/拉高 SCK,nRF24L01 从 MOSI 读入 1 位数 据,同时从 MISO 输出 1 位数据 byte|=MISO;/读 MISO 到 byte 最低位 SCK=0;/SCK 置低 return(byte);/返回读出的一字节 /*/*函数:uchar SPI_Read(uchar reg)/*功能:SPI 从 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 在 reg 中写入数据 value 函数/*/void SPI_RW_Reg(uchar reg,uchar value)CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 SPI_RW(value);/然后写数据到该寄存器 CSN=1;/CSN 拉高,结束数据传输 /*/*函数:uint SPI_Read_Buf(uchar reg,uchar*pBuf,uchar uchars)/*功能:用于 SPI 连读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/void SPI_Read_Buf(uchar reg,uchar*pBuf,uchar bytes)uchar i;CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 for(i=0;ibytes;i+)pBufi=SPI_RW(0);/逐个字节从 nRF24L01 读出 CSN=1;/CSN 拉高,结束数据传输 /*/*函数:uchar SPI_Write_Buf(uchar reg,uchar*pBuf,uchar uchars)/*功能:用于 SPI 连写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入 数据的个数/*/void SPI_Write_Buf(uchar reg,uchar*pBuf,uchar bytes)uchar i;CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 for(i=0;ibytes;i+)SPI_RW(pBufi);/逐个字节写入 nRF24L01 CSN=1;/CSN 拉高,结束数据传输 /*以下是 nrf24l01 的应用层函数 */void nrf_delay()uint a=130*10;while(a-);/*NRF24L01 初始化/*/void init_NRF24L01(void)CE=0;/待机/SPI_RW_Reg(WRITE_REG+CONFIG,0 x0f);/配置寄存器 设置为接收模式 SPI_RW_Reg(WRITE_REG+EN_AA,0 x01);/通道 0 自动 ACK 应 答 允 许 0 x01 SPI_RW_Reg(WRITE_REG+EN_RXADDR,0 x01);/允许接收地址只有通道 0,如果需要多频道可以参考 Page21 0 x01 /SPI_RW_Reg(WRITE_REG+SETUP_AW,0 x03);/收发地址宽度设置为 5 个字节 SPI_RW_Reg(WRITE_REG+SETUP_RETR,0 x0a);/等待 250+86us 重发 10 次 SPI_RW_Reg(WRITE_REG+RF_CH,0);/设置信道工作为 2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG+RF_SETUP,0 x07);/设置发射速率为 1MHZ,发射 功率为最大值 0dB SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS_0,RX_ADR_WIDTH);/为了应答接收设备,接收通道 0 地址和发送地址相同 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);/写本地发送地址 SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为 32 字节 EX1=1;/开外部中断 1 IT1=1;/下降沿触发 EA=1;/开总中断 /*/*设置模式:b 为 0 时是发送模式 为 1 时是接收模式*/*/void Set_Mode(char b)CE=0;SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e+b);/IRQ 收发完 成中断响应,16 位 CRC,主接收 CE=1;/模式转换要等待 130Us nrf_delay();/*/*函数:bit nRF24L01_TxPacket(unsigned char*tx_buf)/*功能:发送 tx_buf 中数据 返回 1 数据发送 /*/bit nRF24L01_TxPacket(uchar*tx_buf)bit val=0;if(TX_OK)TX_OK=0;CE=0;/StandBy I 模式 SPI_RW_Reg(WRITE_REG+STATUS,sta);/发送完数据后 RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志/CSN=0;/CSN 置低,开始传输数据/SPI_RW(FLUSH_TX);/数据成功发送到了接收端,此时状态寄存器的 TX_DS 位置 高并把数据从 TX FIFO 中清除掉 /所以这里就不要再清除 TX FIFO 了/CSN=1;/CSN 置低,开始传输数据 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);/装载 数据 SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e);/IRQ 收发完成中断响应,16 位 CRC,主发送 CE=1;/置高 CE,激发数据发送 val=1;else if(MAX_RT_OK)MAX_RT_OK=0;SPI_RW_Reg(WRITE_REG+STATUS,sta);/发送完数据后 RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志 CSN=0;/CSN 置低,开始传输数据 SPI_RW(FLUSH_TX);/MAX_RT 位置高,不清除 TX FIFO 中的数据 所以这里要 清除 TX FIFO CSN=1;TX_OK=1;return val;/*/*函数:bit nRF24L01_RxPacket(uchar*rx_buf)/*功能:数据读取后放如 rx_buf 接收缓冲区中/*/bit nRF24L01_RxPacket(uchar*rx_buf)bit revale=0;if(RX_OK)/判断是否接收到数据 RX_OK=0;/接收数据标志清零 CE=0;/SPI 使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);/read receive payload from RX_FIFO buffer SPI_RW_Reg(WRITE_REG+STATUS,sta);/接收到数据后RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志 CSN=0;/CSN 置低,开始传输数据 SPI_RW(FLUSH_RX);/用于清空 FIFO!CSN=1;/CSN 置低,开始传输数据 revale=1;/读取数据完成标志 Set_Mode(1);/重新设置为接收模式 return revale;/*NRF24L01 IRQ 引脚产生的中断函数*/void Int_1()interrupt 2 sta=SPI_Read(STATUS);/读取状态寄存其来判断数据接收状况 if(RX_DR)/接收到数据了 RX_OK=1;if(TX_DS)/数据发送完毕 TX_OK=1;if(MAX_RT)MAX_RT_OK=1;/*/*文件名:NRF24L01.h*创建人:动车组*日期:2012-8-21 *功能描述:用 NRF24L01 发送一定字节数的数据或者接收数据 *占用资源:四位控制 SPI 总线的 IO 线和 1 位 NRF24L01 模式控制引脚 *占用一个中段*/#ifndef _NRF24L01_H_#define _NRF24L01_H_#include#define uint unsigned int#define uchar unsigned char/*SPI 引脚号*sbit MISO=P16;/7 主入从出 sbit SCK=P17;/5 SPI 时钟 由主机产生 sbit CSN=P37;/4 SPI 使能 为 1 时 SPI 禁止 sbit MOSI=P15;/6 主出从入 /*NRF24L01 引脚*sbit CE =P36;sbit IRQ =P33;/中断引脚#define TX_PLOAD_WIDTH 32 /发送字节数在这里设置 发送和接收 要一样#define RX_PLOAD_WIDTH 32 /接收字节数在这里设置 void init_NRF24L01(void);/NRF24L01 初始化 已经中断初始化了 void Set_Mode(char b);/*设置模式:b 为 0 时是发送模式 为 1 时是接收模式*/bit nRF24L01_TxPacket(uchar*tx_buf);/发送 tx_buf 中数据 返回 1 数据发送 bit nRF24L01_RxPacket(uchar*rx_buf);/返回 1 时数据读取后放如 rx_buf 接收缓冲 区中 否则没有数据#define TX_ADR_WIDTH 5 /5 uints TX address width#define RX_ADR_WIDTH 5 /5 uints RX address width /*NRF24L01 寄存器指令 *#define READ_REG 0 x00 /读寄存器指令/*000A AAAA 读配置寄存器;AAAAA 指出读操作的寄存器地址*/#define WRITE_REG 0 x20 /写寄存器指令/*001A AAAA 写配置寄存器;AAAAA 指出写操作的寄存器地址只有在掉电模式和待机模式 下可操作*/#define RD_RX_PLOAD 0 x61 /读取接收数据指令/*0110 0001 读 RX 有效数据;1-32 字节,读操作全部从字节 0 开始,当读 RX 有效数据完成后 FIFO 寄存器中有效数 据被清除;应用于接收模式下*/#define WR_TX_PLOAD 0 xA0 /写待发数据指令/*1010 0000 写 TX 有效数据,1-32 字节写操作,从字节 0 开始;应用于发射模式下/*/#define FLUSH_TX 0 xE1 /冲洗发送 FIFO 指令/*1110 0001 清除 TX FIFO 寄存器,应用于发射模式下*/#define FLUSH_RX 0 xE2 /冲洗接收 FIFO 指令/*1110 0010 清除 RX FIFO 寄存器;应用于接收模式下.在传输应答信号过程中不应执行此 指令,也就是说若传 输应答信号过程中执行此指令的话,将使得应答信号不能被完整的传输*/#define REUSE_TX_PL 0 xE3 /定义重复装载数据指令/*1110 0011 重新使用上一包有效数据,当 CE 为高过程中数据包被不断的重新发射 在发射数据包过程中必须禁止数据包重利用功能*/#define NOP 0 xFF /保留/*1111 1111 空操作,可以用来读状态寄存器*/*SPI(nRF24L01)寄存器地址 *#define CONFIG 0 x00 /配置收发状态,CRC 校验模式以及收发状态响应方 式/*寄存器 位 复位值 类型 描述 reserved 7 0 R/W 默认为 0 MASK_RX_DR 6 0 R/W 可屏蔽中断RX_RD,1:IRQ引脚不显示RX_RD中 断;0:RX_RD 中断产生时 IRQ 引脚电平为低 MASK_TX_DS 5 0 R/W 可屏蔽中断 TX_DS,1:IRQ 引脚不显示 TX_DS 中 断;0:TX_DS 中断产生时 IRQ 引脚电平为低 MASK_MAX_RT 4 0 R/W 可屏蔽中断 MAX_RT,1:IRQ 引脚不显示 TX_DS中 断;0:MAX_RT 中断产生时 IRQ 引脚电平为低 EN_CRC 3 1 R/W CRC 使能.如果 EN_AA 中任意一位为高,则EN_CRC 强 迫为高 CRCO 2 0 R/W CRC 模式:0-8 位 CRC 校验;1-16 位 CRC 校验 PWR_UP 1 0 R/W 1:上电;0:掉电 PRIM_RX 0 0 R/W 1:接收模式 0:发射模式*/#define EN_AA 0 x01 /自动应答功能设置 此功能禁止后可与 nRF2401 通 讯/*位 7:6 保留(00)位 5:0(11 1111):数据通道 5-0 自动应答允许*/#define EN_RXADDR 0 x02 /可用信道设置 接收地址允许/*位 7:6 保留(00)位 5:0(00 0011):接收数据通道 5-0 允许*/#define SETUP_AW 0 x03 /收发地址宽度设置/*位 7:2 保留(0000 00)位 1:0(11):接收/发射地址宽度 00:无效;01:三字节;10:四字 节;11:五字节*/#define SETUP_RETR 0 x04 /自动重发功能设置/*位 7:4(0000)自动重发延时=(位 7:4)+1)*250+86us 延时时间是指一包数据发送完成到下一包数据开始发射之间的时间间隔 位 3:0(0011):自动重发计数 自动重发(位 3:0)次 例如复位值是自动重发 3 次*/#define RF_CH 0 x05 /工作频率设置/*位 7 保留(0)位 6:0(000 0010):设置 nRF24L01 工作通道频率*/#define RF_SETUP 0 x06 /射频寄存器/*位 7:5 保留(000)位 4(0):PLL_LOCK 允许;仅应用于测试模式 位 3(1):数据传输率:0 1Mbps 1 2 Mbps 位 2:1 保留(11)发射功率:00-18dBm 01-12dBm 10-6dBm 11 0dBm 位 0(1)低噪 声放大器增益*/#define STATUS 0 x07 /状态寄存器/*寄存器 位 复位值 类型 描述 Reserved 7 0 R/W 默认为 0 RX_DR 6 0 R/W 接收数据中断,当接收到有效数据后置一,写1 清除中断 TX_DS 5 0 R/W 数据发送完成中断,当数据发送完成后产生中断.如果工作在自动应 答模式下,只有当接收到应答信号后此位置一,写1清除中断 MAX_RT 4 0 R/W 达到最多次重发中断,写1清除中断 如果 MAX_RT 中断产生,则必须清除 后系统才能进行通讯 RX_P_NO 3:1 111 R 接收数据通道号 000-101:数据通道号 110:未 使用 111:RX FIFO 寄存器为空 TX_FULL 0 0 R TX_FIFO 寄存器满标志 1:TX FIFO 寄存器满 0:TX FIFO 寄存器未满,有可用空间*/#define OBSERVE_TX 0 x08 /发送监测功能/*寄存器 位 复位值 类型 描述 PLOS_CNT 7:4 0000 R 数据包丢失计数器,当写 RF_CH 寄存器时此寄存器 复位,当丢失 15 个数据包后此寄存器重启 ARC_CNT 3:0 0000 R 重发计数器,发送新数据包时此寄存器复位 */#define CD 0 x09 /地址检测 载波检测/*寄存器 位 复位值 类型 描述 Reserved 7:1 000000 R CD 0 0 R 载波检测 */#define RX_ADDR_P0 0 x0A /频道 0 接收数据地址/*寄存器 位 复位值 类型 描述 RX_ADDR_P0 39:0 0 xE7E7E7E7E7 R/W 数据通道0 接收地址最大长度5 个字节先写低字 节所写字节数量由 SETUP_AW 设定 */#define RX_ADDR_P1 0 x0B /频道 1 接收数据地址(0 xC2C2C2C2C2)#define RX_ADDR_P2 0 x0C /频道 2 接收数据地址(0 xC2C2C2C2C3)#define RX_ADDR_P3 0 x0D /频道 3 接收数据地址(0 xC2C2C2C2C4)#define RX_ADDR_P4 0 x0E /频道 4 接收数据地址(0 xC2C2C2C2C5)#define RX_ADDR_P5 0 x0F /频道 5 接收数据地址(0 xC2C2C2C2C6)#define TX_ADDR 0 x10 /发送地址寄存器 先写低字节,在增强型 ShockBurstTM 模式下 RX_ADDR_P0 与此地址相等#define RX_PW_P0 0 x11 /接收频道 0 接收数据长度 位 7:6 保留(00);(位 5:0)个字节有效数据宽度(00 0000)#define RX_PW_P1 0 x12 /接收频道 1 接收数据长度 同上#define RX_PW_P2 0 x13 /接收频道 2 接收数据长度 同上#define RX_PW_P3 0 x14 /接收频道 3 接收数据长度 同上#define RX_PW_P4 0 x15 /接收频道 4 接收数据长度 同上#define RX_PW_P5 0 x16 /接收频道 5 接收数据长度 同上#define FIFO_STATUS 0 x17 /FIFO 栈入栈出状态寄存器设置/*寄存器 位 复位值 类型 描述 Reserved 7 0 R/W 默认为 0 TX_REUSE 6 0 R 若TX_REUSE=1,则当CE位高电平状态时,不断发送 上一数据包 TX_REUSE 通过 SPI 指令 REUSE_TX_PL 设 置 通 过W_TX_PALOAD或FLUSH_TX 复位 TX_FULL 5 0 R TX FIFO 寄存器满标志 1:TX FIFO 寄存器满 0:TX FIFO 寄存器未满有可用空间 TX_EMPTY 4 1 R TX FIFO 寄存器空标志 1:TX FIFO 寄存器空 0:TX FIFO 寄存器非空 Reserved 3:2 00 R/W 墨认为 00 RX_FULL 1 0 R RX FIFO 寄存器满标志 1:RX FIFO 寄存器满 0:RX FIFO 寄存器未满有可用空间 RX_EMPTY 0 1 R RX FIFO 寄存器空标志 1:RX FIFO 寄存器空 0:RX FIFO 寄存器非空 */#endif/*/#include#includenrf24l01.h/#includeC_Ko.h#define uchar unsigned char#define uint unsigned int sbit led=P35;sbit key=P10;void main()/uchar i;uchar TxBuf32=0 x01,0 x02,0 x03,0 x4,0 x05,0 x06,0 x07,0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15,0 x16,0 x17,0 x18,0 x19,0 x20,0 x21,0 x22,0 x23,0 x24,0 x25,0 x26,0 x27,0 x28,0 x29,0 x30,0 x31,0 x32,;/UATR_Init();/串口初始化 init_NRF24L01();/nrf 初始化 /led=!led;while(1)if(!key)while(!key);if(nRF24L01_TxPacket(TxBuf)/Uatr_Prints(xCAxFD 据发送成功!tn);/数:CAFD led=!led;/*接收的程序在这里!http:/ */

    注意事项

    本文(Nrf24L01发送程序.pdf)为本站会员(g****s)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开