?? nrf2401.c
字號:
//====================================================================================
//文 件 名: nRF2401.c
//功能描述: nRF2401的驅動程序
//維護記錄: 2006年10月20
//====================================================================================
#include "spce061a.h"
#define PWR 0x0001 // IOB0
#define CE 0x0002 // IOB1
#define CS 0x0004 // IOB2
#define DR1 0x0008 // IOB3
#define CLK1 0x0010 // IOB4
#define DATA 0x0020 // IOB5
const unsigned int InitData[15] = // nRF2401 控制字 15 Byte
{
0x00, // 通道二接收數據寬度(bit)
0x08, // 通道一接收數據寬度(bit)
0x00, // 通道二地址(A24)
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x00, // 通道二地址(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)
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)
0x64 // 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(); // 延時(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;
}
//=============================================================
// 語法格式: void nRF2401_OFF(void)
// 實現功能: nRF 掉電
// 參數: 無
// 返回值: 無
//=============================================================
void nRF2401_OFF(void)
{
*P_IOB_Buffer &= ~PWR;
}
//=============================================================
// 語法格式: void nRF2401_WriteCommand(void)
// 實現功能: nRF 寫命令字
// 參數: 無
// 返回值: 無
//=============================================================
void nRF2401_WriteCommand(void)
{
unsigned int i;
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer |= CS;
Delay_Us(5);
for(i=0; i<15; i++)
{
nRF2401_WriteByte(InitData[i]);
}
*P_IOB_Buffer &= ~CS;
*P_IOB_Buffer |= CE;
}
//=============================================================
// 語法格式: void nRF2401_Mode(unsigned int uiMode)
// 實現功能: 設置nRF2401A的工作方式
// 參數: uiMode:0--接收;1--發送
// 返回值: 無
//=============================================================
void nRF2401_Mode(unsigned int uiMode)
{
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer |= CS;
if(uiMode == 0)
nRF2401_WriteByte(InitData[14] | 0x01); // 接收
else
nRF2401_WriteByte(InitData[14] & 0xFE); // 發送
*P_IOB_Buffer &= ~CS;
*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++)
{
*P_IOB_Buffer &= ~CLK1;
if(uiData&0x80)
*P_IOB_Buffer |= DATA;
else
*P_IOB_Buffer &= ~DATA;
Delay_Us(1);
*P_IOB_Buffer |= CLK1;
Delay_Us(1);
*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++)
{
*P_IOB_Buffer &= ~CLK1;
if(uiData&0x8000)
*P_IOB_Buffer |= DATA;
else
*P_IOB_Buffer &= ~DATA;
Delay_Us(1);
*P_IOB_Buffer |= CLK1;
Delay_Us(1);
*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;
*P_IOB_Buffer |= CE;
Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteByte(TxData);
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer &= ~DATA;
Delay_Us(200);
}
//=============================================================
// 語法格式: void nRF2401_SendWord(unsigned int TxData)
// 實現功能: 將目標地址+字數據寫入nRF2401A
// 參數: unsigned int TxData: 待發送字數據
// 返回值: 無
//=============================================================
void nRF2401_SendWord(unsigned int TxData)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
*P_IOB_Buffer |= CE;
Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteWord(TxData);
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer &= ~DATA;
Delay_Us(200);
}
//=============================================================
// 語法格式: 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;
*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]);
}
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer &= ~DATA;
Delay_Us(200);
}
//=============================================================
// 語法格式: 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;
*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]);
}
*P_IOB_Buffer &= ~CE;
*P_IOB_Buffer &= ~DATA;
Delay_Us(200);
}
//=============================================================
// 語法格式: unsigned int nRF2401_RxStatus()
// 實現功能: 判斷nRF2401A的接收狀態
// 參數: 無
// 返回值: 0: 沒有接收到數據
// 1: 已經接收到數據,等待讀出
//=============================================================
unsigned int nRF2401_RxStatus()
{
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(*P_IOB_Data&DR1)
{
dat <<= 1;
*P_IOB_Buffer &= ~CLK1;
if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
*P_IOB_Buffer |= CLK1;
Delay_Us(1);
if(i>7)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
*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;
*P_IOB_Dir &= ~DATA; // 輸入
while(*P_IOB_Data&DR1)
{
dat <<= 1;
*P_IOB_Buffer &= ~CLK1;
if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
*P_IOB_Buffer |= CLK1;
Delay_Us(1);
if(i>15)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
*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++)
{
*P_Watchdog_Clear = 0x0001;
}
}
//******************************** END *************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -