📄 nrf2401_snd.c.bak
字号:
#include "reg51.h"
sbit PWR = P2^7;
sbit CE = P2^6;
sbit CS = P2^5;
sbit DR1 = P2^4;
sbit CLK1 = P2^3;
sbit DATA = P2^2;
const unsigned int 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)
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)
0x05 // b7~b1:发射频率配置
// b0:收发控制(0-发送;1-接收)
};
unsigned int AddrBuffer[5]; // 地址寄存器
unsigned int AddrByteCnt; // 地址Byte数
void nRF2401_ON(); // nRF2401A上电
void nRF2401_OFF(); // nRF2401A掉电
void nRF2401_Initial(); // nRF2401A初始化
void nRF2401_WriteCommand(); // nRF2401A写命令字
void nRF2401_WriteByte(unsigned int uiData); // 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData); // 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned int uiMode); // 切换nRF2401A收/发模式
void nRF2401_SendByte(unsigned int TxData);
// 将字节数据写入nRF2401A
void nRF2401_SendWord(unsigned int TxData);
// 将字数据写入nRF2401A
void nRF2401_SendBuffer_Byte(unsigned int TxData[],unsigned int DataByte);
// 将数组数据写入nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int DataWord);
// 将数组数据写入nRF2401A
unsigned int nRF2401_RxStatus(); // 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned int RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned int Address[],unsigned int AddrByte);
// 设置目标nRF2401A的地址
void Delay_Us(unsigned int TimeCnt); // 延时(uS)
//=============================================================
// 语法格式: void nRF2401_Initial(void)
// 实现功能: nRF 初始化
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_Initial(void)
{
/* *P_SystemClock = 0x98; // 设置系统时钟为49MHz
*P_IOB_Attrib |= (CS+DATA+PWR+CLK1+CE+DR1);
*P_IOB_Dir |= (CS+DATA+PWR+CLK1+CE);
*P_IOB_Dir&=~DR1;
*P_IOB_Buffer &=~(CS+DATA+CLK1+CE+DR1); // 初始化IO端口 */
nRF2401_ON();
Delay_Us(3000);
nRF2401_WriteCommand(); // 向nRF2401A写命令字
Delay_Us(300);
}
//=============================================================
// 语法格式: void nRF2401_ON(void)
// 实现功能: nRF 上电
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_ON(void)
{
/**P_IOB_Buffer |= PWR;*/
PWR = 1;
}
//=============================================================
// 语法格式: void nRF2401_OFF(void)
// 实现功能: nRF 掉电
// 参数: 无
// 返回值: 无
//=============================================================
//void nRF2401_OFF(void)
//{
// PWR = 0; //*P_IOB_Buffer &= ~PWR;
//}
//=============================================================
// 语法格式: void nRF2401_WriteCommand(void)
// 实现功能: nRF 写命令字
// 参数: 无
// 返回值: 无
//=============================================================
void nRF2401_WriteCommand(void)
{
unsigned int i;
CE= 0; //*P_IOB_Buffer &= ~CE;
CS = 1; //*P_IOB_Buffer |= CS;
//Delay_Us(1);
for(i=0; i<15; i++)
{
nRF2401_WriteByte(InitData[i]);
}
CS = 0; //*P_IOB_Buffer &= ~CS;
CE = 1; //*P_IOB_Buffer |= CE;
}
/*
//=============================================================
// 语法格式: void nRF2401_Mode(unsigned int uiMode)
// 实现功能: 设置nRF2401A的工作方式
// 参数: uiMode:0--接收;1--发送
// 返回值: 无
//=============================================================
void nRF2401_Mode(unsigned int uiMode)
{
CE = 0; //*P_IOB_Buffer &= ~CE;
CS = 1; //*P_IOB_Buffer |= CS;
if(uiMode == 0)
nRF2401_WriteByte(InitData[14] | 0x01); // 接收
else
nRF2401_WriteByte(InitData[14] & 0xFE); // 发送
CS = 0; //*P_IOB_Buffer &= ~CS;
CE = 1; //*P_IOB_Buffer |= CE;
}
//=============================================================
// 语法格式: void nRF2401_SetAddress(unsigned int *Address,unsigned int AddrByte)
// 实现功能: 设置目标nRF2401A的地址
// 参数: unsigned int *Address:地址数组
// unsigned int AddrByte:数组的长度
// 返回值: 无
//=============================================================
void nRF2401_SetAddress(unsigned int *Address,unsigned int 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 int uiData)
{
unsigned int i;
for(i=0; i<8; i++)
{
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(uiData&0x80)
DATA = 1; //*P_IOB_Buffer |= DATA;
else
DATA = 0; //*P_IOB_Buffer &= ~DATA;
//Delay_Us(1);
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
//Delay_Us(1);
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
uiData = uiData<<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; //*P_IOB_Buffer &= ~CLK1;
if(uiData&0x8000)
DATA = 1; //*P_IOB_Buffer |= DATA;
else
DATA = 0; //*P_IOB_Buffer &= ~DATA;
//Delay_Us(1);
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
Delay_Us(1);
CLK1 = 0; //*P_IOB_Buffer &=~CLK1;
uiData = uiData<<1;
}
}
//=============================================================
// 语法格式: void nRF2401_SendByte(unsigned int TxData)
// 实现功能: 将目标地址+字节数据写入nRF2401A
// 参数: unsigned int TxData: 待发送字节数据
// 返回值: 无
//=============================================================
void nRF2401_SendByte(unsigned int TxData)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
//Delay_Us(1); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteByte(TxData);
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(10);
}
//=============================================================
// 语法格式: void nRF2401_SendWord(unsigned int TxData)
// 实现功能: 将目标地址+字数据写入nRF2401A
// 参数: unsigned int TxData: 待发送字数据
// 返回值: 无
//=============================================================
void nRF2401_SendWord(unsigned int TxData)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
//Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteWord(TxData);
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
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 int *TxData,unsigned int DataByte)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
//Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataByte; i++)
{
nRF2401_WriteByte(TxData[i]);
}
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
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;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
//Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataWord; i++)
{
nRF2401_WriteWord(TxData[i]);
}
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(20);
}
*/
//=============================================================
// 语法格式: unsigned int nRF2401_RxStatus()
// 实现功能: 判断nRF2401A的接收状态
// 参数: 无
// 返回值: 0: 没有接收到数据
// 1: 已经接收到数据,等待读出
//=============================================================
unsigned int nRF2401_RxStatus()
{
if ( DR1 == 0 ) //if((*P_IOB_Data&DR1) == 0)
return(0);
else
return(1);
}
//=============================================================
// 语法格式: void nRF2401_ReceiveByte(unsigned int *RxData)
// 实现功能: 从nRF2401A读出一个字节的数据
// 参数: unsigned int *RxData:读出的数据
// 返回值: 无
//=============================================================
void nRF2401_ReceiveByte(unsigned int *RxData)
{
unsigned int i = 0,j = 0;
unsigned int dat = 0;
//*P_IOB_Dir &= ~DATA; // 输入
while(DR1==1) //while(*P_IOB_Data&DR1)
{
dat <<= 1;
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(DATA==1) //if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
//Delay_Us(1);
if(i>7)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
}
//*P_IOB_Dir |= DATA; // 输出
}
//=============================================================
// 语法格式: 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;
DATA = 0; //*P_IOB_Dir &= ~DATA; // 输入
while(DR1 == 1) //while(*P_IOB_Data&DR1)
{
dat <<= 1;
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(DATA==1) //if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
//Delay_Us(1);
if(i>15)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
}
//*P_IOB_Dir |= DATA; // 输出
}
*/
//=============================================================
// 语法格式: void Delay_Us(unsigned int TimeCnt)
// 实现功能: 延时(uS)
// 参数: unsigned int TimeCnt:延时的us数
// 返回值: 无
//=============================================================
void Delay_Us(unsigned int TimeCnt)
{
int i;
//*P_SystemClock = 0x98;
for(i = 0; i < TimeCnt; i++);
}
//******************************** END *************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -