?? nrf905.c
字號:
/****************************************************************************
* 文 件 名:nRF905.c
* 功 能:nRF905的接收與發送
* 說 明:包含發送與接收的所有函數。
* 作 者:TANK
* 郵 箱:tank3221@sina.com
* 完成時間:2007年5月25日
****************************************************************************/
#include "config.h"
/*--------------------------------------------------
引腳連接預定義區
---------------------------------------------------*/
#define PWR 1<<16 // P1.16 掉電控制
#define EN 1<<17 // P1.17 收發選擇
#define CE 1<<18 // P1.18 收發啟動
#define TEST1 1<<19 // P1.19 測試引腳1
#define TEST2 1<<20 // P1.20 測試引腳2
#define CD 0<<23 // P0.23 載波檢測
#define AM 0<<25 // P0.25 地址匹配
#define DR 0<<24 // P0.24 數據完畢
#define RD 1<<24 // P0.24 ready信號。
#define CSN 1<<20 // P0.20 從機片選
/****************************************************************************
* 名 稱:Delay()
* 功 能:短軟件延時
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void Delay(uint32 dly)
{
for(; dly>0; dly--);
}
/****************************************************************************
* 名 稱:nRF905_init()
* 功 能:905各控制、信號線引腳初始化
* 入口參數:無
* 出口參數:無
****************************************************************************/
void nRF905_init(void)
{
PINSEL0 |= 0x00000005; // 設置I/O連接到UART0
PINSEL1 = 0x00000000;
IO0DIR = CSN | // CSN <--> P0.20 片選輸出線
CD | // CD <--> P0.23 CD 信號線
AM | // AM <--> P0.24 AM 信號線
DR ; // DR <--> P0.25 DR 信號線
IO1DIR = PWR | // PWR 控制線
CE | // CE 控制線
EN | // EN 控制線
TEST1 | // test1 測試線
TEST2 ; // test2 測試線
}
/*----------------------------------------------------------------------------
初始化函數
包括 SpiInit() SPI接口初始化及連接設置
Init() LPC2200 引腳方向初始化
SendData() SPI發送接收數據函數
-----------------------------------------------------------------------------*/
/****************************************************************************
* 名 稱:SpiInit()
* 功 能:初始化SPI接口,設置為主機。
* 入口參數:無
* 出口參數:無
* 說 明:傳輸格式必須對照905的SPI總線傳輸方式設置
****************************************************************************/
void SpiInit(void)
{
PINSEL0 |= 0x00005500;
S0PCCR = 0x52; // 設置SPI時鐘分頻
S0PCR = (0 << 3) | // CPHA = 0, 數據在SCK 的第一個時鐘沿采樣
(0 << 4) | // CPOL = 1, SCK 為低有效
(1 << 5) | // MSTR = 1, SPI 處于主模式
(0 << 6) | // LSBF = 0, SPI 數據傳輸MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中斷被禁止
}
/****************************************************************************
* 名 稱:Magic905_Init(void)
* 功 能:SPI初始化、905各引腳初始化
* 入口參數:無
* 出口參數:無
****************************************************************************/
void Magic905_Init(void)
{
SpiInit();
nRF905_init();
}
/****************************************************************************
* 名 稱:SendData()
* 功 能:向SPI總線“發送”或“接收”數據,并接收從機發回的數據。
* 入口參數:data 待發送的數據
* 出口參數:返回值為接收到的數據
****************************************************************************/
uint8 SendData(uint8 data)
{
S0PDR = data;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待數據發送完畢
return(S0PDR);
}
/*----------------------------------------------------------------------------
nRF905狀態改變函數
包括 OFFMode 掉電模式
WaitMode 等待模式
TxMode 發送模式
RxMode 接收模式
-----------------------------------------------------------------------------*/
/****************************************************************************
* 名 稱:OFFMode()
* 功 能:關機/掉電模式 PWR=0 時,nRF905處于掉電模式
* 入 口:無
* 出 口:無
****************************************************************************/
void OFFMode(void)
{
IO1CLR = PWR ; // PWR = 0
Delay(1);
}
/****************************************************************************
* 名 稱:WaitMode() 空閑/等待模式 10X
* 功 能:空閑等待電模式 PWR=1,CE=0 時,nRF905處于空閑等待模式
* 入 口:無
* 出 口:無
****************************************************************************/
void WaitMode(void)
{
IO1SET = PWR ; // PWR = 1
IO1CLR = CE ; // CE = 0
Delay(1);
}
/****************************************************************************
* 名 稱:RxMode() 射頻接收模式 110
* 功 能:接收模式 PWR=1,CE=1,EN=0 時,nRF905處于接收模式
* 入 口:無
* 出 口:無
****************************************************************************/
void RxMode(void)
{
IO1SET = ( PWR | CE ); // PWR=1 CE=1
IO1CLR = EN ; // EN=0
Delay(1);
}
/****************************************************************************
* 名 稱:TxMode() 射頻發送模式 111
* 功 能:發送模式 PWR=1,CE=1,EN=1 時,nRF905處于發射模式
* 入 口:無
* 出 口:無
****************************************************************************/
void TxMode(void)
{
IO1SET = ( PWR | EN | CE ); // PWR=1,CE=1,EN=1
Delay(1);
}
/****************************************************************************
* 名 稱:nRFconfig() 射頻配置函數 命令 00H
* 功 能:通過SPI總線對905進行射頻配置字設置。
* 入口參數:rfcon 配置字數組
* 出口參數:無
****************************************************************************/
void nRFconfig(uint8 * rfcon)
{
uint8 i;
uint8 data;
WaitMode(); // 空閑模式
IO0CLR = CSN; // 使能從機
data = SendData(0x00); // 發送配置命令
for(i=0;i<10;i++) // 循環數為10,保證配置正確
{
data = SendData(rfcon[i]); // 寫配置字
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:RDnRFconfig() 讀射頻配置函數 命令 10H
* 功 能:通過SPI總線從905讀出射頻配置字。
* 入口參數:tempbuf 配置字數組
* 出口參數:無
****************************************************************************/
void RDnRFconfig(uint8 * tempbuf)
{
uint8 i;
WaitMode(); // 空閑模式
IO0CLR = CSN; // 使能從機
tempbuf[0] = SendData(0x10); // 發送讀配置命令
for(i=0;i<10;i++) // 循環數固定為10,保證配置正確
{
tempbuf[i] = SendData(0xAA); // 讀配置字
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:WTxData() 寫發送數據 命令 20H
* 功 能:通過SPI總線向905寫入要發送的數據。
* 入口參數:txbuf 發送數據變量
no 數據發送數(需根據配置字設置,不能隨意更改)
* 出口參數:無
****************************************************************************/
void WTxData(uint8 * txbuf,uint8 datno)
{
uint8 i;
uint8 j;
uint8 data;
j = datno ;
if( i<1 ) j = 1 ; // 發送字節數不能少于1個
j &= 0x3f ; // 取發送字節數的后6位
if( i>32 ) j = 32; // 保證發送字節數不多于32個
IO0CLR = CSN ; // 從機使能
data = SendData(0x20); // 寫發送數據命令字
for(i=0;i<j;i++)
{
data = SendData(txbuf[i]); // 讀發送數據
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:RTxData() 讀發送數據 命令 21H
* 功 能:通過SPI總線從905讀出發送的數據。
* 入口參數:no 讀出的數據個數(需要結合配置字,不能隨意更改)
* 出口參數:無
* 說 明:讀出的數據寫入 temp變量中
****************************************************************************/
void RTxData(uint8 * tempbuf,uint8 datno)
{
uint8 i;
uint8 data;
uint8 j;
j = datno ;
if( i<1 ) j = 1 ; // 發送字節數不能少于1個
j &= 0x3f ; // 取發送字節數的后6位
if( i>32 ) j = 32; // 保證發送字節數不多于32個
IO0CLR = CSN ; // 使能從機
data = SendData(0x21); // 寫讀發送數據命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 寫發送數據
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:WTxAddr() 寫發送地址 命令 22H
* 功 能:通過SPI總線向905寫入要發送的地址。
* 入口參數:txaddr 地址變量
* 出口參數:無
****************************************************************************/
void WTxAddr(uint8 * txaddr,uint8 adrno)
{
uint8 i;
uint8 data;
uint8 j;
j = (adrno >> 4) & 0x0f ; // 讀取高4位( TX_AFW 發送地址寬度)
if(j<1) j = 1 ; // 保證地址字節數大于等于1
if(j>4) j = 4 ; // 保證地址字節數小于等于4
IO0CLR = CSN ; // 使能從機
data = SendData(0x22); // 寫發送地址命令
for(i=0;i<j;i++)
{
data = SendData(txaddr[i]); // 寫發送地址
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:RTxAddr() 讀發送地址 命令 23H
* 功 能:通過SPI總線從905讀出發送地址。
* 入口參數:tempbuf 一般數據緩沖區變量
* 出口參數:無
* 說 明:讀出的發送地址寫到 temp變量中
****************************************************************************/
void RTxAddr(uint8 * tempbuf,uint8 adrno)
{
uint8 i;
uint8 data;
uint8 j;
j = (adrno >> 4) & 0x0f ; // 讀取高4位( TX_AFW 發送地址寬度)
if(j<1) j = 1 ; // 保證地址字節數大于等于1
if(j>4) j = 4 ; // 保證地址字節數小于等于4
IO0CLR = CSN ; // 從機使能
data = SendData(0x23); // 寫讀發送地址命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 讀發送地址
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:RRxData() 讀接收數據 命令 24H
* 功 能:通過SPI總線從905讀出接收到的數據。
* 入口參數:no 讀出的數據數(需要結合配置字不能隨意更改)
tempbuf 數據讀出位置
* 出口參數:無
****************************************************************************/
void RRxData(uint8 * tempbuf,uint8 datno)
{
uint8 i;
uint8 data;
uint8 j;
j = datno ;
if( i<1 ) j = 1 ; // 發送字節數不能少于1個
j &= 0x3f ; // 取發送字節數的后6位
if( i>32 ) j = 32; // 保證發送字節數不多于32個
IO0CLR = CSN ; // 從機使能
data = SendData(0x24); // 寫讀接收數據命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 讀接收數據
}
IO0SET = CSN ; // 關閉使能
}
/****************************************************************************
* 名 稱:TxPacket()
* 功 能:發送數據包據。
* 入口參數:txaddr 發送地址變量
txbuf 發送數據緩沖區
* 出口參數:無
****************************************************************************/
void TxPacket(uint8 * txaddr,uint8 adrno,uint8 * txbuf,uint8 datno)
{
WaitMode(); // 進入等待模式,準備配置。
WTxAddr(txaddr,adrno); // 寫 發送地址
Delay(1); // 延時
WTxData(txbuf,datno); // 寫發送數據 發送個數為配置字[4]字節,即發送數據長度
Delay(1);
TxMode(); // 發射模式設置,啟動發射
while(0==(IO0PIN&RD)); // 等待RD(ready)發送完信號
WaitMode(); // 數據發送完畢,進入等待模式。
}
/****************************************************************************
* 名 稱:RxPacket()
* 功 能:接收數據包。
* 入口參數:無
* 出口參數:無
****************************************************************************/
void RxPacket(uint8 * rxbuf,uint8 datno)
{
RxMode();
while(0==(IO0PIN&RD)); // 等待接受 到 數據信號
WaitMode(); // 等待模式
RRxData(rxbuf,datno); // 接收數據 接收字節數為接收配置[3]字節
while(0!=(IO0PIN&RD)); // 等待接收 完 數據信號 必要時再加
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -