Nrf24L01发送程序Word下载.docx
- 文档编号:6817504
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:24
- 大小:21.68KB
Nrf24L01发送程序Word下载.docx
《Nrf24L01发送程序Word下载.docx》由会员分享,可在线阅读,更多相关《Nrf24L01发送程序Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
道4地址
//ucharcodeRX_ADDRESS_5[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
道5地址
bitRX_OK=0;
//接收数据完成标志,在中断中置位
bitTX_OK=1;
//数据发送完毕标志,在中断置位由于第一次要可以发送所以
初值为1
bitMAX_RT_OK=0;
//发送次数超过设置的次数的标志在中断置位
ucharbdatasta=0x00;
//状态标志
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
/************************************以下是SPI的读写函数
*********************************************/
/***************************************************************************
*************************
/*函数:
ucharSPI_RW(uchardate)
/*功能:
SPI一个字节写时序
*************************/
ucharSPI_RW(ucharbyte)
{
uchari;
SCK=0;
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);
//返回读出的一字节
}
ucharSPI_Read(ucharreg)
SPI从reg中读出一个字节时序
ucharreg_val;
CSN=0;
//CSN置低,开始传输数据
SPI_RW(reg);
//选择寄存器
reg_val=SPI_RW(0);
//然后从该寄存器读数据
CSN=1;
//CSN拉高,结束数据传输
return(reg_val);
//返回寄存器数据
SPI在reg中写入数据value函数
voidSPI_RW_Reg(ucharreg,ucharvalue)
//选择寄存器,同时返回状态字
SPI_RW(value);
//然后写数据到该寄存器
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)
/*功能:
用于SPI连读数据,reg:
为寄存器地址,pBuf:
为待读出数据地址,uchars:
读出数据的个数
voidSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbytes)
bytes;
i++)
pBuf[i]=SPI_RW(0);
//逐个字节从nRF24L01读出
******************************
ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
用于SPI连写数据:
为待写入数据地址,uchars:
写入
数据的个数
******************************/
voidSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbytes)
SPI_RW(pBuf[i]);
//逐个字节写入nRF24L01
/*************************以下是nrf24l01的应用层函数
*******************************************/
voidnrf_delay()
uinta=130*10;
while(a--);
NRF24L01初始化
/**************************************************************************/
voidinit_NRF24L01(void)
CE=0;
//待机
//SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
//配置寄存器设置为接收模式
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
//通道0自动ACK应答允许
0x01
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
//允许接收地址只有通道0,
如果需要多频道可以参考Page210x01
//SPI_RW_Reg(WRITE_REG+SETUP_AW,0x03);
//收发地址宽度设置为5个字节
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x0a);
//等待250+86us重发10次
SPI_RW_Reg(WRITE_REG+RF_CH,0);
//设置信道工作为2.4GHZ,
收发必须一致
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
//设置发射速率为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时是接收模式*/
voidSet_Mode(charb)
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e+b);
//IRQ收发完
成中断响应,16位CRC,主接收
CE=1;
//模式转换要等待
130Us
nrf_delay();
********************************
bitnRF24L01_TxPacket(unsignedchar*tx_buf)
发送tx_buf中数据返回1数据发送
*******************************/
bitnRF24L01_TxPacket(uchar*tx_buf)
bitval=0;
if(TX_OK)
{
TX_OK=0;
//StandByI模式
SPI_RW_Reg(WRITE_REG+STATUS,sta);
//发送完数据后
RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
//CSN=0;
//SPI_RW(FLUSH_TX);
//数据成功发送到了接收端,此时状态寄存器的TX_DS位置
高并把数据从TXFIFO中清除掉
//所以这里就不要再清除TX
FIFO了
//CSN=1;
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
//装载
数据
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
//IRQ收发完成中断响应,16位CRC,主发送
CE=1;
//置高CE,激发数据发送
val=1;
}
elseif(MAX_RT_OK)
{
MAX_RT_OK=0;
SPI_RW(FLUSH_TX);
//MAX_RT位置高,不清除TXFIFO中的数据所以这里要
清除TXFIFO
CSN=1;
TX_OK=1;
returnval;
***************************/
bitnRF24L01_RxPacket(uchar*rx_buf)
数据读取后放如rx_buf接收缓冲区中
bitnRF24L01_RxPacket(uchar*rx_buf)
bitrevale=0;
if(RX_OK)//判断是否接收到数据
{
RX_OK=0;
//接收数据标志清零
CE=0;
//SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
//read
receivepayloadfromRX_FIFObuffer
//接收到数据后RX_DR,TX_DS,MAX_PT
都置高为1,通过写1来清楚中断标志
SPI_RW(FLUSH_RX);
//用于清空FIFO!
!
revale=1;
//读取数据完成标志
Set_Mode
(1);
//重新设置为接收模式
returnrevale;
}
/*NRF24L01IRQ引脚产生的中断函数*/
voidInt_1()interrupt2
sta=SPI_Read(STATUS);
//读取状态寄存其来判断数据接收状况
if(RX_DR)//接收到数据了
RX_OK=1;
if(TX_DS)//数据发送完毕
if(MAX_RT)
MAX_RT_OK=1;
/*************************************/
NRF24L01.h
#ifndef__NRF24L01_H__
#define__NRF24L01_H__
#include<
REG52.H>
#defineuintunsignedint
#defineucharunsignedchar
//********************SPI引脚号********************************
sbitMISO=P1^6;
//7主入从出
sbitSCK=P1^7;
//5SPI时钟由主机产生
sbitCSN=P3^7;
//4SPI使能为1时SPI禁止
sbitMOSI=P1^5;
//6主出从入
//********************NRF24L01引脚*********************
sbitCE=P3^6;
sbitIRQ=P3^3;
//中断引脚
#defineTX_PLOAD_WIDTH32//发送字节数在这里设置发送和接收
要一样
#defineRX_PLOAD_WIDTH32//接收字节数在这里设置
voidinit_NRF24L01(void);
//NRF24L01初始化已经中断初始化了
voidSet_Mode(charb);
///*设置模式:
b为0时是发送模式为1时是接收模式*/
bitnRF24L01_TxPacket(uchar*tx_buf);
//发送tx_buf中数据返回1数据发送
bitnRF24L01_RxPacket(uchar*rx_buf);
//返回1时数据读取后放如rx_buf接收缓冲
区中否则没有数据
#defineTX_ADR_WIDTH5//5uintsTXaddresswidth
#defineRX_ADR_WIDTH5//5uintsRXaddresswidth
//***************************************NRF24L01寄存器指令
**********************************
#defineREAD_REG0x00//读寄存器指令
/**************************************************
000AAAAA读配置寄存器;
AAAAA指出读操作的寄存器地址
**************************************************/
#defineWRITE_REG0x20//写寄存器指令
*****************
001AAAAA写配置寄存器;
AAAAA指出写操作的寄存器地址只有在掉电模式和待机模式
下可操作
****************************************************************************
*****************/
#defineRD_RX_PLOAD0x61//读取接收数据指令
01100001读RX有效数据;
1-32字节,读操作全部从字节0开始,当读RX有效数据完成后
FIFO寄存器中有效数
据被清除;
应用于接收模式下
#defineWR_TX_PLOAD0xA0//写待发数据指令
******************
10100000写TX有效数据,1-32字节写操作,从字节0开始;
应用于发射模式下
******************/
#defineFLUSH_TX0xE1//冲洗发送FIFO指令
11100001清除TXFIFO寄存器,应用于发射模式下
#defineFLUSH_RX0xE2//冲洗接收FIFO指令
/********************************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Nrf24L01 发送 程序