📄 nrf2401_personal.h
字号:
#include "nRF2401.h"
#include "intrins.h"
extern void delayUS(uint t); //最终调试可能还会在延时时序上的调节
#define TX_ADDR 0x78563412 //发送有效地址
#define RX_ADDR 0x12345678 //自身接收有效地址,也用于由对方发送地址与次地址校验
#define TX_ADDR_4 0 //这样由于设置TX_Addr为4个字节,所以最高位直接简化为0,
//其实应该这样写 TX_Addr>>32
//发送地址的第5字节
#define TX_ADDR_3 TX_ADDR >> 24 //发送地址的第4字节
#define TX_ADDR_2 (TX_ADDR >> 16) & 0xff //发送地址的第3字节
#define TX_ADDR_1 (TX_ADDR >> 8) & 0xff //发送地址的第2字节
#define TX_ADDR_0 TX_ADDR & 0xff //发送地址的第1字节
#define RX_ADDR_4 0 //接收地址的第5字节,化简同TX_Addr4
#define RX_ADDR_3 RX_ADDR >> 24 //接收地址的第4字节
#define RX_ADDR_2 (RX_ADDR >> 16) & 0xff //接收地址的第3字节
#define RX_ADDR_1 (RX_ADDR >> 8) & 0xff //接收地址的第2字节
#define RX_ADDR_0 RX_ADDR & 0xff //接收地址的第1字节
#define RX_ADDR2 0 //通道2地址为0
#define SIZE 1 //最大数据包字节数
#define ADDRSIZE 4 //地址长度字节数,4个字节
#define ADDR_W (ADDRSIZE<<5) // 地址位数
// 4*2*2*2后,再左移2位,共移5位,节省CPU浮点运算时间
#define DATA1_W (SIZE<<3) // 通道1接收数据包长度(BITS),相当与SIZE*8
#define DATA2_W (SIZE<<3) // 通道2接收数据包长度(BITS),相当与SIZE*8
#define CRC_16BIT 2 //16位CRC
#define CRC_8BIT 0 //8位CRC
#define CRC_EN 1 //CRC使能
#define CRC16_EN 3 //CRC16位使能
#define CRC8_EN 1 //CRC8位使能
#define RX2EN_YES 128 //第2通道接受使能 单个字节的位7上
#define RX2EN_NO 0 //第2通道接收关闭
#define CM_SHOCK 64 //ShockBurst模式
#define CM_DIRECT 0 //Direct模式
#define RFDR_250K 0 //250KBPS数据速率
#define RFDR_1M 32 //1MBPS数据速率
#define XOF_4M 0 //使用4M晶振
#define XOF_8M 4 //使用8M晶振
#define XOF_12M 8 //使用12M晶振
#define XOF_16M 12 //使用16M晶振
#define XOF_20M 16 //使用20M晶振
#define RF_PWR_0 0 //输出功率-20dbm
#define RF_PWR_1 1 //输出功率-10dbm
#define RF_PWR_2 2 //输出功率-5dbm
#define RF_PWR_3 3 //输出功率0dbm
#define CH_NO 4 //频道编号
//发射工作频率=2400MHZ + CH_NO * 1MHZ
#define RF_CH (CH_NO<<1) //工作频率
#define RXEN_MODE 1 //接收模式
#define TXEN_MODE 0 //发射模式
uchar xdata TxBuf[SIZE], RxBuf[SIZE]; //发送和接收缓存
//----------------------------写1个字节---------------------------------//
//------MSB first 从高位开始,先输出数据,再产生满足最小时延的CLK1-----//
void nRF2401_WR(uchar val)
{
uchar dat,i;
CLK1_CLR();
dat=val;
for(i=0;i<8;i++)
{
if((dat&0x80)>0)
DATA_SET();
else
DATA_CLR();
// delayUS(1); // Ts--min 500ns
CLK1_SET(); // CLK-UP
// delayUS(1); //
_nop_(); // Th--min 500ns
CLK1_CLR(); // CLK-DOWN
dat<<=1;
}
}
//-------------------------读一个字节-----------------------------//
//----MSB first 从高位开始,先读数据,再产生满足最小时延的CLK1---//
uchar nRF2401_RD(void)
{
uchar dat=0,i;
CLK1_CLR();
for(i=0;i<8;i++)
{
dat<<=1; //数据左移 , 共7次移位 ,第一次为空移
if(DATA)
dat|= 0x01; //8次从最低位写入
CLK1_SET(); //从循环判断到此,16M晶振肯定满足Td > 50ns
// delayUS(1); //
_nop_(); // RX Th(min)=500ns
CLK1_CLR(); //使下一个位最多在50ns后输出
}
return(dat);
}
//------切换到接收模式------//
void nRF2401_RXMODE(void)
{
nRF2401_CFG(); //进入配置模式
// nRF2401_WR(RF_CH|RXEN_MODE); //写RXEN = 1 //原先的写8位
//----------现修改成写一位-----------//
CLK1_CLR();
DATA_SET(); //DATA =1
CLK1_SET();
// delayUS(1);
_nop_();
CLK1_CLR();
//-----------------------------------//
nRF2401_Run(); //工作到收发模式
}
//------切换到发射模式------//
void nRF2401_TXMODE(void)
{
nRF2401_CFG(); //进入配置模式
// nRF2401_WR(RF_CH); //写RXEN = 0 //原先的写8位
//----------现修改成写一位-----------//
CLK1_CLR();
DATA_CLR(); //DATA =0
CLK1_SET();
// delayUS(1);
_nop_();
CLK1_CLR();
//-----------------------------------//
nRF2401_Run(); //工作到收发模式
}
//------nRF2401的配置函数-----//
void nRF2401_Config(void)
{
nRF2401_CFG();
nRF2401_WR(DATA2_W);
nRF2401_WR(DATA1_W);
nRF2401_WR(RX_ADDR2); // 0 //通道2接收地址
nRF2401_WR(RX_ADDR2); // 0
nRF2401_WR(RX_ADDR2); // 0
nRF2401_WR(RX_ADDR2); // 0
nRF2401_WR(RX_ADDR2); // 0
nRF2401_WR(RX_ADDR_4); // 通道1接收地址
nRF2401_WR(RX_ADDR_3);
nRF2401_WR(RX_ADDR_2);
nRF2401_WR(RX_ADDR_1);
nRF2401_WR(RX_ADDR_0);
nRF2401_WR(ADDR_W|CRC16_EN); //地址宽度和CRC配置
nRF2401_WR(RX2EN_NO|CM_SHOCK|RFDR_250K|XOF_16M|RF_PWR_0); // 器件一般设置
nRF2401_WR(RF_CH|RXEN_MODE);
nRF2401_StandBy(); //写入配置字后,进入空闲模式
}
//----------------------nRF2401初始化函数---------------------//
void nRF2401_Inti(void)
{
CLK1_CLR(); //CLK1 = 0
DATA_CLR(); //DATA = 0
nRF2401_StandBy(); //PWR_UP = 0
//CS = 0
//CE = 0
nRF2401_Config(); //配置nRF2401
nRF2401_RXMODE(); //设置到接收模式
}
//----------------设置nRF2401对方接收的发射地址--------------//
void nRF2401_SetTXAddr(void)
{
nRF2401_WR(TX_ADDR_3); //这里假设对方接收地址宽度为4个字节
nRF2401_WR(TX_ADDR_2);
nRF2401_WR(TX_ADDR_1);
nRF2401_WR(TX_ADDR_0);
}
//----------------设置nRF2401对方接收的发送数据--------------//
void nRF2401_SetTXData(void)
{
uchar i;
for(i=0;i<SIZE;i++)
nRF2401_WR(TxBuf[i]);
}
//-----------------nRF2401发射数据---------------------------//
void nRF2401_SendData(void)
{
nRF2401_TXMODE(); //进入或切换到发射模式
CE_SET(); // CE = 1
_nop_();
nRF2401_SetTXAddr(); //写发送地址
nRF2401_SetTXData(); //写发送数据
CE_CLR(); //启动发射
delayUS(1); //11us
nRF2401_StandBy(); //进入空闲模式,节省功率
}
//--------------------MCU读数据-----------------------------//
void nRF2401_ReadData(void)
{
uchar i;
for(i=0;i<SIZE;i++)
RxBuf[i]=nRF2401_RD();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -