nRF905無線芯片是由挪威NORDIC公司出品的低�1GHz無線�(shù)傳芯�,主要工作于433MHz�868MHz�915MHz的ISM頻段。芯片內(nèi)置頻率合成器、功率放大器、晶體振蕩器和調(diào)制器等功能模�,輸出功率和通信頻道可通過程序進行配置。非常適合于低功�、低成本的系�(tǒng)�(shè)��
�422.4�473.5MHz工作頻段
�512個通訊頻道,滿足多點通訊、分�、跳頻等�(yīng)用需�,通道切換時間�6us
◆發(fā)射功率可�(shè)置為�10dBm�6dBm�-2dBm�-10dBm
◆通過SPI接口與MCU連接
◆支�50kbps傳輸速率
◆ShockBurst傳輸模式,自動生成前�(dǎo)碼和CRC校驗�
◆工作電壓范圍:1.9V�3.6V,待機模式下電流僅為12.5μA
◆工作溫度范圍:-40℃~+85�
nRF905采用Nordic公司的VLSI ShockBurst技�(shù)。ShockBurst技�(shù)使nRF905能夠提供高速的�(shù)�(jù)傳輸,而不需要昂貴的高速MCU來進行�(shù)�(jù)處理/時鐘覆蓋。通過將與RF�(xié)議有�(guān)的高速信號處理放到芯片內(nèi),nRF905提供給應(yīng)用的微控制器一個SPI接口,速率由微控制器自己設(shè)定的接口速度決定。nRF905通過ShockBurst工作模式在RF以速率進行連接時降低數(shù)字應(yīng)用部分的速度來降低在�(yīng)用中的平均電流消�。在ShockBurst RX模式中,地址匹配AM和數(shù)�(jù)�(zhǔn)備就緒DR信號通知MCU一個有效的地址和數(shù)�(jù)包已�(jīng)各自接收完成。在ShockBurst TX模式�,nRF905自動�(chǎn)生前�(dǎo)碼和CRC校驗碼,�(shù)�(jù)�(zhǔn)備就緒DR信號通知MCU�(shù)�(jù)傳輸已經(jīng)完成??傊?,這意味著降低MCU的存儲器需求也就是說降低MCU成本,又同時縮短軟件開發(fā)時間�
1)典型ShockBurst TX模式�
?�?、當(dāng)�(yīng)用MCU有遙控數(shù)�(jù)節(jié)點時,接收節(jié)點的地址TX-address和有效數(shù)�(jù)TX-payload通過SPI接口傳送給nRF905�(yīng)用協(xié)議或MCU�(shè)置接口速度�
?�?、MCU�(shè)置TRX_CE、TX_EN為高來激活nRF905 ShockBurst傳輸�
?�?、nRF905 ShockBurst�
l 無線系統(tǒng)自動上電
l �(shù)�(jù)包完成(加前�(dǎo)碼和CRC校驗碼)
l �(shù)�(jù)包發(fā)送(100kbps,GFSK,曼徹斯特編碼)
?、堋⑷绻鸄UTO_RETRAN被設(shè)置為高nRF905將連續(xù)地發(fā)送數(shù)�(jù)包直到TRX_CE被設(shè)置為��
�、當(dāng)TRX_CE被設(shè)置為低時,nRF905�(jié)束數(shù)�(jù)傳輸并自動進入standby模式�
2)典型ShockBurst RX模式
�、通過�(shè)置TRX_CE高,TX_EN低來選擇ShockBurst模式�
?、凇?50us以后,nRF905�(jiān)測空中的信息�
�、當(dāng)nRF905�(fā)�(xiàn)和接收頻率相同的載波時,載波檢測CD被置��
?、堋�?dāng)nRF905接收到有效的地址�,地址匹配AM被置��
?�?、當(dāng)nRF905接收到有效的�(shù)�(jù)包(CRC校驗正確)時,nRF905去掉前導(dǎo)�、地址和CRC位,�(shù)�(jù)�(zhǔn)備就緒(DR)被置高�
?�?、MCU�(shè)置TRX_CE低,進入standby模式低電流模��
�、MCU可以以合適的速率通過SPI接口讀出有效數(shù)�(jù)�
?�?、當(dāng)所有的有效�(shù)�(jù)被讀出后,nRF905將AM和DR置低�
?、帷RF905將準(zhǔn)備進入ShockBurst RX、ShockBurst TX或Powerdown模式�
3)掉電模�
在掉電模式中,nRF905被禁�,電流消耗最小,典型值低�2.5uA。當(dāng)進入這種模式�,nRF905是不活動的狀�(tài)。這時候平均電流消耗最�,電池使用壽命最�。在掉電模式�,配置字的內(nèi)容保持不變�
4)STANDBY模式
Standby模式在保持電流消耗最小的同時保證最短的ShockBurstRX、ShockBurstTX的啟動時間。當(dāng)進入這種模式�,一部分晶體振蕩器是活動的。電流消耗取決于晶體振蕩器頻�,如:當(dāng)頻率�4MHZ時,IDD=12uA;當(dāng)頻率�20MHZ 時,IDD=46uA。如果uPCLK(Pin3)被使能,電流消耗將增加。并且取決于�(fù)載電容和頻率。在此模式中,配置字的內(nèi)容保持不��
nRF905的所有配置都通過SPI接口進行。SPI接口�5個寄存器組成,一條SPI指令用來決定進行什么操�。SPI接口只有在掉電模式和Standby模式是激活的�
1)狀�(tài)寄存器(Status-Register�
寄存器包含數(shù)�(jù)就緒DR和地址匹配AM狀�(tài)�
2)RF配置寄存器(RF-Configuration Register�
寄存器包含收�(fā)器的頻率、輸出功率等配置信息�
3)發(fā)送地址(TX-Address�
寄存器包含目�(biāo)器件地址,字節(jié)長度由配置寄存器�(shè)��
4)發(fā)送有效數(shù)�(jù)(TX-Payload�
寄存器包含發(fā)送的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)長度由配置寄存器�(shè)��
5)接收有效數(shù)�(jù)(RX-Payload�
寄存器包含接收到的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)長度由配置寄存器�(shè)�。在寄存器中的有效數(shù)�(jù)由數(shù)�(jù)�(zhǔn)備就緒DR指示�
超低功耗無線收�(fā)�
無線傳感�(wǎng)�(luò)
家庭和樓宇自動化
無線報警安全系統(tǒng)
無線�(shù)�(jù)傳輸系統(tǒng)
報警及安全系�(tǒng)
家庭自動�
遙感�(jiān)�
無線門禁系�(tǒng)
無線鼠標(biāo)
遙控開鎖
遙控玩具
�(fā)送部�
/****************************
//寫發(fā)射數(shù)�(jù)命令:20H
//讀�(fā)射數(shù)�(jù)命令:21H
//寫發(fā)射地址命令:22H
//讀�(fā)射地址命令:23H //讀接收�(shù)�(jù)命令:24H
******************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit TXEN = P2^7; //配置口定�5`6`7//
sbit TRX_CE = P2^6;
sbit PWR = P2^5;
sbit MISO = P2^2; //SPI口定�0`1`2`3//
sbit MOSI = P2^3;
sbit SCK = P2^1;
sbit CSN = P2^0;
sbit DR = P2^4; //狀�(tài)輸出�4//
sbit led=P1^0;
/************//*RF寄存器配�*//*************
// 0x00, //配置命令//
// 0x6C, //CH_NO,配置頻段�433.2MHZ
// 0x0E, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
// 0x44, //地址寬度�(shè)置,�4字節(jié)
// 0x03,0x03, //接收�(fā)送有效數(shù)�(jù)長度�3字節(jié)
// 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校驗,外部時鐘信號使��16M晶振//UP_CLK輸出1MHZ頻率
// 0xDE, //CRC充許
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置頻段�423MHZ
0x0C, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
0x44, //地址寬度�(shè)�,為4字節(jié)
0x02,0x02, //接收�(fā)送有效數(shù)�(jù)長度�32字節(jié)
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充許�8位CRC校驗,外部時鐘信號不使能�16M晶振
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(uchar date) //用SPI口寫�(shù)�(jù)至NRF905�(nèi)//
{
uchar i;
for(i=0;i<8;i++)
{
delay(1);
SCK=0;
MOSI=(date&0x80);
date<<=1 ;
delay(1);
SCK=1;
delay(1);
SCK=0;
}
SCK=0;
}
void TxPacket(void)
{
// TXEN=1;
CSN=0;
SpiWrite(0x22); //寫發(fā)送地址,后面�4字節(jié)地址//
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
CSN=1;
delay(1);
CSN=0;
SpiWrite(0x20); //寫發(fā)送數(shù)�(jù)命令,后面跟三字節(jié)�(shù)�(jù)//
SpiWrite(0x01);
SpiWrite(0x02);
// SpiWrite(0x04);
CSN=1;
delay(1);
TRX_CE=1;
TXEN=1; //CE,EN同時�1,為發(fā)送模�
delay(1); //等待�(fā)送完�//
led=~led;
// while(!DR); //在非屏蔽狀�(tài)�,只能發(fā)射一�
TRX_CE=0;
//led=~led; //加上led后,對接收產(chǎn)生了一定的影響�
//while(!DR); //有時多接收一次的�(shù)�(jù)
}
void Ini_System(void)
{ //初始化配置寄存器//
uchar i;
// delay(1);
CSN=1;
SCK=0;
DR=0;
PWR=1; //進入掉電模式
TRX_CE=0;
TXEN=0;
delay(1);
CSN=0; //進入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //�(shè)置配置寄存器
}
CSN=1; //�(guān)閉SPI,進入�(fā)射狀�(tài)
// PWR=1;
}
void main(void)
{
led=1;
Ini_System(); //�(shè)置配�,并進入�(fā)射模�
// PWR=1; //進入掉電模式
while(1)
{
TxPacket(); //�(fā)送數(shù)�(jù)
led=~led;
DR=0;
}
}
接收部分
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit lcdbit;
sbit TXEN = P2^7; //配置口定�7`6`5//
sbit TRX_CE = P2^6;
sbit PWR = P2^5;
sbit MISO = P2^2; //SPI口定�0`1`2`3//
sbit MOSI = P2^3;
sbit SCK = P2^1;
sbit CSN = P2^0;
sbit DR = P2^4; //狀�(tài)輸出�4//
sbit led=P1^0;
/************//*RF寄存器配�*//*************
// 0x00, //配置命令//
// 0x6C, //CH_NO,配置頻段�433.2MHZ
// 0x0E, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
// 0x44, //地址寬度�(shè)置,�4字節(jié)
// 0x03,0x03, //接收�(fā)送有效數(shù)�(jù)長度�3字節(jié)
// 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校驗,外部時鐘信號使��16M晶振//UP_CLK輸出1MHZ頻率
// 0xDE, //CRC充許
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]={ //配置命令//
0x00,0x4c,0x0c,0x44,0x02,0x02,
0xcc,0xcc,0xcc,0xcc,0x58 //CRC充許�8位CRC校驗,外部時鐘信號不使能�16M晶振
};
uchar TxRxBuffer[2];
uchar date;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(unsigned char date) //用SPI口寫�(shù)�(jù)至NRF905�(nèi)//
{
uchar i;
for(i=0;i<8;i++)
{
delay(1);
SCK=0;
MOSI=(date&0x80);
date<<=1 ;
delay(1);
SCK=1;
delay(1);
SCK=0;
}
SCK=0;
}
unsigned char SpiRead(void) //from 905 read data//
{
uchar i;
for(i=0;i<8;i++)
{
date<<=1 ;
SCK=0;
delay(1);
date|=MISO;
SCK=1 ;
delay(1);
}
SCK=0;
return(date);
}
void RxPacket(void) //接收�(shù)�(jù)�//
{
uchar i;
//while(DR)
for (i = 0 ;i < 2 ;i++)
{
//led=~led;
TxRxBuffer[i] = SpiRead();
//i++;
}
}
void Wait_Rec_Packet(void) //等待接收�(shù)�(jù)�//
{
// uchar temp;
// PWR=1;
TXEN=0; //接收模式
TRX_CE=1;
delay(2);
while(!DR)
{ delay(10);
// if(DR) //�(shù)�(jù)接收成功
{
led=~led;
TRX_CE=0; //如果�(shù)�(jù)�(zhǔn)備好,則進入待機模式,以便SPI口操�
CSN=0;
delay(1);
SpiWrite(0x24); //讀nRF905所接受到的�(shù)�(jù)
RxPacket(); //保存�(shù)�(jù)
CSN=1;
delay(10);
TRX_CE=1;
/*temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
if(temp==0x07)
{
lcdbit=!lcdbit; //lcdbit=0
}*/
break;
}
}
}
void Ini_System(void) //初始化配置寄存器//
{
uchar i;
//lcdbit=1;
CSN=1;
SCK=0;
DR=0;
PWR=1; //進入掉電模式
TRX_CE=0;
TXEN=0;
delay(1);
CSN=0; //進入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //�(shè)置配置寄存器
}
CSN=1; //�(guān)閉SPI,進入接收狀�(tài)
PWR=1;
//TRX_CE=1;
//TXEN=0;
}
void main(void)
{
P0=0x00;
led=1;
Ini_System(); //�(shè)置配�,并進入接收模式 (收�
PWR=1; //進入掉電模式
while(1)
{
Wait_Rec_Packet(); //等待接收完成,保存完接收數(shù)�(jù)(保存數(shù)�(jù)+地址�
//CSN=0;
P0 = TxRxBuffer[0];
delay(600);
P0 = TxRxBuffer[1];
delay(600);
P0 = TxRxBuffer[2];
delay(600);
//CSN=1;
}
}
程序�(jīng)本人測試后沒太大問題,如要深入研�,本人附加詳�(xì)資料,希望對您有所幫助�
1�、模式控制接口:
該接口由 PWR 、TRX_CE、TX_EN組成控制由nRF905組成的高頻頭的四種工作模式:掉電� SPI編程模式;待機和SPI編程模式 ;發(fā)射模�;接收模��
2�、SPI接口�
SPI 接口� CSN、SCK、MOSI以及MISO組成。在配置模式下單片機通過SPI接口配置高頻頭的工作參數(shù);在�(fā)�/接收模式下單片機SPI接口�(fā)送和接收�(shù)�(jù)�
3�、狀�(tài)輸出接口�
提供載波檢測輸出CD,地址匹配輸出AM,數(shù)�(jù)就緒輸出DR�
1�、晶體規(guī)�
為了實現(xiàn)晶體振蕩器低功耗和快速啟動時間的解決方案,推薦使用低值晶體負(fù)載電�。指定CL=12pF是可以接受的。但�,也可能增大�16pF。指定一個晶體并行相等電�,Co=1.5pF也是很好�,但這樣一來會增加晶體自身成本。典型的�(shè)定晶體電容Co=1.5pF,指定Co_max=7.0pF�
2�、外部參考時�
一個外部參考時鐘如MCU時鐘,可以用來代替晶體震蕩器。這個時鐘信號應(yīng)該直接連接到XC1引腳,XC2引腳為高阻態(tài)。當(dāng)使用外部時鐘代替晶體時鐘工作時,始終必須工作在Standby模式以降低電流消耗。如果器件被�(shè)置成Standby模式而沒有使用外部時鐘或晶體時鐘,則電流消耗可�1mA�
3�、微處理器輸出時�
在默�(rèn)情況�,微處理器提供輸出時�。在Standby模式下提供輸出時鐘將增加電流消耗。在Standby模式電流消耗取決于頻率和外部晶體負(fù)�、輸出時鐘的頻率和提供輸出時鐘的電容�(fù)��
4)、天線輸�
ANT1和ANT2輸出腳給天線提供�(wěn)定的RF輸出。這兩個腳必須有連接到VDD_PA的直流通路,通過RF扼流�,或者通過天線雙極的中心點。在ANT1和ANT2之間的負(fù)載阻抗應(yīng)該在200-700Ω范圍�(nèi),通過簡單的匹配網(wǎng)�(luò)或RF變壓器(不平衡變壓器)可以獲得較低的阻抗(例�50Ω��
基于nRF905 模塊的AT89S 單片機無線收�(fā)系統(tǒng)�(shè)�
管腳 名稱 管腳功能 說明
1 VCC 電源 電源+3.3�3.6V DC
2 TX_EN �(shù)字輸� 工作模式選擇
3 TRX_CE �(shù)字輸� 使能芯片�(fā)射或接收
4 PWR_UP �(shù)字輸� 芯片上電
5 uCLK 時鐘輸出 (未使�)
6 CD �(shù)字輸� 載波檢測
7 AM �(shù)字輸� 地址匹配
8 DR �(shù)字輸� 接收或發(fā)射數(shù)�(jù)完成
9 MISO SPI 接口 SPI 輸出
10 MOSI SPI 接口 SPI 輸入
11 SCK SPI 時鐘 SPI 時鐘
12 CSN SPI 使能 SPI 使能
13�14 GND � 接地
下面為典型的 nRF905 模塊�(shù)�(jù)�(fā)送流程[3]�
?�?)當(dāng)微控制器要發(fā)送數(shù)�(jù)時,將接收機的地址和發(fā)
送數(shù)�(jù)通過SPI 接口傳輸給nRF905 模塊�
�2)微控制器設(shè)置TRX_CE 和TX_EN 管腳同時置為
高電�,啟動發(fā)送端的nRF905 模塊為發(fā)送模式;
?�?)發(fā)送端的nRF905 模塊�(fā)送過程處理:
a)射頻寄存器開啟�
b)數(shù)�(jù)打包(加字頭和CRC 校驗碼)�
c)數(shù)�(jù)包發(fā)��
d)當(dāng)�(shù)�(jù)包發(fā)送結(jié)�,將�(shù)�(jù)�(fā)送完成管腳(DR 管腳�
置為高電��
?�?)如果AUTO_RETRAN 被設(shè)置為�,nRF905 模塊
將連續(xù)地發(fā)送數(shù)�(jù)�,直到TRX_CE 被設(shè)置為��
?�?)TRX_CE 被設(shè)置為低時,nRF905 模塊�(shù)�(jù)包發(fā)�
過程�(jié)束并回到待機模式�
AT89S單片機控制nRF905 模塊�(shù)�(jù)�(fā)送流程圖如圖3
所��
下面為典型的 nRF905 模塊�(shù)�(jù)接收流程[4]�
?�?)微控制器控制TRX_CE 為高電平、TX_EN 為低�
�,nRF905 模塊進入接收模式�
?�?�650us �,nRF905 模塊�(jiān)測空中的信息,等待接
收數(shù)�(jù)�
?�?)當(dāng)nRF905 模塊檢測到與接收頻率相同的載波時�
�(shè)置載波檢測管腳(CD 管腳)為高電平;
?�?)當(dāng)nRF905 模塊接收到有效的地址�,設(shè)置地址�
配管腳(AM 管腳)為高電��
?�?)當(dāng)一個正確的�(shù)�(jù)包接收完畢后,nRF905 模塊�
動去掉數(shù)�(jù)包的字頭、地址和CRC 校驗碼,然后將數(shù)�(jù)�
受完成管腳置為高電平�
?�?)微控制器將TRX_CE �(shè)置為低電��
?�?)微控制器通過SPI 接口以一定的速率提取�(shù)�(jù)�
中的有效接收�(shù)�(jù)�
?�?)當(dāng)所有的有效�(shù)�(jù)接收完畢,微控制器控制nRF905
模塊�(shù)�(jù)接收完成管腳(DR 管腳)和地址匹配管腳(AM
管腳)為低電��
�9)nRF905 進入待機模式�
說明:(1)VCC電壓范圍為DC 3.3V�3.6V之間,不能超�3.6V否則會燒壞模��
�2)模�
附加更加詳細(xì)的收�(fā)程序,包括解釋:
////////////////////////////////////////////整體參數(shù)////////////////////////////////////////////////////
//NewMsg-RF905-共有四種工作模式,其中有兩種活動RX/TX模式和兩種節(jié)電模式�
//活動模式
// ShockBurst RX
//ShockBurst TX
//節(jié)電模�
//掉電和SPI編程
//工作模式�