NRF24L01的发送和接收程序 1602 显示.doc_第1页
NRF24L01的发送和接收程序 1602 显示.doc_第2页
NRF24L01的发送和接收程序 1602 显示.doc_第3页
NRF24L01的发送和接收程序 1602 显示.doc_第4页
NRF24L01的发送和接收程序 1602 显示.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

发送:#include #include typedef unsigned char uchar;typedef unsigned char uint;/*NRF24L01端口定义*sbit CE=P20;sbit CSN=P25;sbitSCK =P21;sbitMOSI=P24;sbitMISO=P22;sbitIRQ=P23;#define TX_ADR_WIDTH 5 / 本机地址宽度设置#define RX_ADR_WIDTH 5 / 接收方地址宽度设置#define TX_PLOAD_WIDTH 20 / 4 字节数据长度#define RX_PLOAD_WIDTH 20/ 4 字节数据长度uchar code TX_ADDRESSTX_ADR_WIDTH = 0xb2,0xb2,0xb3,0xb4,0x01;uchar code RX_ADDRESSRX_ADR_WIDTH = 0xb2,0xb2,0xb3,0xb4,0x01;uchar RX_BUFRX_PLOAD_WIDTH;uchar TX_BUFTX_PLOAD_WIDTH=2,1,3;uchar flag,status;uchar DATA = 0x01;uchar bdata sta;sbit RX_DR = sta6;sbit TX_DS = sta5;sbit MAX_RT = sta4;/*NRF24L01*#define TX_ADR_WIDTH 5 / 本机地址宽度设置#define RX_ADR_WIDTH 5 / 接收方地址宽度设置#define TX_PLOAD_WIDTH 20 / 4 字节数据长度#define RX_PLOAD_WIDTH 20/ 4 字节数据长度/*NRF24L01寄存器指令,详细请对照,Page18*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址,详细请对照,Page18-24*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*NRF24L01函数申明*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void NRF24L01Int();void SetRX_Mode(void);void SetTX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*/*函数: init_io()描述: 初始化IO/*/void init_io(void)CE = 0; / 待机CSN = 1; / SPI禁止SCK = 0; / SPI时钟置低IRQ = 1; / 中断复位/*/*函数:delay_ms()描述: 延迟x毫秒/*/void delay_ms(uchar x) uchar i, j; i = 0; for(i=0; ix; i+) j = 250; while(-j); j = 250; while(-j); /*/*函数:SPI_RW()描述: 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节/*/uchar SPI_RW(uchar byte)uchar i; for(i=0; i8; 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; ibytes; i+) pBufi = SPI_RW(0); / 逐个字节从nRF24L01读出 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; ibytes; i+) SPI_RW(pBufi); / 逐个字节写入nRF24L01 CSN = 1; / CSN拉高,结束数据传输 return(status); / 返回状态寄存器/*/*函数:TX_Mode()描述: 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。/*/void TX_Mode(uchar * BUF)CE = 0; 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); / 为了应答接收设备,接收通道0地址和发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); / 写数据包到TX FIFO SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); / 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); / 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); / 自动重发延时等待250us+86us,自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH, 40); / 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / CRC使能,16位CRC校验,上电CE = 1;/*/*函数:Check_ACK()描述: 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发/*/uchar Check_ACK(bit clear)while(IRQ);sta = SPI_RW(NOP); / 返回状态寄存器if(MAX_RT)if(clear) / 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发SPI_RW(FLUSH_TX);SPI_RW_Reg(WRITE_REG + STATUS, sta); / 清除TX_DS或MAX_RT中断标志IRQ = 1;if(TX_DS)return(0x00);elsereturn(0xff);void main(void)init_io(); / 初始化IOwhile(1)TX_Mode(TX_BUF);/ 把nRF24L01设置为发送模式并发送数据Check_ACK(1); / 等待发送完毕,清除TX FIFOdelay_ms(250);delay_ms(250);接收#include #include typedef unsigned char uchar;typedef unsigned char uint;sbit lcdrs=P25;sbit lcdrw=P26;sbit lcden=P27;/*NRF24L01端口定义*sbit CE=P20;sbit CSN=P25;sbitSCK =P21;sbitMOSI=P24;sbitMISO=P22;sbitIRQ=P23;/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 20 / 20 uints TX payload#define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0xb2,0xb2,0xb3,0xb4,0x01;/本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0xb2,0xb2,0xb3,0xb4,0x01;/接收地址uchar RX_BUFRX_PLOAD_WIDTH;uchar TX_BUFTX_PLOAD_WIDTH;uchar flag,status;uchar DATA = 0x01;/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);void NRF24L01Int();uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);void SetTX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*uint bdata sta; /状态标志sbitRX_DR=sta6;sbitTX_DS=sta5;sbitMAX_RT=sta4;void delay1(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)lcdrs=0;lcden=0;P0=com;delay1(5);lcden=1;delay1(5);lcden=0;void write_data(uchar date)lcdrs=1;lcden=0;P0=date;delay1(5);lcden=1;delay1(5);lcden=0;void init() lcdrw=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);void write_sfm(uchar add,unsigned char* RxBuf)write_com(0x80+add);write_data(0x30+RxBuf0);write_data(0x30+RxBuf1);write_data(0x30+RxBuf2);/*/*函数: init_io()描述: 初始化IO/*/void init_io(void)CE = 0; / 待机CSN = 1; / SPI禁止SCK = 0; / SPI时钟置低IRQ = 1; / 中断复位/*/*函数:delay_ms()描述: 延迟x毫秒/*/void delay_ms(uchar x) uchar i, j; i = 0; for(i=0; ix; i+) j = 250; while(-j); j = 250; while(-j); /*/*函数:SPI_RW()描述: 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节/*/uchar SPI_RW(uchar byte)uchar i; for(i=0; i8; 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)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论