#include "NRF24L01.H"
uchar idata nrf_sta;
uchar idata RxBuf[32] = "0"; //接收缓存 存入idata区
uchar idata TxBuf[32] = "0"; //发送缓存
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//===== 粗略的延时 =====
void delayus(uint us)
{
while(us--);
}
//================== NRF24L01初始化 ==================
void init_NRF24L01(void)
{
delayus(100);
CE = 0; // 片选使能
CSN = 1; // SPI使能
SCK = 0; // SPI时钟拉低
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //写接收端地址
SPI_Write_Reg(WRITE_REG + EN_AA, 0x01); //通道0自动应答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址频道0
SPI_Write_Reg(WRITE_REG + RF_CH, 0x32); //设置信道工作频率,收发必须一致
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c); //IRQ引脚不显示中断 掉电模式 1~16CRC校验
}
//==================
//读取状态标志
//==================
void get_nrf_sta(void)
{
nrf_sta = SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta);
}
//==================
//设置为接收模式
//==================
void nrf_RxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_RX,0x00); //清除RX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式 1~16CRC校验
CE = 1;
delayus(100);
}
//==================
//把接收到的数据存入数组
//==================
void nrf_read(uchar *rx_buf)
{
if(RX_DR == 1) //收到数据
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组
SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器
CE = 1;
delayus(100);
}
}
//==================
//设置为发送模式
//==================
void nrf_TxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_TX,0x00); //清除TX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e); //IRQ引脚不显示中断 上电 发射模式 1~16CRC校验
CE = 1;
delayus(100);
}
//==================
//发送 不做任何判断只管发送
//==================
void nrf_trans(uchar *tx_buf)
{
CE = 0; //StandBy I模式
SPI_Write_Reg(WRITE_REG+STATUS,0xFF); //清除所有中断
SPI_Write_Reg(FLUSH_TX,0x00); //清除tx fifo寄存器 //===== 重要 =====
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // 装载数据
CE = 1; //置高CE激发数据发送
delayus(100); //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us
}
//=========================
//将float数编码装载 保留4位小数
//占用5个字节 数据范围+- 65535.9999
//=========================
void nrf_load_float(uchar a,float num)
{
if(num > 0)
{
TxBuf[a] = '+';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else if(num < 0)
{
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else
{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
TxBuf[a+3] = 0;
TxBuf[a+4] = 0;
}
}
//=======================
//将接收到的float数组解码
//占用5个字节 数据范围+- 65535.9999
//=======================
float nrf_unload_float(uchar a)
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
//=======================
//将float数编码装载 保留2位小数
//占用3个字节 数据范围+- 255.99
//=======================
void nrf_load_sfloat(uchar a,float num)
{
if(num > 0){
TxBuf[a] = '+';
TxBuf[a+1] = (uchar)num; //转换成uchar类型,自动将保留低8位,去除高位。
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else if(num < 0){
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uchar)num;
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
}
}
//=======================
//将float数解码 保留2位小数
//占用3个字节 数据范围+- 255.99
//======================
float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
小车.zip (86个子文件)
发
NRF24L01测试程序【不区分收发 头文件版 C51】
NRF24L01_C5100.hex 8KB
NRF24L01_C51 27KB
main(1).OBJ 9KB
MCU.h 191B
NRF24L01_C51.hex 8KB
NRF24L01_C51(1) 27KB
NRF24L01_C5100 27KB
SPI.LST 4KB
NRF24L01.LST 10KB
SPI.h 551B
NRF24L01_C51.plg 2KB
SPI(1).OBJ 5KB
NRF24L01_C51_uvproj.bak 14KB
NRF24L01_C51(1).plg 1KB
NRF24L01_C5100.M51 24KB
NRF24L01_C51_uvopt(1).bak 55KB
NRF24L01(1).OBJ 16KB
NRF24L01.h 3KB
NRF24L01_C51(1).hex 8KB
NRF24L01_C51.uvgui.Administrator 138KB
NRF24L01_C51.uvopt 55KB
NRF24L01_C51.build_log.htm 896B
NRF24L01_C51.lnp 77B
NRF24L01.OBJ 16KB
SPI(1).h 551B
NRF24L01.c 5KB
NRF24L01(1).LST 10KB
NRF24L01_C51.uvgui_Administrator.bak 138KB
NRF24L01_C51(1).M51 24KB
SPI(1).LST 4KB
NRF24L01_C51(1).uvopt 55KB
SPI.c 2KB
NRF24L01_C51.M51 24KB
NRF24L01_C51_uvproj(1).bak 14KB
NRF24L01(1).h 3KB
main.LST 9KB
NRF24L01_C5100.plg 198B
main(1).c 4KB
NRF24L01_C51.uvproj 13KB
SPI.OBJ 5KB
main.OBJ 9KB
NRF24L01_C51_uvopt.bak 6KB
NRF24L01_C5100.lnp 79B
NRF24L01_C51.uvgui.A 72KB
main.c 4KB
main(1).LST 9KB
收
NRF24L01测试程序【不区分收发 头文件版 C51】
NRF24L01_C51 28KB
main(1).OBJ 9KB
MCU.h 191B
NRF24L01_C51.hex 8KB
NRF24L01_C51(1) 27KB
SPI.LST 4KB
NRF24L01.LST 10KB
SPI.h 551B
NRF24L01_C51.plg 198B
SPI(1).OBJ 5KB
NRF24L01_C51_uvproj.bak 14KB
NRF24L01_C51(1).plg 1KB
NRF24L01_C51_uvopt(1).bak 55KB
NRF24L01(1).OBJ 16KB
NRF24L01.h 3KB
NRF24L01_C51(1).hex 8KB
NRF24L01_C51.uvgui.Administrator 138KB
NRF24L01_C51.uvopt 58KB
NRF24L01_C51.build_log.htm 896B
NRF24L01_C51.lnp 77B
NRF24L01.OBJ 16KB
SPI(1).h 551B
NRF24L01.c 5KB
NRF24L01(1).LST 10KB
NRF24L01_C51.uvgui_Administrator.bak 138KB
NRF24L01_C51(1).M51 24KB
SPI(1).LST 4KB
NRF24L01_C51(1).uvopt 55KB
SPI.c 2KB
NRF24L01_C51.M51 25KB
NRF24L01_C51_uvproj(1).bak 14KB
NRF24L01(1).h 3KB
main.LST 11KB
main(1).c 4KB
NRF24L01_C51.uvproj 13KB
SPI.OBJ 5KB
main.OBJ 9KB
NRF24L01_C51_uvopt.bak 58KB
main.c 4KB
main(1).LST 9KB
共 86 条
- 1
资源评论
ZJX1996
- 粉丝: 7
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功