?? 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 + -