#include "nRF24L01.h"
const uint8_t TX_ADDRESS[TX_ADDR_WIDTH]={0xE1,0xE2,0xE3,0xE4,0xE5}; //发送地址
const uint8_t RX_ADDRESS[RX_ADDR_WIDTH]={0xE1,0xE2,0xE3,0xE4,0xE5}; //接收地址
uint8_t RxPayload[32]; //无线接收缓存
uint8_t TxPayload[32]; //无线发送缓存
/***************************************************************************
* 描 述 : 初始化SPI
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void InitSPI(void)
{
SPDAT = 0; //初始化SPI数据
SPSTAT = SPIF | WCOL; //清除SPI状态位
SPCTL = SPEN | MSTR | SSIG; //主机模式
}
/***************************************************************************
* 描 述 : 模拟SPI读写数据函数,读写一个字节
* 入 参 : 写入的数据
* 返回值 : 读取的数据
**************************************************************************/
uint8_t SPI_RW(uint8_t byte)
{
SPDAT = byte; //触发SPI发送数据
while (!(SPSTAT & SPIF)); //等待发送完成
SPSTAT = SPIF | WCOL; //清除SPI状态位
return SPDAT; //返回SPI数据
}
/***************************************************************************
* 描 述 : NRF24L01寄存器写函数
* 入 参 : regaddr:要写的寄存器地址;data:写入到寄存器的数据
* 返回值 : 读取的状态值
**************************************************************************/
uint8_t NRF24L01_MA_Write_Reg(uint8_t regaddr,uint8_t dat)
{
uint8_t status;
CS_MA_LOW;
status =SPI_RW(regaddr);
SPI_RW(dat); //写入寄存器的值
CS_MA_HIGH; //禁止SPI传输
return(status); //返回状态值
}
/***************************************************************************
* 描 述 : NRF24L01寄存器读函数
* 入 参 : regaddr:要读取的寄存器地址
* 返回值 : 读取的寄存器的值
**************************************************************************/
uint8_t NRF24L01_MA_Read_Reg(uint8_t regaddr)
{
uint8_t reg_val;
CS_MA_LOW; //使能SPI传输
SPI_RW(regaddr);
reg_val=SPI_RW(0XFF);
CS_MA_HIGH; //禁止SPI传输
return(reg_val); //返回读取的值
}
/***************************************************************************
* 描 述 : 从指定地址读出指定长度的数据
* 入 参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
* 返回值 : 读取的寄存器的值
**************************************************************************/
uint8_t NRF24L01_MA_Read_Buf(uint8_t regaddr,uint8_t *pBuf,uint8_t datlen)
{
uint8_t status,u8_ctr;
CS_MA_LOW; //使能SPI传输
status=SPI_RW(regaddr);
for(u8_ctr=0;u8_ctr<datlen;u8_ctr++)
{
pBuf[u8_ctr]=SPI_RW(0XFF);//读出数据
}
CS_MA_HIGH; //关闭SPI传输
CS_MA_HIGH; //关闭SPI传输
return status; //返回读到的状态值
}
/***************************************************************************
* 描 述 : 向指定地址写入指定长度的数据
* 入 参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
* 返回值 : 读取的状态寄存器值
**************************************************************************/
uint8_t NRF24L01_MA_Write_Buf(uint8_t regaddr, uint8_t *pBuf, uint8_t datalen)
{
uint8_t status,u8_ctr;
CS_MA_LOW; //使能SPI传输
status = SPI_RW(regaddr);
for(u8_ctr=0; u8_ctr<datalen; u8_ctr++)
{
SPI_RW(*pBuf++); //写入数据
}
CS_MA_HIGH; //关闭SPI传输
return status; //返回读到的状态值
}
/***************************************************************************
* 描 述 : 启动NRF24L01读取一次数据
* 入 参 : buf:待发送数据首地址
* 返回值 : RX_OK:接收到数据;0:未接收到数据
**************************************************************************/
uint8_t NRF24L01_RxPacket_MA(uint8_t *buf)
{
uint8_t state;
state=NRF24L01_MA_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
if(state&RX_OK) //接收到数据
{
NRF24L01_MA_Read_Buf(RD_RX_PLOAD,buf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_MA_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
return RX_OK;
}
return 0; //没收到任何数据
}
/***************************************************************************
* 描 述 : 启动NRF24L01发送一次数据
* 入 参 : buf:待发送数据首地址
* 返回值 : 发送完成状况
**************************************************************************/
uint8_t NRF24L01_TxPacket_MA(uint8_t *buf)
{
uint8_t state;
CE_MA_LOW;
NRF24L01_MA_Write_Buf(WR_TX_PLOAD,buf,TX_PLOAD_WIDTH); //写数据到TX BUF
CE_MA_HIGH; //启动发送
while(IRQ!=0); //等待发送完成
state=NRF24L01_MA_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
if(state&MAX_TX) //达到最大重发次数
{
NRF24L01_MA_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器
return MAX_TX;
}
if(state&TX_OK) //发送完成
{
return TX_OK;
}
return 0xff; //其他原因发送失败
}
/***************************************************************************
* 描 述 : 初始化NRF24L01到TX模式,配置相关参数
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void Set_TxMode_MA(void)
{
CE_MA_LOW;
//写TX节点地址
NRF24L01_MA_Write_Buf(SPI_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADDR_WIDTH);
//设置TX节点地址,主要为了使能ACK
NRF24L01_MA_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADDR_WIDTH);
//禁止通道0的自动应答
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+EN_AA,0x01);
//使能通道0的接收地址
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01);
//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+SETUP_RETR,0x21);
//设置RF通道为55
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+RF_CH,55);
//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x26);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,PRIM_RX发送模式,开启所有中断
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+CONFIG,0x0e);
}
/***************************************************************************
* 描 述 : 初始化NRF24L01到RX模式,配置相关参数,CE变高后,即进入RX模式
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void Set_RxMode_MA(void)
{
CE_MA_LOW;
// Delay_1ms(20);
//写RX节点地址
NRF24L01_MA_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADDR_WIDTH);
//禁止通道0的自动应答
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+EN_AA,0x01);
//使能通道0的接收地址
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01);
//设置RF通信频率
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+RF_CH,55);
//选择通道0的有效数据宽度
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x26);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,PRIM_RX接收模式
NRF24L01_MA_Write_Reg(SPI_WRITE_REG+CONFIG, 0x0f);
//CE为高,进入接收模式
CE_MA_HIGH;
}
/***************************************************************************
* 描 述 : NRF24L01初始化函数,初始化连接NRF24L01模块的管脚,调用SPI初始化函数
*
没有合适的资源?快使用搜索试试~ 我知道了~
基于STC8A8K64S4A12-LQFP44单片机nRF24L01 无线收发实验(双向通信-自动应答)实验软件例程源码
共39个文件
h:13个
c:11个
uvproj:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 31 浏览量
2023-05-24
16:21:15
上传
评论
收藏 283KB RAR 举报
温馨提示
基于STC8A8K64S4A12_LQFP44单片机nRF24L01 无线收发实验(双向通信_自动应答)实验软件例程源码+传感器资料 int main() { Init_NRF24L01_MA(); //初始化 Set_RxMode_MA(); //配置nRF24L01为接收模式 while(1) { if(NRF24L01_RxPacket_MA(RxPayload) == RX_OK) //如果接收成功 { if(RxPayload[0] == 0x5A) { RgbLed_Toggle(RGB_LED_RED); //NRF24L01模块状态指示灯翻转态指示灯翻转 RxPayload[0] = 0; delay_ms(10); RF_SendDat(); //发射数据 } } } } /*********************************END FILE*************
资源推荐
资源详情
资源评论
收起资源包目录
基于STC8A8K64S4A12_LQFP44单片机nRF24L01 无线收发实验(双向通信_自动应答)实验软件例程源码+传感器资料.rar (39个子文件)
RF-TXRX-PRx
inc
stdint.h 1KB
STC8.H 19KB
Lib
lcd.h 471B
lcd.c 1KB
nRF24L01.h 4KB
nRF24L01.c 8KB
led.h 361B
delay.h 163B
delay.c 386B
led.c 1008B
Project
lst
RF-TXRX-PRx.m51 19KB
Object
RF-TXRX-PRx.hex 2KB
RF-TXRX-PRx 90KB
RF-TXRX-PRx.uvgui.Admin 71KB
RF-TXRX-PRx.uvgui.Administrator 66KB
main.c 2KB
RF-TXRX-PRx.uvopt 7KB
RF-TXRX-PRx.uvproj 14KB
RF-TXRX-PTx
inc
stdint.h 1KB
STC8.H 19KB
Lib
key.c 655B
nRF24L01.h 4KB
nRF24L01.c 8KB
key.h 204B
led.h 360B
timer.c 3KB
delay.h 163B
timer.h 332B
delay.c 386B
led.c 1011B
Project
lst
RF-TXRX-PTx.m51 21KB
Object
RF-TXRX-PTx 108KB
RF-TXRX-PTx.hex 2KB
RF-TXRX-PTx.uvgui.Admin 71KB
RF-TXRX-PTx.uvopt 7KB
RF-TXRX-PTx.uvgui.Administrator 66KB
main.c 2KB
RF-TXRX-PTx.uvproj 14KB
STC8A8K64S4A12_LQFP44单片机开发板原理图.pdf 206KB
共 39 条
- 1
资源评论
- tomon0072024-05-10支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~
- 2402_840480422024-11-05资源很实用,内容详细,值得借鉴的内容很多,感谢分享。
GJZGRB
- 粉丝: 2931
- 资源: 7737
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功