📄 nrf2401.c
字号:
//====================================================================================
//文 件 名: nRF2401.c
//功能描述: nRF2401的驱动程序
//维护记录: 2008年10月26
//====================================================================================
#include <string.h>
#include <AT89X52.h>
#include <intrins.h>
#include "nRF2401.H"
sbit PWR = P0^0;
sbit CE = P0^1;
sbit CS = P0^2;
sbit DR1 = P0^3;
sbit CLK1 = P0^4;
sbit DATA = P0^5;
sbit cs_test = P0^6;
const unsigned char InitData[15] = // nRF2401 控制字 15 Byte
{
0x08, // 通道二接收数据宽度(bit)
0x08, // 通道一接收数据宽度(bit)
0x00, // 通道二地址(A24)
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x01, // 通道二地址(A20)
0x00, // 通道一地址(A14)
0x00, // 通道一地址(A13)
0x00, // 通道一地址(A12)
0x00, // 通道一地址(A11)
0x01, // 通道一地址(A10)
0x83, // b7~b2:接收地址宽度,和发送端一致,不超过40bit;
// b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no)
0x6f, // 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)
0x65 // b7~b1:发射频率配置
// b0:收发控制(0-发送;1-接收)
};
unsigned char AddrBuffer[5]; // 地址寄存器
unsigned char AddrByteCnt; // 地址Byte数
/******************************************************************************
void nRF2401_ON(); // nRF2401A上电
void nRF2401_OFF(); // nRF2401A掉电
void nRF2401_Initial(); // nRF2401A初始化
void nRF2401_WriteCommand(); // nRF2401A写命令字
void nRF2401_WriteByte(unsigned char uiData); // 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData); // 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned char uiMode); // 切换nRF2401A收/发模式
void nRF2401_SendByte(unsigned char TxData);
// 将字节数据写入nRF2401A
void nRF2401_SendWord(unsigned int TxData);
// 将字数据写入nRF2401A
void nRF2401_SendBuffer_Byte(unsigned char TxData[],unsigned char DataByte);
// 将数组数据写入nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int DataWord);
// 将数组数据写入nRF2401A
unsigned int nRF2401_RxStatus(); // 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned char RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned char Address[],unsigned char AddrByte);
// 设置目标nRF2401A的地址
void Delay_Us(unsigned int TimeCnt); // 延时(uS)
void nRF2401_Str(unsigned char *arr);
*******************************************************************************/
//=============================================================
// 语法格式: void nRF2401_Initial(void)
// 实现功能: nRF 初始化
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_Initial(void)
{
PWR=0;
CE=0;
CS=0;
DR1=0;
CLK1=0;
DATA=0;
cs_test=1;
nRF2401_ON();
Delay_Us(3000);
nRF2401_WriteCommand(); // 向nRF2401A写命令字
Delay_Us(300);
}
//=============================================================
// 语法格式: void nRF2401_ON(void)
// 实现功能: nRF 上电
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_ON(void)
{
PWR=1;
}
//=============================================================
// 语法格式: void nRF2401_OFF(void)
// 实现功能: nRF 掉电
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_OFF(void)
{
PWR=0;
}
//=============================================================
// 语法格式: void nRF2401_WriteCommand(void)
// 实现功能: nRF 写命令字
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_WriteCommand(void)
{
unsigned int i;
CE=0;
CS=1;
Delay_Us(5);
for(i=0; i<15; i++)
{
nRF2401_WriteByte(InitData[i]);
}
CS=0;
CE=1;
}
//=============================================================
// 语法格式: void nRF2401_Mode(unsigned int uiMode)
// 实现功能: 设置nRF2401A的工作方式
// 参数: uiMode:0--接收;1--发送
// 返回值: 无
//=============================================================
void nRF2401_Mode(unsigned char uiMode)
{
CE=0;
CS=1;
if(uiMode == 0)
nRF2401_WriteByte(InitData[14] | 0x01); // 接收
else
nRF2401_WriteByte(InitData[14] & 0xFE); // 发送
CS=0;
CE=1;
}
//=============================================================
// 语法格式: void nRF2401_SetAddress(unsigned int *Address,unsigned int AddrByte)
// 实现功能: 设置目标nRF2401A的地址
// 参数: unsigned int *Address:地址数组
// unsigned int AddrByte:数组的长度
// 返回值: 无
//=============================================================
void nRF2401_SetAddress(unsigned char *Address,unsigned char AddrByte)
{
unsigned int i;
for(i=0; i<AddrByte; i++)
{
AddrBuffer[i] = Address[i];
}
AddrByteCnt = AddrByte;
}
//=============================================================
// 语法格式: void nRF2401_WriteByte(unsigned int uiData)
// 实现功能: 向nRF2401A写入一个字节数据
// 参数: unsigned int uiData: 待写入数据
// 返回值: 无
//=============================================================
void nRF2401_WriteByte(unsigned char uiData)
{
unsigned int i;
cs_test=0;
for(i=0; i<8; i++)
{
CLK1=0;
if(uiData&0x80)
DATA=1;
else
DATA=0;
CLK1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLK1=0;
uiData = uiData<<1;
}
cs_test=1;
}
//=============================================================
// 语法格式: void nRF2401_WriteWord(unsigned int uiData)
// 实现功能: 向nRF2401A写入一个字数据
// 参数: unsigned int uiData: 待写入数据
// 返回值: 无
//=============================================================
void nRF2401_WriteWord(unsigned int uiData)
{
unsigned int i;
for(i=0; i<16; i++)
{
CLK1=0;
if(uiData&0x8000)
DATA=1;
else
DATA=0;
CLK1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLK1=0;
uiData = uiData<<1;
}
}
//=============================================================
// 语法格式: void nRF2401_SendByte(unsigned int TxData)
// 实现功能: 将目标地址+字节数据写入nRF2401A
// 参数: unsigned int TxData: 待发送字节数据
// 返回值: 无
//=============================================================
void nRF2401_SendByte(unsigned char TxData)
{
unsigned int i;
CE=1;
Delay_Us(1);
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteByte(TxData);
CE=0;
DATA=0;
Delay_Us(10);
}
void nRF2401_Str(unsigned char *arr)
{
unsigned char i;
i = 0;
while(arr[i] != '\0')
{
nRF2401_SendByte(arr[i]);
i++;
}
}
//=============================================================
// 语法格式: void nRF2401_SendWord(unsigned int TxData)
// 实现功能: 将目标地址+字数据写入nRF2401A
// 参数: unsigned int TxData: 待发送字数据
// 返回值: 无
//=============================================================
void nRF2401_SendWord(unsigned int TxData)
{
unsigned int i;
CE=1;
Delay_Us(1);
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteWord(TxData);
CE=0;
DATA=0;
Delay_Us(20);
}
//=============================================================
// 语法格式: void nRF2401_SendBuffer_Byte(unsigned int *TxData,unsigned int DataByte)
// 实现功能: 向nRF2401A发送一个数组的数据(字节方式)
// 参数: unsigned int *TxData: 待发送数组
// unsigned int DataByte:数组的长度
// 返回值: 无
//=============================================================
void nRF2401_SendBuffer_Byte(unsigned char *TxData,unsigned char DataByte)
{
unsigned int i;
CE=1;
Delay_Us(1);
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataByte; i++)
{
nRF2401_WriteByte(TxData[i]);
}
CE=0;
DATA=0;
Delay_Us(20);
}
//=============================================================
// 语法格式: void nRF2401_SendBuffer_Word(unsigned int *TxData,unsigned int DataWord)
// 实现功能: 向nRF2401A发送一个数组的数据(字方式)
// 参数: unsigned int *TxData: 待发送数组
// unsigned int DataWord:数组的长度
// 返回值: 无
//=============================================================
void nRF2401_SendBuffer_Word(unsigned int *TxData,unsigned int DataWord)
{
unsigned int i;
CE=1;
Delay_Us(1); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataWord; i++)
{
nRF2401_WriteWord(TxData[i]);
}
CE=0;
DATA=0;
Delay_Us(20);
}
//=============================================================
// 语法格式: unsigned int nRF2401_RxStatus()
// 实现功能: 判断nRF2401A的接收状态
// 参数: 无
// 返回值: 0: 没有接收到数据
// 1: 已经接收到数据,等待读出
//=============================================================
unsigned char nRF2401_RxStatus()
{
if(DR1==0)
return(0);
else
return(1);
}
//=============================================================
// 语法格式: void nRF2401_ReceiveByte(unsigned int *RxData)
// 实现功能: 从nRF2401A读出一个字节的数据
// 参数: unsigned int *RxData:读出的数据
// 返回值: 无
//=============================================================
void nRF2401_ReceiveByte(unsigned char *RxData)
{
unsigned char i = 0,j = 0;
unsigned char dat = 0;
while(DR1)
{
dat <<= 1;
CLK1=1;
_nop_();
_nop_();
if(DATA)
dat |= 0x01;
i++;
CLK1=0;
if(i>7)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
}
DATA=1;
}
//=============================================================
// 语法格式: void nRF2401_ReceiveWord(unsigned int *RxData)
// 实现功能: 从nRF2401A读出一个字的数据
// 参数: unsigned int *RxData:读出的数据
// 返回值: 无
//=============================================================
void nRF2401_ReceiveWord(unsigned int *RxData)
{
unsigned int i = 0,j = 0;
unsigned int dat = 0;
while(DR1)
{
dat <<= 1;
CLK1=1;
_nop_();
_nop_();
if(DATA)
dat |= 0x01;
i++;
CLK1=0;
if(i>15)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
}
DATA=1;
}
//=============================================================
// 语法格式: void Delay_Us(unsigned int TimeCnt)
// 实现功能: 延时(uS)
// 参数: unsigned int TimeCnt:延时的us数
// 返回值: 无
//=============================================================
void Delay_Us(unsigned int TimeCnt)
{
int i;
for(i = 0; i < TimeCnt; i++)
{
_nop_();
}
}
//******************************** END *************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -