📄 nrf2401drive.c
字号:
/*********************************Copyright (c)*****************************
**
** 飞鹏电子工作室
** 嵌入式项目
** http://xpstudio2003.blog.163.com
**
**项目名称: xp51nRF2401
**编译环境: KEIL 2
**--------------------------------------------------------------------------
**文 件 名: nRF2401Drive.C
**作 者: 曹香鹏
**创建日期: 2008年12月18日
**描 述:
**--------------------------------------------------------------------------
**维护记录:
** 未优化程序.
****************************************************************************/
#include "xp51HDF.H"
#include "nRF2401Drive.H"
//引脚定义
sbit nRFPWR = P1^0;
sbit nRFCE = P1^1;
sbit nRFCS = P1^2;
sbit nRFDR1 = P1^3;
sbit nRFCLK1 = P1^4;
sbit nRFDATA = P1^5;
//从2401中,单字节读出,
INT8U nRFByteRead(void)
{
INT8U i;
INT8U RxDatTmp=0;
nRFDATA = 1;
for (i=0; i<8; i++)
{
nRFCLK1 = 1;
RxDatTmp <<= 1;
if(nRFDATA)
{
RxDatTmp |= 1;
}
nRFCLK1 = 0;
}
return RxDatTmp;
}
//写入单字节至2401
void nRFByteWrite(INT8U SendData)
{
INT8U i;
for (i=0; i<8; i++)
{
nRFCLK1=0;
if( SendData&0x80 ) //总是发送最高位
{
nRFDATA = 1;
}
else
{
nRFDATA = 0;
}
nRFCLK1=1;
SendData <<=1;
}
}
//2401的配置文件
INT8U nRFConf[15] =
{
//0x01,
//0x01,
//0x01,
0x08,//通道二接收数据宽度(bit)
0x08,//通道一接收数据宽度(bit)
0x00,//通道二地址(A24)
0x00,//通道二地址(A23)
0x00,//通道二地址(A22)
0x00,//通道二地址(A21)
0x01,//通道二地址(A20)
0x00,//通道一地址(A14)
0x00,//通道一地址(A13)
0x00,//通道一地址(A12)
0x00,//通道一地址(A11)
0x01,//通道一地址(A10)
0xA3,//b7~b2:接收地址宽度,和发送端一致,不超过40bit;
//b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no)
0x4F,//b15:接收通道选择(0-通道1;1-通道1和2)
//b14:收发模式(0-Direct模式,1-ShockBurst模式)
//b13:波特率选择(0-250Kbps;1-1Mbps)
//b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M)
//b9~b8:发射功率(11-0db)
0x04 //b7~b1:发射频率配置
//b0:收发控制(0-发送;1-接收)
};
//接收方通道硬件地址
INT8U nRFRxAddress[5]={ 0x00,
0x00,
0x00,
0x00,
0x02};
//初始化2401
void nRFInit()
{
INT8U i;
nRFCS = 0;
nRFCE = 0;
nRFPWR = 1; //上电,进入待机模式
for(i=0;i<10;i++)
{//从上电到进入配置模式需要3ms 的延时
Delay100();
}
//进入配置方式
nRFCS = 1;
Delay100();
for(i=0;i<15;i++)
{
nRFByteWrite(nRFConf[i]);
}
Delay100();
nRFCS = 0; //CS置低使配置有效
Delay100();
}
//使2401进入发送模式
void nRFSetTxMode(void)
{
//进入配置模式
nRFPWR = 1;
nRFCE = 0;
nRFCS = 1;
Delay100();
//配置寄存器0 字节RXEN 设置为0:发送模式
nRFCLK1 = 0;
nRFDATA = 0;
Delay100();
nRFCLK1 = 1;
Delay100();
//进入工作模式
nRFCS = 0;
nRFCE = 1;
Delay100();
}
//使2401进入接收模式
void nRFSetRxMode(void)
{
//设置为配置模式
nRFPWR = 1;
nRFCE = 0;
nRFCS = 1;
Delay100();
//配置寄存器0 字节RXEN 设置为 1:接收模式
nRFCLK1 = 0;
nRFDATA = 1;
Delay100();
nRFCLK1 = 1;
Delay100();
//进入工作模式
nRFCS = 0;
nRFCE = 1;
Delay100();
}
//nRF 数据发送函数
void nRFTxPacket(INT8U TxBuf[])
{
INT16U i;
nRFCE = 1;
Delay100();
//写入接收地址
for(i=0; i<5; i++)
{
nRFByteWrite(nRFRxAddress[i]);
}
//写入数据
for(i=0; i<1; i++)
{
nRFByteWrite(TxBuf[i]);
}
//CE 置低使2401发送数据
nRFCE = 0;
Delay100();
Delay100();
}
//-------------------------------------------------------
//检测并接收数据函数
//返回 0:没有数据接收
// 1:接收到数据
INT8U nRFRxPacket(INT8U *RxBuf)
{
INT16U i;
nRFDR1 = 1;
if(nRFDR1)
{
for (i=0; i<8; i++)
{
*RxBuf = nRFByteRead();
RxBuf++;
}
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -